在实时系统中使用 sklearn DictVectorizer
Using sklearn DictVectorizer in real-time systems
任何二进制 one-hot 编码都只知道在训练中看到的值,因此在拟合期间未遇到的特征将被默默地忽略。对于实时,每秒有数百万条记录,并且特征具有非常高的基数,您需要使用数据更新 hasher/mapper。
我们如何对哈希器进行增量更新(而不是每次遇到新的特征值对时都计算整个 fit() )?这里建议的方法是什么来解决这个问题?
这取决于您使用的学习算法。如果您使用的方法已指定用于稀疏数据集(FTRL、FFM、线性 SVM),一种可能的方法如下(请注意,它会在特征和大量常量列中引入冲突)。
首先为样本的每个元素分配一个(尽可能大的)向量 V,长度为 D。
对于每个分类变量,评估 hash(var_name + "_" + var_value) % D
。这给你一个整数 i
,你可以存储 V[i] = 1
.
因此,V 永远不会随着新特征的出现而变大。但是,一旦特征数量足够多,一些特征就会发生冲突(即写在同一个地方),这可能会导致错误率增加...
编辑。您可以编写自己的矢量化器以避免冲突。首先调用 L 当前的特征数。准备长度为 2L 的相同向量 V(这 2 将允许您在新功能到达时避免冲突 - 至少在一段时间内,具体取决于新功能的到达率)。
从空值开始 dictionary<input_type,int>
,为每个特征关联一个整数。如果已经看过该特征,则return该特征对应的int。如果不是,则使用与新索引相对应的整数创建一个新条目。我认为(但我不确定)这就是 LabelEncoder 为您所做的。
任何二进制 one-hot 编码都只知道在训练中看到的值,因此在拟合期间未遇到的特征将被默默地忽略。对于实时,每秒有数百万条记录,并且特征具有非常高的基数,您需要使用数据更新 hasher/mapper。
我们如何对哈希器进行增量更新(而不是每次遇到新的特征值对时都计算整个 fit() )?这里建议的方法是什么来解决这个问题?
这取决于您使用的学习算法。如果您使用的方法已指定用于稀疏数据集(FTRL、FFM、线性 SVM),一种可能的方法如下(请注意,它会在特征和大量常量列中引入冲突)。
首先为样本的每个元素分配一个(尽可能大的)向量 V,长度为 D。
对于每个分类变量,评估 hash(var_name + "_" + var_value) % D
。这给你一个整数 i
,你可以存储 V[i] = 1
.
因此,V 永远不会随着新特征的出现而变大。但是,一旦特征数量足够多,一些特征就会发生冲突(即写在同一个地方),这可能会导致错误率增加...
编辑。您可以编写自己的矢量化器以避免冲突。首先调用 L 当前的特征数。准备长度为 2L 的相同向量 V(这 2 将允许您在新功能到达时避免冲突 - 至少在一段时间内,具体取决于新功能的到达率)。
从空值开始 dictionary<input_type,int>
,为每个特征关联一个整数。如果已经看过该特征,则return该特征对应的int。如果不是,则使用与新索引相对应的整数创建一个新条目。我认为(但我不确定)这就是 LabelEncoder 为您所做的。