2015-12-28 41 views
1

任何二进制单热编码只知道在训练中看到的值,所以在拟合过程中未遇到的特征将被忽略。对于实时,每秒有数百万条记录的地方,功能的基数很高,您需要使用数据更新您的hasher/mapper。在实时系统中使用sklearn DictVectorizer

我们如何对散列函数进行增量更新(而不是每次创建新的特征值对时计算整个fit())?这里建议的方法是什么?

回答

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为您做的。

+0

我的确在使用FTRL和FM算法:)并且确实一直在尝试这种诀窍,但由于我的一些功能具有较高的基数,我想通过使用DictVectorizer()来避免散列冲突。 – Serendipity