scikit-learnのFeatureHashingの実装をメモしておく。

  • feature_extraction/_hashing.pyx
  • n_featuresがfeature vectorの次元数になる
  • featureをハッシュ化してmod n_featuresすることでfeature vectorのインデックスの位置を決定する
    • featureのvalueが文字列のとき、key=valueをハッシュ化して、mod n_features番目のインデックスに1を入れる
    • featureのvalueが数値のとき、keyをハッシュ化して、mod n_features番目のインデックスにvalueをいれる
    • 入れるvalueはハッシュ値の正負を反映する(alternate_sign=Trueのとき)
    • なお、mod n_featuresするときはハッシュ値は絶対値にする
>>> from sklearn.feature_extraction import FeatureHasher
>>> n_features = 10
>>> h = FeatureHasher(n_features=n_features)
>>> D = [{"id": 9, "category": "8"},{"id": 10, "category": "7"}]
>>> f = h.transform(D)
>>> f.toarray()
array([[  0.,   0.,   0.,   0.,   0.,   1.,   0.,  -9.,   0.,   0.],
       [  0.,   0.,   0.,  -1.,   0.,   0.,   0., -10.,   0.,   0.]])
>>> import mmh3
# 7番目のインデックスに負の符号をつけたvalueを入れる
>>> mmh3.hash("id")
-1737061407
>>> abs(mmh3.hash("id")) % n_features
7
# 5番目のインデックスに1を入れる
>>> mmh3.hash("category=8")
1453528385
>>> abs(mmh3.hash("category=8")) % n_features
5
# 3番目のインデックスに-1を入れる
>>> mmh3.hash("category=7")
-647926533
>>> abs(mmh3.hash("category=7")) % n_features
3