Python 在scikit dict矢量器中按特征名称提取特征

Python 在scikit dict矢量器中按特征名称提取特征,python,numpy,scipy,scikit-learn,Python,Numpy,Scipy,Scikit Learn,我有一个字典列表,我使用scikit-learn 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) 现在,我

我有一个字典列表,我使用
scikit-learn

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
的功能被映射到数组,数组将该功能表示为
NxM
数字矩阵(字典丢失)。但是,类
DictVectorizer
在内部保留映射函数,您可以使用
.inverse\u transform
恢复它。根据以下文件:

因此,对于属于
x
的单个实例
x\u i
(行),可以恢复映射为:

>>> v.inverse_transform(X[i][None, :])
最后一位
[None,:]
转换
1xM
行向量中的
M
长度行
X[i]
。并非完全需要,但scikits learn会发出警告。以下方面也应起作用:

>>> v.inverse_transform(X[i])

现在,回答这个问题,要从数据中删除给定的功能,
X
DictVectorizer
还存储与
feature\u names\u
中每个功能对应的名称

>>> 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()
):


将上述代码中的
'foo'
替换为
'label'
,使其为您工作。

DictVectorizer
具有方法
获取功能名称()
,该方法可能比直接访问
功能名称
属性更安全。
>>> column = v.feature_names_.index('foo') # Column mapping index of key 'foo'
>>> values = X[:, column] # get values
>>> X[:, column] = 0 # remove them from X
>>> column = v.feature_names_.index('foo')
>>> values = X[:, column].todense() # get values
>>> X[:, column] = 0 # remove them from X