编程语言
首页 > 编程语言> > python – 为什么我的scikit学习HashingVectorizo​​r给我带有binary = True set的浮点数?

python – 为什么我的scikit学习HashingVectorizo​​r给我带有binary = True set的浮点数?

作者:互联网

我正在尝试使用scikit-learn的伯努利朴素贝叶斯分类器.我使用CountVectorizo​​r让分类器在一个小数据集上正常工作,但是当我尝试使用HashingVectorizo​​r处理更大的数据集时遇到了麻烦.保持所有其他参数(培训文档,测试文档,分类器和特征提取器设置)不变,只需从CountVectorizo​​r切换到HashingVectorizo​​r,导致我的分类器始终为所有文档吐出相同的标签.

我编写了以下脚本来研究两个特征提取器之间的区别:

from sklearn.feature_extraction.text import HashingVectorizer, CountVectorizer

cv = CountVectorizer(binary=True, decode_error='ignore')
h = HashingVectorizer(binary=True, decode_error='ignore')

with open('moby_dick.txt') as fp:
    doc = fp.read()

cv_result = cv.fit_transform([doc])
h_result = h.transform([doc])

print cv_result
print repr(cv_result)
print h_result
print repr(h_result)

(其中’moby_dick.txt’是项目gutenberg的mo​​by dick副本)

(简明)结果:

  (0, 17319)    1
  (0, 17320)    1
  (0, 17321)    1
<1x17322 sparse matrix of type '<type 'numpy.int64'>'
    with 17322 stored elements in Compressed Sparse Column format>

  (0, 1048456)  0.00763203138591
  (0, 1048503)  0.00763203138591
  (0, 1048519)  0.00763203138591
<1x1048576 sparse matrix of type '<type 'numpy.float64'>'
    with 17168 stored elements in Compressed Sparse Row format>

正如您所看到的,CountVectorizo​​r在二进制模式下为每个特征的值返回整数1(我们只希望看到1,因为只有一个文档);另一方面,HashVectorizo​​r返回浮点数(全部相同,但不同的文档产生不同的值).我怀疑我的问题源于将这些花车传递到伯努利NB上.

理想情况下,我希望从CountVectorizo​​r获得与HashingVectorizo​​r相同的二进制格式数据;如果没有这个,我可以使用BernoulliNB binarize参数,如果我知道为这个数据设置一个合理的阈值,但我不清楚这些浮点数代表什么(它们显然不是令牌数,因为它们都是相同而且更少比1).

任何帮助,将不胜感激.

解决方法:

在默认设置下,HashingVectorizer将特征向量标准化为单位欧几里德长度:

>>> text = "foo bar baz quux bla"
>>> X = HashingVectorizer(n_features=8).transform([text])
>>> X.toarray()
array([[-0.57735027,  0.        ,  0.        ,  0.        ,  0.57735027,
         0.        , -0.57735027,  0.        ]])
>>> scipy.linalg.norm(np.abs(X.toarray()))
1.0

设置二进制= True仅推迟此标准化,直到对特征进行二值化,即将所有非零值设置为1.您还必须设置norm = None才能将其关闭:

>>> X = HashingVectorizer(n_features=8, binary=True).transform([text])
>>> X.toarray()
array([[ 0.5,  0. ,  0. ,  0. ,  0.5,  0.5,  0.5,  0. ]])
>>> scipy.linalg.norm(X.toarray())
1.0
>>> X = HashingVectorizer(n_features=8, binary=True, norm=None).transform([text])
>>> X.toarray()
array([[ 1.,  0.,  0.,  0.,  1.,  1.,  1.,  0.]])

这也是它返回浮点数组的原因:规范化需要它们.虽然矢量化器可以被装配以返回另一个dtype,但这需要在transform方法中进行转换,并且可能需要在下一个估算器中进行浮动.

标签:feature-extraction,python,scikit-learn
来源: https://codeday.me/bug/20190831/1772614.html