web-dev-qa-db-ja.com

sklearnのPCA-pca.components_の解釈方法

この単純なコードを使用して、10個の機能を持つデータフレームでPCAを実行しました。

pca = PCA()
fit = pca.fit(dfPca)

pca.explained_variance_ratio_の結果は以下を示します。

array([  5.01173322e-01,   2.98421951e-01,   1.00968655e-01,
         4.28813755e-02,   2.46887288e-02,   1.40976609e-02,
         1.24905823e-02,   3.43255532e-03,   1.84516942e-03,
         4.50314168e-16])

これは、最初のPCが分散の52%を説明し、2番目のコンポーネントが29%を説明するということだと思います...

私が理解できないのは、pca.components_の出力です。次のことを行う場合:

df = pd.DataFrame(pca.components_, columns=list(dfPca.columns))

各行が主成分であるデータフレームが表示されます。私が理解したいのは、そのテーブルの解釈方法です。各コンポーネントのすべての機能を2乗して合計すると1になりますが、PC1の-0.56はどういう意味ですか?分散の52%を説明するコンポーネントの最大の大きさであるため、「機能E」について何かを伝えていますか?

enter image description here

ありがとう

12
Diego

用語:まず、PCAの結果は、通常、ファクタースコア(特定のデータポイントに対応する変換された変数値)と呼ばれることもあるコンポーネントスコアに関して説明されます。荷重(標準化された各元変数にコンポーネントスコアを取得するために掛ける重み)。

PART1:機能の重要性をチェックする方法とバイプロットをプロットする方法を説明します。

PART2:機能の重要性を確認する方法と、機能名を使用してpandasデータフレームに保存する方法を説明します。


パート1:

あなたの場合、機能Eの値-0.56は、PC1でのこの機能のスコアです。 この値は、機能がPC(この場合はPC1)にどの程度影響するかを示します。

したがって、絶対値の値が高いほど、主成分への影響が大きくなります。

PCA分析を実行した後、人々は通常、既知の「バイプロット」をプロットして、N次元(この場合は2)と元の変数(特徴)の変換された特徴を確認します。

これをプロットする関数を作成しました。


虹彩データの使用:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

iris = datasets.load_iris()
X = iris.data
y = iris.target

#In general it is a good idea to scale the data
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)

pca = PCA()
pca.fit(X,y)
x_new = pca.transform(X)   

def myplot(score,coeff,labels=None):
    xs = score[:,0]
    ys = score[:,1]
    n = coeff.shape[0]

    plt.scatter(xs ,ys, c = y) #without scaling
    for i in range(n):
        plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = 'r',alpha = 0.5)
        if labels is None:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = 'g', ha = 'center', va = 'center')
        else:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = 'g', ha = 'center', va = 'center')

plt.xlabel("PC{}".format(1))
plt.ylabel("PC{}".format(2))
plt.grid()

#Call the function. 
myplot(x_new[:,0:2], pca. components_) 
plt.show()

結果

enter image description here

パート2:

重要な機能は、より多くのコンポーネントに影響を与えるため、コンポーネントの絶対値が大きいものです。

TOPCで最も重要な機能を名前で取得し、それらをpandasデータフレームに保存しますこれを使用します:

from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
np.random.seed(0)

# 10 samples with 5 features
train_features = np.random.Rand(10,5)

model = PCA(n_components=2).fit(train_features)
X_pc = model.transform(train_features)

# number of components
n_pcs= model.components_.shape[0]

# get the index of the most important feature on EACH component
# LIST COMPREHENSION HERE
most_important = [np.abs(model.components_[i]).argmax() for i in range(n_pcs)]

initial_feature_names = ['a','b','c','d','e']
# get the names
most_important_names = [initial_feature_names[most_important[i]] for i in range(n_pcs)]

# LIST COMPREHENSION HERE AGAIN
dic = {'PC{}'.format(i): most_important_names[i] for i in range(n_pcs)}

# build the dataframe
df = pd.DataFrame(dic.items())

この出力:

     0  1
 0  PC0  e
 1  PC1  d

PC1ではeという機能が最も重要であり、PC2ではd

13
makis

基本的なアイデア

そこにあるフィーチャによる主なコンポーネントの内訳は、基本的に、各主なコンポーネントがフィーチャの方向に関して指し示す「方向」を示しています。

各主要コンポーネントでは、絶対重みが大きいフィーチャは、主要コンポーネントをそのフィーチャの方向に「プル」します。

たとえば、PC1では、フィーチャA、フィーチャB、フィーチャI、およびフィーチャJの重みが(絶対値で)比較的低いため、PC1はフィーチャ空間でこれらのフィーチャの方向をそれほど指していません。 PC1は、他の方向と比較して、フィーチャEの方向を最も指し示します。

低次元での視覚化

これを視覚化するには、 here および here から取った以下の図を参照してください。

以下に、相関データでPCAを実行する例を示します。 enter image description here

PCAから派生した両方の固有ベクトルが、フィーチャ1およびフィーチャ2の両方向に「引き寄せられている」ことが視覚的にわかります。したがって、あなたが作成したような主要なコンポーネントの内訳表を作成する場合、PC1とPC2を説明する機能1と機能2の両方から何らかの重みが得られると予想されます。

次に、無相関データの例を示します。

enter image description here

緑の主成分をPC1、ピンクの主成分をPC2と呼びましょう。 PC1がフィーチャx 'の方向に引っ張られておらず、PC2がフィーチャy'の方向に引っ張られていないことは明らかです。したがって、この表では、PC1の機能x 'の重みは0、PC2の機能y'の重みは0でなければなりません。

これにより、テーブルに何が表示されているかがわかります。

8
Tatsuya Yokota