python – 为什么我的scikit学习HashingVectorizor给我带有binary = True set的浮点数?
作者:互联网
我正在尝试使用scikit-learn的伯努利朴素贝叶斯分类器.我使用CountVectorizor让分类器在一个小数据集上正常工作,但是当我尝试使用HashingVectorizor处理更大的数据集时遇到了麻烦.保持所有其他参数(培训文档,测试文档,分类器和特征提取器设置)不变,只需从CountVectorizor切换到HashingVectorizor,导致我的分类器始终为所有文档吐出相同的标签.
我编写了以下脚本来研究两个特征提取器之间的区别:
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的moby 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>
正如您所看到的,CountVectorizor在二进制模式下为每个特征的值返回整数1(我们只希望看到1,因为只有一个文档);另一方面,HashVectorizor返回浮点数(全部相同,但不同的文档产生不同的值).我怀疑我的问题源于将这些花车传递到伯努利NB上.
理想情况下,我希望从CountVectorizor获得与HashingVectorizor相同的二进制格式数据;如果没有这个,我可以使用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