2017-06-19 10 views
0

私は私がfittedから列名を取得しますどのように次のコードSklearn TruncatedSVDオブジェクトからフィーチャ名を取得するにはどうすればよいですか?

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) 

がありますか?

+0

SVDとPCAは既存のものから列を選択しません。使用可能なすべての列を使用してデータを新しい次元に変換します。したがって、列がはめ込まれるのに意味がありません。 –

+0

私が誤って私がどのように誤って研究したのかを知った後、私はstats.exchange [link](https://stats.stackexchange.com/questions/286335/reduce-dimensions-of-a-highly-dimension-データ)あなたは時間があればそれに答えてください。 @VivekKumar –

答えて

3

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のメンテナーの1人です;プルリクエストは私ではありません)。

+0

私が理解していることは、新しい名前が新しい次元が古いものからどのように構築されたかを私に教えているということです。 –

+0

はい、そうです。 –

+0

その後、私はstats.exchange [link](https://stats.stackexchange.com/questions/286335/reduce-dimensions-of-a-highly-dimension-data)でさらに詳しい質問をしました。時間があれば、もう一度感謝してください。 –

0

ミハイルポストの続き。

は、すでにvectorizer.get_feature_names()からfeature_namesを持っていると仮定し、その後、あなたは今、あなたはまた、次のコードを使用してソートされた最高の機能名を抽出することができますsvd.fit(X)

と呼ばれています、上記のコード

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

を降順ソートの戻り値を返して、feature_names(すべての機能)から相対インデックスを見つけ、best_featuresの配列を構築してください。 次に、10個の最高の機能を確認できます。

In[21]: best_features[:10] 

Out[21]: 
['manag', 
'develop', 
'busi', 
'solut', 
'initi', 
'enterprise', 
'project', 
'program', 
'process', 
'plan'] 
関連する問題