在实时系统中使用sklearn的DictVectorizer

任何二进制的一热编码都只能识别训练过程中见过的值,因此在拟合过程中未遇到的特征会被悄无声息地忽略。对于实时系统来说,每秒处理数百万条记录,且特征具有非常高的基数,你需要不断更新你的哈希器/映射器以适应数据。

我们如何对哈希器进行增量更新(而不是每次遇到新的特征-值对时都重新计算整个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为你做的工作。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注