我正在使用DictVectorizer来转换我的特征,类似于示例代码:
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_'属性做些什么。
欢呼,史蒂文
正确使用fit
和transform
方法是没有问题的。首先将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
的值最终出现在矩阵的正确列中,而未知特征则被忽略。