溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python如何使用PCA可視化數(shù)據(jù)

發(fā)布時間:2021-07-28 18:14:43 來源:億速云 閱讀:1290 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“python如何使用PCA可視化數(shù)據(jù)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“python如何使用PCA可視化數(shù)據(jù)”吧!

什么是PCA

我們先復(fù)習(xí)一下這個理論。如果你想確切了解PCA是如何工作的,我們不會詳細介紹,網(wǎng)上有大量學(xué)習(xí)資源。

PCA用于減少用于訓(xùn)練模型的特征的數(shù)量。它通過從多個特征構(gòu)造所謂的主成分(PC)來實現(xiàn)這一點。

PC的構(gòu)造方式使得PC1方向在最大變化上盡可能地解釋了你的特征。然后PC2在最大變化上盡可能地解釋剩余特征,等等……PC1和PC2通??梢越忉尶傮w特征變化中的很大一部分。

另一種思考方法是,前兩個PC可以很好地概括大部分特征。這很重要,因為正如我們將看到的,它允許我們在二維平面上可視化數(shù)據(jù)的分類能力。

數(shù)據(jù)集

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

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

目標變量是乳腺癌檢測的結(jié)果,惡性或良性。每次測試,都要取多個癌細胞。然后從每個癌細胞中采取10種不同的措施。這些測量包括細胞半徑和細胞對稱性。最后,為了得到特征值,我們計算了每個度量值的平均值、標準誤差和最大值(不太好的),這樣我們總共得到30個特征值。

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

python如何使用PCA可視化數(shù)據(jù)

在圖中,我們看到這兩個特征可以幫助區(qū)分這兩個類。那就是良性腫瘤往往更為對稱和光滑。但是,仍然有很多重疊,所以僅僅使用這些特征的模型不會做得很好。

我們可以創(chuàng)建這樣的圖來了解每個特征的預(yù)測能力。但是有30個特征,這意味著有相當多的圖要分析,他們也沒有告訴我們?nèi)绾巫鳛橐粋€整體來預(yù)測數(shù)據(jù)集。這我們可以引入PCA。

PCA-整個數(shù)據(jù)集

首先,我們對整個數(shù)據(jù)集進行主成分分析。我們使用下面的代碼。

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。這一點很重要,因為主成分分析通過最大化主成分分析所解釋的方差來工作。

一些特征由于其沒有經(jīng)過標準化自然會有更高的方差。例如,以厘米為單位測量的距離將比以公里為單位測量的相同距離具有更高的方差。在不縮放特征的情況下,主成分分析將被那些高方差特征“吸引”。

縮放完成后,我們會擬合PCA模型,并將我們的特征轉(zhuǎn)換為PC。由于我們有30個特征,我們最多可以有30個PC。但是,對于可視化,我們只對前兩個感興趣。然后使用PC1和PC2創(chuàng)建如圖所示的散點圖。

python如何使用PCA可視化數(shù)據(jù)

在圖2中,我們可以看到兩個不同的簇。雖然仍然有一些重疊,但是簇比我們在之前的圖中要清晰得多。這告訴我們,作為一個整體,這個數(shù)據(jù)集在區(qū)分惡性腫瘤和良性腫瘤方面會做得很好。

我們還應(yīng)該考慮到,我們只關(guān)注前兩個PC,因此并不是所有特征的變化都被捕獲。這意味著使用所有特征訓(xùn)練的模型仍然可以正確預(yù)測異常值(即聚類中不清楚的點)。

在這一點上,我們應(yīng)該提到這種方法的一個警告。我們提到PC1和PC2可以解釋你的特征中很大一部分的差異。然而,這并不總是真的。在這種情況下,這些PC可以被認為是對你的特征的錯誤總結(jié)。這意味著,即使你的數(shù)據(jù)能夠很好地分離,你也可能無法獲得如上圖所示的清晰的簇。

我們可以通過查看PCA-scree圖來確定。我們使用下面的代碼為這個分析創(chuàng)建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')

它本質(zhì)上是一個柱狀圖,其中每個柱狀圖的高度是相關(guān)PC解釋的方差百分比。我們看到,總共只有大約20%的特征方差是由PC1和PC2解釋的。即使只解釋了20%,我們?nèi)匀坏玫絻蓚€不同的集群。這強調(diào)了數(shù)據(jù)的預(yù)測能力。

python如何使用PCA可視化數(shù)據(jù)

PCA-特征組

到目前為止,我們已經(jīng)使用主成分分析來了解整個特征集對數(shù)據(jù)的分類效果。我們也可以使用這個過程來比較不同的特征組。例如,假設(shè)我們想知道細胞的對稱性和光滑性是否比細胞的周長和凹陷性更好。

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

我們首先創(chuàng)建兩組特征。第一組包含所有與對稱性和光滑性有關(guān)的特征,第二組包含所有與周長和凹陷性有關(guān)的特征。然后,除了使用這兩組特征外,我們以與之前相同的方式進行主成分分析。這個過程的結(jié)果如下圖所示。

python如何使用PCA可視化數(shù)據(jù)

我們可以看到,對于第一組,有一些分離,但仍然有很多重疊。相比之下,第2組有兩個不同的簇。因此,從這些圖中,我們可以預(yù)期第2組的特征(即細胞周長和凹陷)將是更好的預(yù)測腫瘤是惡性還是良性的指標。

最終,這將意味著使用組2中的特征的模型比使用組1中的特征的模型具有更高的精度?,F(xiàn)在,讓我們來驗證這個假設(shè)。

我們使用下面的代碼來訓(xùn)練一個使用兩組特征的logistic回歸模型。在每種情況下,我們使用70%的數(shù)據(jù)來訓(xùn)練模型,剩下的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的特征明顯是更好的預(yù)測因子,這正是我們從主成分分析結(jié)果中所看到的。

最后,我們將了解如何在開始建模之前使用PCA來加深對數(shù)據(jù)的理解。了解哪些特征是可預(yù)測的,將在特征選擇方面給你帶來優(yōu)勢。此外,查看特征的總體分類能力將使你了解預(yù)期的分類精度。

如前所述,這種方法并不能完全證明,因此應(yīng)與其他數(shù)據(jù)勘探圖和匯總統(tǒng)計一起使用。一般來說,在開始建模之前,最好從盡可能多的不同角度查看數(shù)據(jù)。

到此,相信大家對“python如何使用PCA可視化數(shù)據(jù)”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI