[英]PCA on sklearn - how to interpret 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% 的方差,第二個組件解釋了 29% 等等......
我不為已了解的輸出pca.components_
。 如果我執行以下操作:
df = pd.DataFrame(pca.components_, columns=list(dfPca.columns))
我得到了下面的數據框,其中每一行都是一個主成分。 我想了解的是如何解釋該表。 我知道如果我對每個組件上的所有特征進行平方並將它們相加,我會得到 1,但是 PC1 上的 -0.56 是什么意思? 它是否說明了“特征 E”,因為它是解釋 52% 方差的組件上的最高幅度?
謝謝
術語:首先,PCA 的結果通常根據分量分數進行討論,有時稱為因子分數(對應於特定數據點的轉換變量值)和載荷(每個標准化原始變量應采用的權重)乘以得到組件分數)。
第 1 部分:我解釋了如何檢查特征的重要性以及如何繪制雙標圖。
第 2 部分:我解釋了如何檢查特征的重要性以及如何使用特征名稱將它們保存到 Pandas 數據框中。
文章摘要:Python 精簡指南: https : //towardsdatascience.com/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e ?source=friends_link&sk=65bf5440e444c24aff192fedf9f8b64f
在您的情況下,特征 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()
結果
重要的特征是那些對組件影響更大的特征,因此對組件具有很大的絕對值。
要使用名稱獲取 PC 上最重要的功能並將它們保存到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
。
文章摘要: Python 緊湊指南: https : //towardsdatascience.com/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e ?source=friends_link&sk=65bf5440e444c24aff192fedf9f8b64f
基本理念
按您擁有的功能細分的主要組件基本上會告訴您每個主要組件在功能方向方面指向的“方向”。
在每個主成分中,具有更大絕對權重的特征會將主成分更多地“拉”向該特征的方向。
例如,我們可以說在 PC1 中,由於 Feature A、Feature B、Feature I 和 Feature J 具有相對較低的權重(絕對值),因此 PC1 在特征空間中沒有那么多指向這些特征的方向。 相對於其他方向,PC1 將最指向特征 E 的方向。
較低維度的可視化
我們可以直觀地看到,從 PCA 導出的兩個特征向量都在特征 1 和特征 2 兩個方向上被“拉”。 因此,如果我們像您制作的那樣制作主成分分解表,我們希望從特征 1 和特征 2 中看到一些權重來解釋 PC1 和 PC2。
接下來,我們有一個不相關數據的例子。
讓我們將綠色的主成分稱為 PC1,將粉紅色的稱為 PC2。 很明顯,PC1 沒有被拉向特征 x' 的方向,PC2 也沒有被拉向特征 y' 的方向。 因此,在我們的表中,PC1 中特征 x' 的權重必須為 0,PC2 中特征 y' 的權重必須為 0。
我希望這能讓您了解您在表格中看到的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.