如何从 sklearn TruncatedSVD 对象中获取特征名称?

Posted

技术标签:

【中文标题】如何从 sklearn TruncatedSVD 对象中获取特征名称?【英文标题】:How can I get the feature names from sklearn TruncatedSVD object? 【发布时间】:2017-11-21 20:20:20 【问题描述】:

我有以下代码

import pandas as pd
import numpy as np
from sklearn.decomposition import TruncatedSVD
df = df = pd.DataFrame(np.random.randn(1000, 25), index=dates, columns=list('ABCDEFGHIJKLMOPQRSTUVWXYZ'))

def reduce(dim):
    svd = sklearn.decomposition.TruncatedSVD(n_components=dim, n_iter=7, random_state=42)
    return svd.fit(df)

fitted = reduce(5)

如何从fitted 获取列名?

【问题讨论】:

SVD 和 PCA 不会从现有列中选择列。他们使用所有可用列将数据转换为新维度。因此,从装配中获取列是没有意义的。 经过一番研究,我意识到自己被误导了,我在 stats.exchange link 上提出了另一个问题,如果您有时间,请考虑回答。 @VivekKumar 【参考方案1】:

fitted 列名将是 SVD 维度。

每个维度都是输入特征的线性组合。要了解特定维度的含义,请查看 svd.components_ 数组 - 它包含输入特征乘以的系数矩阵。

你原来的例子,略有改动:

import pandas as pd
import numpy as np
from sklearn.decomposition import TruncatedSVD

feature_names = list('ABCDEF')
df = pd.DataFrame(
    np.random.randn(1000, len(feature_names)), 
    columns=feature_names
)

def reduce(dim):
    svd = TruncatedSVD(n_components=dim, n_iter=7, random_state=42)
    return svd.fit(df)

svd = reduce(3)

然后您可以执行类似的操作来获得更易读的 SVD 维度名称 - 让我们为第 0 维度计算它:

" ".join([
    "%+0.3f*%s" % (coef, feat) 
    for coef, feat in zip(svd.components_[0], feature_names)
])

它显示+0.170*A -0.564*B -0.118*C +0.367*D +0.528*E +0.475*F - 这是一个“特征名称”,您可以在这种情况下用于第 0 个 SVD 维度(当然,系数取决于数据,因此特征名称也取决于数据)。

如果您有很多输入维度,您可能会用一些“精度”来换取可检查性,例如对系数进行排序并仅使用其中的几个。更详细的示例可以在 https://github.com/TeamHG-Memex/eli5/pull/208 中找到(免责声明:我是 eli5 维护者之一;拉取请求不是由我提出的)。

【讨论】:

我的理解是,新名称告诉我新维度是如何从旧维度构建的,对吗? 那么谢谢你的帮助,我还在 stats.exchange link 上问过更详细的问题,如果你有时间请考虑回答,再次感谢。【参考方案2】:

继续米哈伊尔的帖子。

假设您已经拥有来自vectorizer.get_feature_names()feature_names,之后您调用了svd.fit(X)

现在您还可以使用以下代码提取排序后的最佳特征名称:

best_fearures = [feature_names[i] for i in svd.components_[0].argsort()[::-1]]

上面的代码,尝试返回svd.components_[0]的降序论证,并从feature_names(所有特征)中找到相对索引并构造best_features数组。 然后您可以查看例如 10 个最佳功能:

In[21]: best_features[:10]

Out[21]: 
['manag',
 'develop',
 'busi',
 'solut',
 'initi',
 'enterprise',
 'project',
 'program',
 'process',
 'plan']

【讨论】:

以上是关于如何从 sklearn TruncatedSVD 对象中获取特征名称?的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:无法导入名称 TruncatedSVD

在 Python 中对稀疏矩阵执行分解

如何从 sklearn 包中安装“校准”功能?

如何使用 sklearn 从决策树模型中提高预测的准确性?

如何从 sklearn 中的 TF*IDF 值获取字数

如何从管道中的 sklearn TFIDF Vectorizer 返回数据帧?