2014-04-25 93 views
22

我想在維數爲m x n的矩陣上運行PCA,其中m是特徵數量和n樣本數量。如何使用scikit-learn PCA來減少特徵並知道哪些特徵被丟棄

假設我想保留具有最大方差的nf特徵。隨着scikit-learn我能夠做到這樣:

from sklearn.decomposition import PCA 

nf = 100 
pca = PCA(n_components=nf) 
# X is the matrix transposed (n samples on the rows, m features on the columns) 
pca.fit(X) 

X_new = pca.transform(X) 

現在,我得到的就有N×NF的形狀的新矩陣X_new。是否有可能知道哪些功能已被丟棄或保留的功能?

由於

+3

功能不會被丟棄,它們計劃於較小的尺寸和假設,以揭示不同特徵之間有趣的聯繫。 –

+0

謝謝湯姆,我認爲PCA可以用於特徵選擇,但是(如果我錯了,則是正確的)它僅用於重新調整主要組件上的數據。當你閱讀它時,我想我會結束這個問題。 – gc5

+1

你的輸出矩陣應該是'(n,nf)'形狀,而不是'(nf,n)'。 – eickenberg

回答

24

您的PCA物體在安裝時確定的功能位於pca.components_中。丟棄與pca.components_跨越的矢量空間正交的矢量空間。

請注意,PCA不會「丟棄」或「保留」您的任何預定義功能(由您指定的列編碼)。它將所有它們(通過加權和)混合以找到最大方差的正交方向。

如果這不是您正在尋找的行爲,那麼降低PCA降維並不是一種好的方法。對於一些簡單的通用功能選擇方法,您可以查看sklearn.feature_selection

+1

我終於明白了PCA的功能(希望)。如果特徵與主成分相關,是否有任何優選的相關函數來計算?通過這種方式,我認爲能夠在我的數據集中找到最具代表性的維度(糾正我,如果我錯了)。我可以使用皮爾遜還是餘弦相似? – gc5

+5

贊同理解PCA;) - 爲了能夠回答您的問題,我們需要非常清楚* feature *和* dimension *的含義。兩者都有可能混淆。您指定的功能是矩陣的列。爲了查看PCA組件0是否使用特性「i」,可以將'pca.components_ [0,i]'與'pca.components_ [0]'的其餘部分進行比較。所以如果我正確理解你的問題,那麼答案就是看一臺給定的PC,看看你的哪些功能具有最強的權重。 – eickenberg

+5

免責聲明:如果您根據主要組件中的權重選擇功能,您可能會或可能不會獲得有趣的內容。再一次地,PCA不是用於丟棄由規範軸定義的特徵。爲了確定你在做什麼,請嘗試使用'sklearn.feature_selection.SelectKBest'使用'sklearn.feature_selection.f_classif'或'sklearn.feature_selection.f_regression'來選擇'k'特徵,這取決於您的目標是數字還是分類 – eickenberg

2

投影特徵到主成分將保留的重要信息(與最大方差軸)和降軸具有小的差異。這種行爲就像compression(不放棄)。

而且X_projX_new更好的名字,因爲它是Xprincipal components

投影可以重建X_rec作爲

X_rec = pca.inverse_transform(X_proj) # X_proj is originally X_new 

這裏,X_rec接近X,但less important信息由PCA丟棄。所以我們可以說X_rec被去噪。我可以說the noise是放棄。

相關問題