如何从sklearn TruncatedSVD对象获取功能名称?

问题描述 投票:2回答:2

我有以下代码

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获取列名?

python pandas scikit-learn sklearn-pandas
2个回答
6
投票

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维护者之一;拉请求不在我身边)。


3
投票

延续米哈伊尔岗位。

假设你已经有来自feature_namesvectorizer.get_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']
© www.soinside.com 2019 - 2024. All rights reserved.