主成分分析 (PCA) 是資料科學家使用的絕佳工具。它可用于降低特征空間維數并生成不相關的特征。正如我們将看到的,它還可以幫助你深入了解資料的分類能力。我們将帶你了解如何以這種方式使用 PCA。提供了 Python 代碼片段,完整項目可在GitHub^1上找到。
什麼是 PCA?
我們先從理論開始。我不會深入講解太多細節,因為如果你想了解 PCA 的工作原理,有很多很好的資源^2^3。重要的是要知道 PCA 是一種降維算法。這意味着它用于減少用于訓練模型的特征數量。它通過從許多特征中建構主成分 (PC) 來實作這一點。
PC 的構造方式是,第一個 PC(即 PC1)盡可能解釋特征中的大部分變化。然後 PC2 盡可能解釋剩餘變化中的大部分變化,依此類推。PC1 和 PC2 通常可以解釋總特征變化的很大一部分。另一種思考方式是,前兩個 PC 可以很好地總結特征。這很重要,因為它使我們能夠在二維平面上直覺地看到資料的分類能力。
資料集
好的,讓我們深入研究一個實際的例子。我們将使用 PCA 來探索乳腺癌資料集^4,我們使用以下代碼導入該資料集。目标變量是乳腺癌測試的結果 - 惡性或良性。每次測試都會取出許多癌細胞。然後從每個癌細胞中采取 10 個不同的測量值。這些包括細胞半徑和細胞對稱性等測量值。為了獲得 30 個特征的最終清單,我們以 3 種方式彙總這些測量值。也就是說,我們計算每個測量值的平均值、标準誤差和最大值(“最差”值)。在圖 1 中,我們仔細研究了其中兩個特征 -細胞的平均對稱性和最差平滑度。
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
data = pd.DataFrame(cancer['data'],columns=cancer['feature_names'])
data['y'] = cancer['target']
在圖 1 中,我們可以看到這兩個特征有助于區分這兩個類别。也就是說,良性惡性良性腫瘤往往更對稱、更光滑。重疊部分仍然很多,是以僅使用這些特征的模型效果不會很好。我們可以建立這樣的圖表來了解每個單獨特征的預測能力。盡管有 30 個特征,但需要分析的圖表還是很多。它們也沒有告訴我們整個資料集的預測能力。這就是 PCA 發揮作用的地方。
圖 1:使用兩個特征的散點圖
PCA——整個資料集
讓我們首先對整個資料集進行 PCA。我們使用下面的代碼來執行此操作。我們首先縮放特征,使它們都具有均值為 0 和方差為 1。這很重要,因為 PCA 通過最大化 PC 解釋的方差來工作。由于其規模,某些特征往往會具有更高的方差。例如,以厘米為機關測量的距離的方差将高于以公裡為機關測量的相同距離。如果不進行縮放,PCA 将被那些方差較大的特征“壓倒”。
縮放完成後,我們拟合 PCA 模型并将特征轉換為 PC。由于我們有 30 個特征,是以最多可以有 30 個 PC。對于我們的可視化,我們隻對前兩個感興趣。你可以在圖 2 中看到這一點,其中使用 PC1 和 PC2 建立了散點圖。我們現在可以看到兩個不同的叢集,它們比圖 1 中更清晰。
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
#Scale the data
scaler = StandardScaler()
scaler.fit(data)
scaled = scaler.transform(data)
#Obtain principal components
pca = PCA().fit(scaled)
pc = pca.transform(scaled)
pc1 = pc[:,0]
pc2 = pc[:,1]
#Plot principal components
plt.figure(figsize=(10,10))
colour = ['#ff2121'if y == 1else'#2176ff'for y in data['y']]
plt.scatter(pc1,pc2 ,c=colour,edgecolors='#000000')
plt.ylabel("Glucose",size=20)
plt.xlabel('Age',size=20)
plt.yticks(size=12)
plt.xticks(size=12)
plt.xlabel('PC1')
plt.ylabel('PC2')
該圖可用于直覺地了解資料的預測強度。在本例中,它表明使用整個資料集将使我們能夠區分惡性惡性良性腫瘤和良性惡性良性腫瘤。但是,仍然有一些異常值(即不明确位于群集中的點)。這并不意味着我們會對這些情況做出錯誤的預測。我們應該記住,并非所有特征方差都會在前兩個 PC 中捕獲。在完整特征集上訓練的模型可以産生更好的預測。
圖 2:使用所有特征的 PCA 散點圖
此時,我們應該提到這種方法的一個注意事項。PC1 和 PC2 可以解釋特征中很大一部分方差。然而,這并不總是正确的。在某些情況下,PC 可能被認為是特征的糟糕總結。這意味着,即使你的資料可以很好地分離類别,你也可能無法獲得清晰的聚類,如圖 2 所示。
我們可以使用 PCA 碎石圖來确定這是否會是一個問題。我們使用下面的代碼建立了此分析的碎石圖,如圖 3 所示。這是一個條形圖,其中每個條形的高度是相關 PC 解釋的方差百分比。我們看到,PC1 和 PC2 總共隻解釋了約 20% 的特征方差。即使隻有 20% 的解釋,我們仍然得到兩個不同的聚類。這強調了資料的預測強度。
var = pca.explained_variance_[0:10] #percentage of variance explained
labels = ['PC1','PC2','PC3','PC4','PC5','PC6','PC7','PC8','PC9','PC10']
plt.figure(figsize=(15,7))
plt.bar(labels,var,)
plt.xlabel('Pricipal Component')
plt.ylabel('Proportion of Variance Explained')
圖 3. 碎石圖
PCA——特征組
我們還可以使用此過程來比較不同的特征組。例如,假設我們有兩組特征。第 1 組具有基于細胞對稱性和平滑度特征的所有特征。而第 2 組具有基于周長和凹度的所有特征。我們可以使用 PCA 來直覺地了解哪組更适合進行預測。
group_1 = ['mean symmetry', 'symmetry error','worst symmetry',
'mean smoothness','smoothness error','worst smoothness']
group_2 = ['mean perimeter','perimeter error','worst perimeter',
'mean concavity','concavity error','worst concavity']
我們首先建立兩組特征。然後分别對每組進行 PCA。這将為我們提供兩組 PC,我們選擇 PC1 和 PC2 來代表每個特征組。該過程的結果可以在圖 4 中看到。
對于第 1 組,我們可以看到有一些分離,但仍然有很多重疊。相比之下,第 2 組有兩個不同的簇。是以,從這些圖中,我們預計第 2 組中的特征是更好的預測因子。使用第 2 組特征訓練的模型應該比使用第 1 組特征訓練的模型具有更高的準确率。現在,讓我們來測試一下這個假設。
圖 4:使用特征組的 PCA 散點圖
我們使用下面的代碼來訓練使用兩組特征的邏輯回歸模型。在每種情況下,我們使用 70% 的資料來訓練模型,其餘 30% 的資料來測試模型。第 1 組的測試集準确率為 74%,相比之下,第 2 組的準确率為 97%。是以,第 2 組中的特征是更好的預測因子,這正是我們從 PCA 結果中預期的。
from sklearn.model_selection import train_test_split
import sklearn.metrics as metric
import statsmodels.api as sm
for i,g in enumerate(group):
x = data[g]
x = sm.add_constant(x)
y = data['y']
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3,
random_state = 101)
model = sm.Logit(y_train,x_train).fit() #fit logistic regression model
predictions = np.around(model.predict(x_test))
accuracy = metric.accuracy_score(y_test,predictions)
print("Accuracy of Group {}: {}".format(i+1,accuracy))
---
Optimization terminated successfully.
Current function value: 0.458884
Iterations 7
Accuracy of Group 1: 0.7368421052631579
Optimization terminated successfully.
Current function value: 0.103458
Iterations 10
Accuracy of Group 2: 0.9707602339181286
最後,我們将了解如何在開始模組化之前使用 PCA 來更深入地了解資料。它将讓你了解預期的分類準确度。你還将對哪些特征具有預測性建立直覺。這可以讓你在特征選擇方面占據優勢。
如上所述,這種方法并非萬無一失。它應該與其他資料探索圖和彙總統計資料一起使用。對于分類問題,這些可能包括資訊值和箱線圖。一般來說,在開始模組化之前,從盡可能多的不同角度檢視資料是個好主意。
參考
[^2]: Matt Brems, A One-Stop Shop for Principal Component Analysis (2017), https://towardsdatascience.com/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c
[^3]: L. Pachter, What is principal component analysis? (2014), https://liorpachter.wordpress.com/2014/05/26/what-is-principal-component-analysis/
[^4]: UCI, Breast Cancer Wisconsin (Diagnostic) Dataset (2020), http://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+(diagnostic)