使用Sklearn的功能hasher

时间:2016-01-30 01:36:16

标签: python hash machine-learning scikit-learn

我正在尝试训练二元分类器

我的训练数据由图表中的路径组成,每个节点都有一个名称。

例如,这可能是我的训练数据中的内容:

[" thing_a"," cats_are_cool"," blah"]可能属于0级。

订单很重要。所以[" node_a"," node_b"," node_c"]!= [" node_c"," node_b", " NODE_A"]

由于我的路径长度不同,我认为我需要哈希训练数据,因为用零填充较短的路径听起来很危险。我想使用sci kit学习功能哈希。在以下示例中,测试变量由三个路径组成:

h = FeatureHasher(n_features=2**20,non_negative=True,input_type = 'string')
test = [["unit_a","unit_b","unit_c"],["unit_c","unit_d","unit_c"],["unit_f","unit_aa"]]
X_new = h.transform(test)
print X_new.nonzero()

给了我:

(array([0, 0, 0, 1, 1, 2, 2], dtype=int32), array([ 211168,  221554,  875718,  211168, 1009892,  765479,  838855], dtype=int32))

我认为theher正在制作" unit_a" = 211168," unit_b" = 221554,......等但这不是我想要的。我希望第一个路径有一个数字,第二个路径有一个数字等。我能做些什么来实现这个目标?

再次,路径中的项目顺序很重要。

1 个答案:

答案 0 :(得分:1)

您需要重塑test

In [608]:
from sklearn.feature_extraction import FeatureHasher
h = FeatureHasher(n_features=2**20,non_negative=True,input_type = 'string')
test = [["unit_a","unit_b","unit_c"],["unit_c","unit_d","unit_c"],["unit_f","unit_aa"]]
test = [[','.join(x) for x in test]] # join and reshape
X_new = h.transform(test)
test,X_new.nonzero()

Out[608]:
([['unit_a,unit_b,unit_c', 'unit_c,unit_d,unit_c', 'unit_f,unit_aa']],
 (array([0, 0, 0], dtype=int32), array([231648, 410028, 497899], dtype=int32)))

我建议你保持简单,但是:

In [610]:
test = [["unit_a","unit_b","unit_c"],["unit_c","unit_d","unit_c"],["unit_f","unit_aa"]]
test_hash = [hash(tuple(x))%2**20 for x in test]
test_hash

Out[610]:
[736062, 345078, 521256]