如何从 sklearn TruncatedSVD 对象中获取特征名称?
How can I get the feature names from sklearn TruncatedSVD object?
我有以下代码
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
中获取列名称?
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
- 这是一个 "feature name" 你可以在这种情况下用于第 0 个 SVD 维度(当然,系数取决于数据,所以特征名称也取决于数据)。
如果您有很多输入维度,您可以用可检查性交换一些 "precision",例如对系数进行排序并仅使用其中的几个顶部。可以在 https://github.com/TeamHG-Memex/eli5/pull/208 中找到更详细的示例(免责声明:我是 eli5 维护者之一;拉取请求不是我提出的)。
In continuation of Mikhail post.
假设您已经从 vectorizer.get_feature_names()
获得了 feature_names
,然后您又调用了 svd.fit(X)
现在您还可以使用以下代码提取排序后的最佳特征名称:
best_fearures = [feature_names[i] for i in svd.components_[0].argsort()[::-1]]
上面的代码,尝试return 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']
我有以下代码
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
中获取列名称?
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
- 这是一个 "feature name" 你可以在这种情况下用于第 0 个 SVD 维度(当然,系数取决于数据,所以特征名称也取决于数据)。
如果您有很多输入维度,您可以用可检查性交换一些 "precision",例如对系数进行排序并仅使用其中的几个顶部。可以在 https://github.com/TeamHG-Memex/eli5/pull/208 中找到更详细的示例(免责声明:我是 eli5 维护者之一;拉取请求不是我提出的)。
In continuation of Mikhail post.
假设您已经从 vectorizer.get_feature_names()
获得了 feature_names
,然后您又调用了 svd.fit(X)
现在您还可以使用以下代码提取排序后的最佳特征名称:
best_fearures = [feature_names[i] for i in svd.components_[0].argsort()[::-1]]
上面的代码,尝试return 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']