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