我有一个字典列表,我使用scikit-learn
中的DictVectorizer
将其转换为矢量代表
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
dictvector = D = [{'foo': 'city1', 'bar': 2, 'label':'c1'}, {'foo': 'city2', 'baz': 1, 'label':'c2'}]
dictVector = vec.fit_transform(dictList)
现在,我想从每一行中提取特征"label"的所有元组的值,然后从向量中删除它们。这将有助于将向量用作scikit
决策树分类器的输入,并将相应的标签用作分类器的基本事实。
但是当我尝试将功能名称作为字典键调用时。我被要求只使用整数而不是字符串。如何解决同样的问题?
具有DictVectorizer
的特征映射到 numpy 数组,该数组将特征表示为NxM
数字矩阵(字典丢失(。但是,类DictVectorizer
在内部保留映射函数,您可以使用 .inverse_transform
恢复它。来自 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.]])
>>> v.inverse_transform(X) == [{'bar': 2.0, 'foo': 1.0}, {'baz': 1.0, 'foo': 3.0}]
True
因此,对于属于 X
的单个实例x_i
(行(,您可以将映射恢复为:
>>> v.inverse_transform(X[i][None, :])
最后一位[None, :]
转换1xM
行向量中的M
长度行X[i]
。并非完全需要,但scikits-learn会发出警告。以下方法也应该有效:
>>> v.inverse_transform(X[i])
现在,回答问题,要从数据X
中删除给定特征,DictVectorizer
还存储与feature_names_
中的每个特征相对应的名称。
>>> v.feature_names_
['bar', 'baz', 'foo']
因此,您可以执行以下操作:
>>> column = v.feature_names_.index('foo') # Column mapping index of key 'foo'
>>> values = X[:, column] # get values
>>> X[:, column] = 0 # remove them from X
最后,将答案扩展到具有DictVectorizer(sparse=True)
的稀疏矩阵,其中X
现在是一个 NxM 稀疏矩阵而不是 numpy 数组。上述解决方案只需稍作修改即可(注意值提取中的.todense()
(:
>>> column = v.feature_names_.index('foo')
>>> values = X[:, column].todense() # get values
>>> X[:, column] = 0 # remove them from X
将上面的代码中的'foo'
替换为'label'
,使其适合您。