1. ホーム
  2. python

[解決済み] sklearnによるPCAにおけるexplounded_variance_ratio_の特徴名の復元

2023-03-24 23:16:04

質問

scikit-learnで行ったPCAから回復しようとしています。 どの として選択された素性は 関連する .

IRISデータセットによる典型的な例です。

import pandas as pd
import pylab as pl
from sklearn import datasets
from sklearn.decomposition import PCA

# load dataset
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# normalize data
df_norm = (df - df.mean()) / df.std()

# PCA
pca = PCA(n_components=2)
pca.fit_transform(df_norm.values)
print pca.explained_variance_ratio_

これは

In [42]: pca.explained_variance_ratio_
Out[42]: array([ 0.72770452,  0.23030523])

データセットの中で、どの特徴が2つの分散を説明できるかを復元するにはどうしたらよいでしょうか? 逆に、iris.feature_namesにあるこの特徴のインデックスを取得するにはどうしたらよいでしょうか?

In [47]: print iris.feature_names
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

よろしくお願いします。

どのように解決するのですか?

この情報は pca 属性で指定します。 components_ . で説明されているように のドキュメントで説明されています。 , pca.components_ の配列を出力します。 [n_components, n_features] を出力するので、コンポーネントが異なる機能とどのように線形関係にあるかを得るには、そうする必要があります。

注意 各係数は、特定の成分と特徴の組の相関を表す。

import pandas as pd
import pylab as pl
from sklearn import datasets
from sklearn.decomposition import PCA

# load dataset
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# normalize data
from sklearn import preprocessing
data_scaled = pd.DataFrame(preprocessing.scale(df),columns = df.columns) 

# PCA
pca = PCA(n_components=2)
pca.fit_transform(data_scaled)

# Dump components relations with features:
print(pd.DataFrame(pca.components_,columns=data_scaled.columns,index = ['PC-1','PC-2']))

      sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
PC-1           0.522372         -0.263355           0.581254          0.565611
PC-2          -0.372318         -0.925556          -0.021095         -0.065416

重要です。 余談ですが、PCAの符号は、各成分に含まれる分散に影響しないので、その解釈には影響しないことに注意してください。PCA次元を形成する特徴の相対的な符号のみが重要です。実際、PCAコードをもう一度実行すると、符号が反転したPCA次元が得られるかもしれません。これについての直感は、3次元空間におけるベクトルとその負について考えてみてください - 両者は本質的に空間における同じ方向を表しているのです。 確認 この記事 を参照してください。