使用PCA可視化數據

做者|Conor O'Sullivan
編譯|VK
來源|Towards Data Sciencepython

主成分分析(PCA)是一個很好的工具,能夠用來下降特徵空間的維數。PCA的顯著優勢是它能產生不相關的特徵,並能提升模型的性能。git

它能夠幫助你深刻了解數據的分類能力。在本文中,我將帶你瞭解如何使用PCA。將提供Python代碼,完整的項目能夠在GitHub連接:https://github.com/conorosully/medium-articles。github

什麼是PCA

咱們先複習一下這個理論。若是你想確切瞭解PCA是如何工做的,咱們不會詳細介紹,網上有大量學習資源。api

PCA用於減小用於訓練模型的特徵的數量。它經過從多個特徵構造所謂的主成分(PC)來實現這一點。dom

PC的構造方式使得PC1方向在最大變化上儘量地解釋了你的特徵。而後PC2在最大變化上儘量地解釋剩餘特徵,等等……PC1和PC2一般能夠解釋整體特徵變化中的很大一部分。機器學習

另外一種思考方法是,前兩個PC能夠很好地歸納大部分特徵。這很重要,由於正如咱們將看到的,它容許咱們在二維平面上可視化數據的分類能力。工具

數據集

讓咱們來看看一個實際的例子。咱們將使用PCA來探索乳腺癌數據集(http://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+(diagnostic)),咱們使用下面的代碼導入該數據集。性能

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']

目標變量是乳腺癌檢測的結果,惡性或良性。每次測試,都要取多個癌細胞。而後從每一個癌細胞中採起10種不一樣的措施。這些測量包括細胞半徑和細胞對稱性。最後,爲了獲得特徵值,咱們計算了每一個度量值的平均值、標準偏差和最大值(不太好的),這樣咱們總共獲得30個特徵值。學習

在圖中,咱們仔細觀察了其中兩個特徵——細胞的平均對稱性(Benign)和最差平滑度(worst smoothness)。測試

在圖中,咱們看到這兩個特徵能夠幫助區分這兩個類。那就是良性腫瘤每每更爲對稱和光滑。可是,仍然有不少重疊,因此僅僅使用這些特徵的模型不會作得很好。

咱們能夠建立這樣的圖來了解每一個特徵的預測能力。可是有30個特徵,這意味着有至關多的圖要分析,他們也沒有告訴咱們如何做爲一個總體來預測數據集。這咱們能夠引入PCA。

PCA-整個數據集

首先,咱們對整個數據集進行主成分分析。咱們使用下面的代碼。

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

#標準化
scaler = StandardScaler()
scaler.fit(data)
scaled = scaler.transform(data)

#PCA
pca = PCA().fit(scaled)

pc = pca.transform(scaled)
pc1 = pc[:,0]
pc2 = pc[:,1]

#畫出主成分
plt.figure(figsize=(10,10))

colour = ['#ff2121' if y == 1 else '#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')

咱們首先標準化特徵,使它們的平均值爲0,方差爲1。這一點很重要,由於主成分分析經過最大化主成分分析所解釋的方差來工做。

一些特徵因爲其沒有通過標準化天然會有更高的方差。例如,以釐米爲單位測量的距離將比以千米爲單位測量的相同距離具備更高的方差。在不縮放特徵的狀況下,主成分分析將被那些高方差特徵「吸引」。

縮放完成後,咱們會擬合PCA模型,並將咱們的特徵轉換爲PC。因爲咱們有30個特徵,咱們最多能夠有30個PC。可是,對於可視化,咱們只對前兩個感興趣。而後使用PC1和PC2建立如圖所示的散點圖。

在圖2中,咱們能夠看到兩個不一樣的簇。雖然仍然有一些重疊,可是簇比咱們在以前的圖中要清晰得多。這告訴咱們,做爲一個總體,這個數據集在區分惡性腫瘤和良性腫瘤方面會作得很好。

咱們還應該考慮到,咱們只關注前兩個PC,所以並非全部特徵的變化都被捕獲。這意味着使用全部特徵訓練的模型仍然能夠正確預測異常值(即聚類中不清楚的點)。

在這一點上,咱們應該提到這種方法的一個警告。咱們提到PC1和PC2能夠解釋你的特徵中很大一部分的差別。然而,這並不老是真的。在這種狀況下,這些PC能夠被認爲是對你的特徵的錯誤總結。這意味着,即便你的數據可以很好地分離,你也可能沒法得到如上圖所示的清晰的簇。

咱們能夠經過查看PCA-scree圖來肯定。咱們使用下面的代碼爲這個分析建立scree圖,

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')

它本質上是一個柱狀圖,其中每一個柱狀圖的高度是相關PC解釋的方差百分比。咱們看到,總共只有大約20%的特徵方差是由PC1和PC2解釋的。即便只解釋了20%,咱們仍然獲得兩個不一樣的集羣。這強調了數據的預測能力。

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']

咱們首先建立兩組特徵。第一組包含全部與對稱性和光滑性有關的特徵,第二組包含全部與周長和凹陷性有關的特徵。而後,除了使用這兩組特徵外,咱們以與以前相同的方式進行主成分分析。這個過程的結果以下圖所示。

咱們能夠看到,對於第一組,有一些分離,但仍然有不少重疊。相比之下,第2組有兩個不一樣的簇。所以,從這些圖中,咱們能夠預期第2組的特徵(即細胞周長和凹陷)將是更好的預測腫瘤是惡性仍是良性的指標。

最終,這將意味着使用組2中的特徵的模型比使用組1中的特徵的模型具備更高的精度。如今,讓咱們來驗證這個假設。

咱們使用下面的代碼來訓練一個使用兩組特徵的logistic迴歸模型。在每種狀況下,咱們使用70%的數據來訓練模型,剩下的30%用來測試模型。

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))

第一組測試集的準確率爲74%,相比之下,第二組的準確率爲97%。所以,組2的特徵明顯是更好的預測因子,這正是咱們從主成分分析結果中所看到的。

最後,咱們將瞭解如何在開始建模以前使用PCA來加深對數據的理解。瞭解哪些特徵是可預測的,將在特徵選擇方面給你帶來優點。此外,查看特徵的整體分類能力將使你瞭解預期的分類精度。

如前所述,這種方法並不能徹底證實,所以應與其餘數據勘探圖和彙總統計一塊兒使用。通常來講,在開始建模以前,最好從儘量多的不一樣角度查看數據。

原文連接:https://towardsdatascience.com/visualising-the-classification-power-of-data-54f5273f640

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/

相關文章
相關標籤/搜索