我希望输出稀疏矩阵中的所有值FeatureHasher
都是非负的,因为我认为它应该只计算术语频率并在散列函数的帮助下对术语进行索引。当发生碰撞时,我希望它只是将“碰撞项”的频率相加。但是,似乎我错了,因为它实际上输出了一堆负值,给定一个字典列表,其中术语作为键,术语频率作为值。
负值在这里到底意味着什么?
我希望输出稀疏矩阵中的所有值FeatureHasher
都是非负的,因为我认为它应该只计算术语频率并在散列函数的帮助下对术语进行索引。当发生碰撞时,我希望它只是将“碰撞项”的频率相加。但是,似乎我错了,因为它实际上输出了一堆负值,给定一个字典列表,其中术语作为键,术语频率作为值。
负值在这里到底意味着什么?
如果输入值都是正值(词频),那么负值实际上没有任何意义。引用scikit-learn 文档:
由于散列函数可能会导致(不相关的)特征之间发生冲突,因此使用带符号的散列函数,并且散列值的符号决定了存储在特征输出矩阵中的值的符号。这样,碰撞可能会抵消而不是累积错误,并且任何输出特征值的预期均值为零。
维基百科有一个小表格显示这个方案的效果,它是由Weinberger 等人发明的。. 它不仅减轻了碰撞的影响,而且使你的特征表现得更像高斯,这有助于一些学习算法。
如果您想摆脱负值,请传递non_negative=True
给FeatureHasher
构造函数。该选项的实现有点小技巧,但它使 tf-idf 和朴素贝叶斯再次起作用。