DictVectorizer - 功能顺序是否始终保证输出?

时间:2015-06-05 08:30:12

标签: python-2.7 dictionary scikit-learn

我正在使用DictVectorizer转换类似于example code的功能:

from sklearn.feature_extraction import DictVectorizer
v = DictVectorizer(sparse=False)
D = [{'foo': 1, 'bar': 2}, {'foo': 3, 'baz': 1}]
X = v.fit_transform(D)
X
array([[ 2.,  0.,  1.],
       [ 0.,  1.,  3.]])

我的问题是,如果我反复运行此代码,订单是否有保证?即'bar'总是出现在第一列,'baz'第二列和'foo'第三列

如果订单无法保证,您知道强制执行此选项吗?这很重要,因为要传递到以此格式训练的模型中的新的未见数据显然需要在相同列中出现的特征。也许可以使用DictVectorizer的'vocabulary_'属性来完成某些事情。

干杯,

史蒂芬

1 个答案:

答案 0 :(得分:2)

如果以正确的方式使用fittransform方法,则没有问题。首先,将DictVectorizer与数据拟合,然后将数据集转换为稀疏矩阵。这是通过您调用的fit_transform()方法完成的。如果您有新的,看不见的数据,则可以使用transform()方法对其进行转换。这会将新数据投影到与以前相同的数据结构中。

您已链接到的示例代码说明了这一点:

>>> from sklearn.feature_extraction import DictVectorizer
>>> v = DictVectorizer(sparse=False)
>>> D = [{'foo': 1, 'bar': 2}, {'foo': 3, 'baz': 1}]
>>> X = v.fit_transform(D)
>>> X
array([[ 2.,  0.,  1.],
       [ 0.,  1.,  3.]])
>>> v.inverse_transform(X) == [{'bar': 2.0, 'foo': 1.0}, {'baz': 1.0, 'foo': 3.0}]
True
>>> v.transform({'foo': 4, 'unseen_feature': 3})
array([[ 0.,  0.,  4.]])

最终的transform()调用会获取具有两个功能的新的,看不见的数据。其中一个是DictVectorizer知道的(因为它以前适用于也具有此功能的数据),另一个不是。如输出所示,已知要素foo的值最终位于矩阵的正确列中,而未知要素则被忽略。