任何二进制的一热编码都只能识别训练过程中见过的值,因此在拟合过程中未遇到的特征会被悄无声息地忽略。对于实时系统来说,每秒处理数百万条记录,且特征具有非常高的基数,你需要不断更新你的哈希器/映射器以适应数据。
我们如何对哈希器进行增量更新(而不是每次遇到新的特征-值对时都重新计算整个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>
开始,为每个特征关联一个整数。如果已经见过该特征,返回与该特征对应的整数。如果没有,则创建一个新条目,并用一个对应于新索引的整数。 我认为(但我不确定)这就是LabelEncoder为你做的工作。