在实时系统中使用sklearn DictVectorizer

时间:2015-12-28 07:14:52

标签: machine-learning categorical-data python scikit-learn

任何二进制单热编码只能识别训练中看到的值,因此在安装过程中未遇到的功能将被忽略。对于实时,您在一秒钟内拥有数百万条记录,并且功能具有非常高的基数,您需要使用数据更新您的哈希/映射器。

我们如何对hasher进行增量更新(而不是每次我们处理新的特征值对时计算整个fit())?在这里解决这个问题的建议方法是什么?

1 个答案:

答案 0 :(得分:1)

这取决于您使用的学习算法。如果您使用的是为稀疏数据集(FTRL,FFM,线性SVM)指定的方法,则可能的方法如下(请注意,它将在要素和大量常量列中引入冲突)。

首先为样本的每个元素分配一个(尽可能大)矢量V,长度为D.

对于每个分类变量,请评估hash(var_name + "_" + var_value) % D。这会为您提供一个整数i,您可以存储V[i] = 1

因此,随着新功能的出现,V永远不会变大。但是,只要特征数量足够大,某些特征就会发生碰撞(即写在同一个地方),这可能会导致错误率增加......

修改即可。您可以编写自己的矢量化器以避免冲突。首先调用L当前的功能数量。准备长度为2L的相同矢量V(这个2将允许您在新功能到达时避免碰撞 - 至少在一段时间内,取决于新功能的到达率。)

从emty dictionary<input_type,int>开始,将每个要素与整数相关联。如果已经看过该功能,则返回与该功能对应的int。如果不是,请创建一个新条目,其中包含与新索引对应的整数。我想(但我不确定)这就是LabelEncoder为你做的事情。