在 scikit dict vectorizer 中按特征名称提取特征

Amr*_*hna 3 python numpy scipy scikit-learn

我有一个字典列表,我使用DictVectorizerin将其转换为向量表示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)
Run Code Online (Sandbox Code Playgroud)

现在,我想从每一行中提取特征“标签”的所有元组的值,然后将它们从向量中删除。这将有助于将向量用作决策树分类器的输入,scikit并将相应的标签用作分类器的基本事实。

但是当我尝试将功能名称称为字典键时。我被要求只使用整数而不是字符串。如何解决相同的问题?

Ima*_*ngo 5

将特征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
Run Code Online (Sandbox Code Playgroud)

因此,对于属于 的单个实例x_i(行)X,您可以将映射恢复为:

>>> v.inverse_transform(X[i][None, :])
Run Code Online (Sandbox Code Playgroud)

最后一位[None, :]的转换M长度排X[i]在一个1xM行向量。并非完全需要,但 scikits-learn 会发出警告。以下内容也应该有效:

>>> v.inverse_transform(X[i])
Run Code Online (Sandbox Code Playgroud)

现在,回答这个问题,要从数据中删除给定的特征XDictVectorizer还将与每个特征对应的名称存储在feature_names_.

>>> v.feature_names_
['bar', 'baz', 'foo']
Run Code Online (Sandbox Code Playgroud)

因此,您可以执行以下操作:

>>> column = v.feature_names_.index('foo') # Column mapping index of key 'foo'
>>> values = X[:, column] # get values
>>> X[:, column] = 0 # remove them from X
Run Code Online (Sandbox Code Playgroud)

最后,将答案扩展到稀疏矩阵,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
Run Code Online (Sandbox Code Playgroud)

替换上面代码中的'foo'by'label'以使其适合您。

  • `DictVectorizer` 具有方法 `get_feature_names()`,这可能比直接访问 `feature_names_` 属性更安全。 (2认同)