sklearn FeatureHasher中的哈希技巧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sklearn FeatureHasher中的哈希技巧相关的知识,希望对你有一定的参考价值。
想要了解“哈希技巧”,我编写了以下测试代码:
import pandas as pd
from sklearn.feature_extraction import FeatureHasher
test = pd.DataFrame('type': ['a', 'b', 'c', 'd', 'e','f','g','h'])
h = FeatureHasher(n_features=4, input_type='string')
f = h.transform(test.type)
print(f.toarray())
在上面的示例中,我将8个类别映射到4列中,输出为:
[[ 0. 0. 1. 0.]<-a
[ 0. -1. 0. 0.]<-b
[ 0. -1. 0. 0.]<-c
[ 0. 0. 0. 1.]<-d
[ 0. 0. 0. 1.]<-e
[ 0. 0. 0. 1.]<-f
[ 0. 0. -1. 0.]<-g
[ 0. -1. 0. 0.]]<-g
在结果矩阵中,我可以看到重复,并且某些类别以相同的方式表示。这是为什么?如果使用二进制表示形式,则8个类别可以映射为4列。
有人可以解释一下这种技术的输出,也许可以详细说明吗?
答案
A FeatureHasher
将导致不希望的结果,如果将FeatureHasher
设置为如此低的值。这样做的原因是它将类别映射到列索引的方式。
例如,与n_features
相对,在每个类别中,仅按出现的顺序为其分配与列对应的唯一整数索引,CountVectorizer
将对特征使用哈希函数以确定列每个类别的索引。因此,它的主要优点是增加的速度。但是,通过将FeatureHasher
限制为如此低的值,散列给定类别的结果可能会导致索引higher比集合n_features
大,因此,您得到的是< [截断特征向量。
我们实际上可以通过复制哈希的完成方式来检查
n_features
使用_hashing_fast
生成哈希:_hashing_fast
如您所见,为murmurhash3_bytes_s32
和murmurhash3_bytes_s32
精确地产生较大的散列值,这些值被截断为与from sklearn.utils.murmurhash import murmurhash3_bytes_s32 raw_X = test['type'] raw_X = iter(raw_X) raw_X = (((f, 1) for f in x) for x in raw_X) for x in raw_X: for f, v in x: f = f'f=v' fb = (f).encode("utf-8") h = murmurhash3_bytes_s32(fb, seed=0) print(f'f[0] -> h')
相对应的较低散列:
e
以上是关于sklearn FeatureHasher中的哈希技巧的主要内容,如果未能解决你的问题,请参考以下文章
特征抽取: sklearn.feature_extraction.FeatureHasher
sklearn使用FeatureHasher处理字符串特征: AttributeError: ‘str‘ object has no attribute ‘items‘