Svenstrup et. al. 2017提出了一种有趣的方法来处理散列矢量化器中的散列冲突:使用2种不同的散列函数,并在建模之前将其结果串联起来。
他们声称,多个散列函数的组合近似于一个具有更大范围的散列函数(请参见本文的第4节)。
我想用sklearn中处理的一些文本数据进行尝试。这个想法是将HashingVectorizer运行两次,每次使用不同的哈希函数,然后将结果连接起来作为模型输入。
我如何使用sklearn?无法更改使用的哈希函数,但是也许可以以某种方式修改矢量化器?
或者也许我可以通过SparseRandomProjection实现这一目标?
答案 0 :(得分:2)
HashingVectorizer已包含使用alternate_sign=True
选项减轻哈希冲突的机制。这会在令牌求和期间添加一个随机符号,从而改善了哈希空间中距离的保留(有关更多详细信息,请参见scikit-learn#7513)。
通过使用N
哈希函数并连接输出,将使所得稀疏矩阵中的n_features
和非空项(nnz
)的数量增加{{1} }。换句话说,每个令牌现在将表示为N个元素。这是非常浪费的存储方式。此外,由于稀疏数组计算的运行时间直接取决于N
(nnz
较少),这与仅增加n_features
相比,对性能的负面影响要大得多。我不确定这种方法在实践中是否非常有用。
但是,如果您仍想实现这样的矢量化程序,请注意以下几点。
n_features
是在Cython中实现的,因此如果不编辑/重新编译代码,很难通过Python修改其功能。