m.a*_*wad 3 python pandas scikit-learn sklearn-pandas
我有以下代码
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)
Run Code Online (Sandbox Code Playgroud)
我如何从中获取列名fitted?
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)
Run Code Online (Sandbox Code Playgroud)
然后,您可以执行类似的操作以获取更具可读性的SVD维度名称-让我们为第0个维度进行计算:
" ".join([
"%+0.3f*%s" % (coef, feat)
for coef, feat in zip(svd.components_[0], feature_names)
])
Run Code Online (Sandbox Code Playgroud)
它显示+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维护者之一; pull请求不是我本人)。
继续米哈伊尔的帖子。
假设你已经有了feature_namesfromvectorizer.get_feature_names()之后你已经打电话了svd.fit(X)
现在您还可以使用以下代码提取排序的最佳特征名称:
best_fearures = [feature_names[i] for i in svd.components_[0].argsort()[::-1]]
Run Code Online (Sandbox Code Playgroud)
上面的代码,尝试返回降序排序的参数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']
Run Code Online (Sandbox Code Playgroud)