1. 程式人生 > >sklearn PCA使用

sklearn PCA使用

兩篇文章結合瞭解:

其中一篇是(防刪除):

主成分分析(PCA)原理總結中,我們對主成分分析(以下簡稱PCA)的原理做了總結,下面我們就總結下如何使用scikit-learn工具來進行PCA降維。

1. scikit-learn PCA類介紹

    在scikit-learn中,與PCA相關的類都在sklearn.decomposition包中。最常用的PCA類就是sklearn.decomposition.PCA,我們下面主要也會講解基於這個類的使用的方法。

    除了PCA類以外,最常用的PCA相關類還有KernelPCA類,在原理篇我們也講到了,它主要用於非線性資料的降維,需要用到核技巧。因此在使用的時候需要選擇合適的核函式並對核函式的引數進行調參。

    另外一個常用的PCA相關類是IncrementalPCA類,它主要是為了解決單機記憶體限制的。有時候我們的樣本量可能是上百萬+,維度可能也是上千,直接去擬合數據可能會讓記憶體爆掉, 此時我們可以用IncrementalPCA類來解決這個問題。IncrementalPCA先將資料分成多個batch,然後對每個batch依次遞增呼叫partial_fit函式,這樣一步步的得到最終的樣本最優降維。

    此外還有SparsePCA和MiniBatchSparsePCA。他們和上面講到的PCA類的區別主要是使用了L1的正則化,這樣可以將很多非主要成分的影響度降為0,這樣在PCA降維的時候我們僅僅需要對那些相對比較主要的成分進行PCA降維,避免了一些噪聲之類的因素對我們PCA降維的影響。SparsePCA和MiniBatchSparsePCA之間的區別則是MiniBatchSparsePCA通過使用一部分樣本特徵和給定的迭代次數來進行PCA降維,以解決在大樣本時特徵分解過慢的問題,當然,代價就是PCA降維的精確度可能會降低。使用SparsePCA和MiniBatchSparsePCA需要對L1正則化引數進行調參。

2. sklearn.decomposition.PCA引數介紹

    下面我們主要基於sklearn.decomposition.PCA來講解如何使用scikit-learn進行PCA降維。PCA類基本不需要調參,一般來說,我們只需要指定我們需要降維到的維度,或者我們希望降維後的主成分的方差和佔原始維度所有特徵方差和的比例閾值就可以了。

    現在我們對sklearn.decomposition.PCA的主要引數做一個介紹:

    1)n_components:這個引數可以幫我們指定希望PCA降維後的特徵維度數目。最常用的做法是直接指定降維到的維度數目,此時n_components是一個大於1的整數。當然,我們也可以指定主成分的方差和所佔的最小比例閾值,讓PCA類自己去根據樣本特徵方差來決定降維到的維度數,此時n_components是一個(0,1]之間的數。當然,我們還可以將引數設定為"mle", 此時PCA類會用MLE演算法根據特徵的方差分佈情況自己去選擇一定數量的主成分特徵來降維。我們也可以用預設值,即不輸入n_components,此時n_components=min(樣本數,特徵數)。

    2)whiten :判斷是否進行白化。所謂白化,就是對降維後的資料的每個特徵進行歸一化,讓方差都為1.對於PCA降維本身來說,一般不需要白化。如果你PCA降維後有後續的資料處理動作,可以考慮白化。預設值是False,即不進行白化。

    3)svd_solver:即指定奇異值分解SVD的方法,由於特徵分解是奇異值分解SVD的一個特例,一般的PCA庫都是基於SVD實現的。有4個可以選擇的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。randomized一般適用於資料量大,資料維度多同時主成分比例又較低的PCA降維,它使用了一些加快SVD的隨機演算法。 full則是傳統意義上的SVD,使用了scipy庫對應的實現。arpack和randomized的適用場景類似,區別是randomized使用的是scikit-learn自己的SVD實現,而arpack直接使用了scipy庫的sparse SVD實現。預設是auto,即PCA類會自己去在前面講到的三種演算法裡面去權衡,選擇一個合適的SVD演算法來降維。一般來說,使用預設值就夠了。

    除了這些輸入引數外,有兩個PCA類的成員值得關注。第一個是explained_variance,它代表降維後的各主成分的方差值。方差值越大,則說明越是重要的主成分。第二個是explained_variance_ratio_,它代表降維後的各主成分的方差值佔總方差值的比例,這個比例越大,則越是重要的主成分。

舉例:

1、我們先不降維,只對資料進行投影,看看投影后的三個維度的方差分佈,程式碼如下:

from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_

輸出如下:

[ 0.98318212  0.00850037  0.00831751]
[ 3.78483785  0.03272285  0.03201892]

可以看出投影后三個特徵維度的方差比例大約為98.3%:0.8%:0.8%。投影后第一個特徵佔了絕大多數的主成分比例。

2、現在我們看看不直接指定降維的維度,而指定降維後的主成分方差和比例。

pca = PCA(n_components=0.95)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_

我們指定了主成分至少佔95%,輸出如下:

[ 0.98318212]
[ 3.78483785]
1

3、最後我們看看讓MLE演算法自己選擇降維維度的效果,程式碼如下:

pca = PCA(n_components='mle')
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_

輸出結果如下:
[ 0.98318212]
[ 3.78483785]
1