[機器學習二部曲] Python實作—特徵工程: 如何在保留特徵貢獻下降低特徵維度?PCA降維!

一般來說,特徵數愈多,我們愈容易得到好的預測效果。然而,當特徵過多時,也容易對我們的運算造成龐大的負荷。上個單元,我們分享了特徵選擇(Feature Selection),透過各種方式,消除比較不重要的特徵。這個單元,我們要來聊聊如何在盡量保留特徵貢獻度下,透過降低特徵的維度以減少運算成本。

什麼是PCA?

相信對機器學習有初步認識的朋友,對於這個名詞並不陌生。PCA的全名其實是Principal Component Analysis,中文名稱為主成分分析。其主要概念是透過線性轉換,降低原始特徵的維度,並盡可能地保留原始特徵的差異性。

這樣說可能還是有點抽象,打個比方好了。如果我們今天要來猜測男生或女生,我們擁有身高、體重、職業、情緒管理、嗜好、年紀等等的特徵資料。因為身高跟體重一般來說會呈現正向關係,相似程度可能較高。想像一下,在PCA降維裡面,就可能可以把這兩個數據合而為一,以讓我們最終的特徵數量減少。這就是所謂的PCA降維,透過融合的方式,在盡量保持特徵貢獻度下減少特徵數量。

PCA背後的運作原理

現在,我們已經了解到,PCA就是一種在盡可能減少信息損失之下,透過降維來減少特徵數量的方法。那麼,它是怎麼做到的呢? 答案是—映射(Projection)! 在機器學習首部曲的SVM單元中,我們將特徵從低維度映射到高維度。而在這邊,我們則是反過來將特徵從高維度映射到低維度,並且要讓這些特徵的變異愈大愈好,因為這樣才能夠保持愈多的資訊。

因此,簡單來說,PCA就是一個最佳化問題,旨在找到讓映射後資料變異量最大的投影向量,方程式如下:

$$v=arg \ \ \max v^T Cv$$

而求解的方法,基本上就是透過協方差矩陣的運算,對其進行特徵值分解,並取出排名前幾大的特徵向量標準化後組成新的矩陣,最後將樣本跟這個矩陣進行運算得出轉化後的新樣本。

對背後數學原理有興趣的讀者,推薦可以閱讀這篇,數學部分講的滿詳細的。
機器/統計學習:主成分分析(Principal Component Analysis, PCA), Tommy Huang

PCA程式運行

先做個小提醒,在我們做PCA之前,最好先將特徵標準化後再進行,這樣比較不會因為scale的關係而影響投影的結果。

1.引入模組與準備資料

from sklearn.decomposition import PCA
from sklearn import datasets

今天,我們一樣採用大家所熟悉的鳶尾花資料及集。

iris=datasets.load_iris()
X=iris.data

2. PCA對特徵降維

pca=PCA(n_components=2)
pca.fit(X).transform(X)

其中,n_components代表我們希望留下的特徵維度,我們可以給定任意數值。另外,我們也可以給定’mle’讓演算法用最大概似法幫我們決定合適的components數量。

值得一提的是,如同前面所述,PCA旨在找到讓特徵映射後資料變異量最大的投影向量,屬於無監督式學習,所以在這裡我們只要fit特徵X即可。

3. 看PCA降維結果

看特徵數量: (注意,這是經過映射後的新特徵,而非原本特徵的刪除)
pca.n_components_

看新特徵的解釋能力:
pca.explained_variance_ratio_

把解釋能力累加起來,看看我們總共保留了多少特徵貢獻度。
np.cumsum(pca.explained_variance_ratio_)

PCA降維的優缺點

總括來說,PCA最大的優點就是可以盡可能在訊息損失極小化的情況下,透過降維的方式降低數據量,以降低之後建模的運算成本,並且避免維度災難等問題。
然而,在映射的過程中,透過特徵的融合,最後要解釋模型的時候會比較困擾,因為特徵已經是轉換過後的,而非原本純粹的特徵了。

今天,我們學會了減少特徵資料量的另一種方式,主成分分析(PCA)! 拿起你的資料,一起來試試看吧!

Share

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *