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

标签 python numpy scipy scikit-learn

我有一个字典列表,我使用 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)

现在,我想从每一行中提取特征“标签”的所有元组的值,然后将它们从向量中移除。这将有助于将向量用作 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, :]M 长度的行 X[i] 转换为 1xM 行向量。并非完全需要,但 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' 以使其适用。

关于python - 在 scikit dict vectorizer 中按特征名称提取特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35428388/

相关文章:

python - WTForms-如何预填充文本区域字段?

python - 是否有隐式导入/加载的模块?

python - 给定平面法线,沿平面移动顶点

python - Scipy 插值返回一个 'dimensionless' 数组

Python:完整的非对称网格

python - 使用 SymPy 的求解函数反汇编 Python 程序(幕后发生了什么?)

python - 无法使用 cfx run 运行我开发的 Firefox 插件

python - 在二维数组中随机放置n个元素

python - 随机交换两列 pandas dataframe 的元素

python - 曲线拟合——单调递增导数