[機器學習二部曲] Python實作—特徵工程: 如何在考量標籤下進行降維? LDA!

一般來說,特徵數愈多,我們愈容易得到好的預測效果。然而,當特徵過多時,也容易對我們的運算造成龐大的負荷。在上個單元,我們分享了無監督式學習的PCA降維,目的在盡可能保留特徵最大變異性的情況下,藉由將特徵由高維度映射到低維度,達到降維的效果。在這個單元,我們要分享的是另一種降維方式,LDA。LDA與PCA非常相像,同樣都是透過映射將特徵由高維度轉換到低維度。不同的是,LDA同時考量了標籤(target),屬於監督式學習。PCA的目的在保留特徵最大的變異性,LDA的目的則是為了使降維後的資料點更容易被區分。本支影片簡單介紹LDA的概念,並分享在python中如何實作。

什麼是LDA?

LDA的全名為Linear Discriminant Analysis,中文叫做線性判斷式分析。LDA也是一種降維的演算法,在特徵過多的情況下透過LDA降維能夠有效的節省運算成本。LDA的降維方式亦是透過映射,將特徵由高維度轉換到低維度,並盡可能達到讓不同類別之間數據的差異更大,且縮小相同類別之間數據的距離,使的降維後的資料點更容易被區分。

從下圖中,我們可以明顯看到PCA與LDA映射方式的差異。PCA屬於無監督式學習,旨在保留特徵的變異性。而LDA屬於監督式學習,旨在讓降維後的數據有更好的區分。在這個案例中我們可以看到,假設我們現在只有兩個特徵,想透過降維的方式將這兩個特徵融合成一個特徵。在PCA中,為了讓所有樣本的特徵保持最大變異,因此會映射到綠色虛線上。而在LDA中,映射到紅色虛線上,我們可以清楚看到兩個類別特徵表現的差異。也就是說,在LDA的映射底下,不同類別之間的資料點會更分開,而相同類別之間的資料點會更緊密。

其背後運算就是要讓類別與類別之間的變異愈大愈好 (不同類別可用每個類別的中心點為代表),並且讓同一類別裡面的變異愈小愈好。詳細的數學推導歡迎參考以下這篇文章:

機器學習: 降維(Dimension Reduction)- 線性區別分析( Linear Discriminant Analysis),Tommy Huang

如何在Python裡實作LDA?

數學原理雖然較為複雜,但在python裡面,我們可以透過scikit-learn所提供的套件,直接對特徵進行LDA降維。

1.引入模組並準備資料

首先,我們要先引入一些模組,包含sklearn裡面的LDA與數據資料集。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn import datasets
import pandas as pd
import numpy as np

下載鳶尾花資料集:
iris=datasets.load_iris()
X=iris.data
y=iris.target

2.LDA降維

LDA=LinearDiscriminantAnalysis(n_components=2)
lda_x=LDA.fit_transform(X,y)

在這邊,n_components為我們欲降到的維度。比方說我們最後要把所有特徵融合成N個特徵,那n_components就設定等於N。

透過上方簡單2行程式碼,我們的LDA降維就輕鬆完成了!

3.降維結果

接下來,我們可以用上次所學到的explained_variance_ratio_,來看融合後特徵的貢獻度(每個選定部分對應特徵職所占百分比)。並且可透過cumsum()函數將它們累加起來,看到最後所保留的貢獻度。

LDA.explained_variance_ratio_
np.cumsum(LDA.explained_variance_ratio_)

LDA的優缺點

相較於PCA降維,LDA的優勢在於在降維的過程中可以使用類別的先驗知識,因此一般來說會更有利 (畢竟一般情況下監督式學習會優於非監督式學習)。然而,LDA也有一些限制,比方說最多只能降維到類別數-1的維度。另外,不論是LDA或是PCA都假設特徵為常態分配,因此對非常態分配的特徵來說降維效果不一定這麼好。

程式檔案,歡迎下載Github

延伸閱讀

特徵工程: 如何在保留特徵貢獻下降低特徵維度?PCA降維!

Share

發佈留言

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