我期望FeatureHasher
的输出稀疏矩阵中的所有值都是非负的,因为我认为它应该只计算术语频率并借助散列函数索引术语。当碰撞发生时,我希望它只是加起来“碰撞的术语”的频率。然而,似乎我错了,因为它实际上输出了一堆负值,给出了一个字典列表,其中术语为键,术语频率为值。
负值究竟是什么意思?
答案 0 :(得分:3)
如果输入值都是正值(术语频率),那么负值实际上并不意味着什么。引用scikit-learn docs:
由于散列函数可能导致(不相关)特征之间的冲突,因此使用带符号的散列函数,并且散列值的符号确定存储在特征的输出矩阵中的值的符号。这样,碰撞可能会抵消而不是累积误差,并且任何输出要素值的预期平均值为零。
维基百科有little table显示该方案的效果,该方案由Weinberger et al.发明。它不仅减轻了碰撞的影响,而且使你的特征表现得更像高斯,这有助于一些学习算法。
如果要删除负值,请将non_negative=True
传递给FeatureHasher
构造函数。该选项的实现有点像黑客攻击,但它使tf-idf和朴素贝叶斯再次工作。