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_s32murmurhash3_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‘

FeatureHasher使用方法详解

FeatureHasher使用方法详解

了解 FeatureHasher、碰撞和向量大小的权衡

sklearn工具-数据集变换