A FeatureHasher
приведет к нежелательным результатам, если вы установите n_features
на такое низкое значение. Причиной этого является то, как он отображает категории в индексах столбцов.
В отличие от CountVectorizer
, например, когда каждой категории присваивается уникальный целочисленный индекс, соответствующий столбцу только в порядке появления, FeatureHasher
будет применять функцию га sh к функциям для определения индекса столбца каждой категории. Следовательно, его главное преимущество - увеличенная скорость . Однако, ограничив n_features
таким низким значением, вполне вероятно, что результат хеширования данной категории приведет к тому, что индекс будет выше , чем набор n_features
, и, следовательно, вы получите усеченный векторный элемент.
Мы можем фактически проверить это, воспроизведя, как выполняется хеширование в _hashing_fast
, который использует 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}')
Что, как вы можете видеть, дает большие значения ha sh точно для e
и f
, которые усекаются до нижнего значения ha sh, соответствующего до d
:
a -> -424864564
b -> -992685778
c -> -1984769100
d -> 728527081
e -> 2077529484
f -> 2074045163
g -> -1877798433
h -> -51608576