天天看點

【阿旭機器學習實戰】【22】特征降維實戰---主成分分析(PCA)與線性判别分析算法(LDA)

【阿旭機器學習實戰】系列文章主要介紹機器學習的各種算法模型及其實戰案例,歡迎點贊,關注共同學習交流。

本文介紹了特征降維的兩種方式

主成分分析(PCA)與線性判别分析算法(LDA)

。并且通過鸢尾花實際案例詳細介紹了

直接減少特征模組化

使用PCA模組化

以及使

用線性判别分析算法進行模組化

這3種模組化方式對預測準确率結果的影響。

目錄

    • 1. 特征降維的主要目的
    • 2. 常見特征降維的算法是主成分分析:PCA
    • 3. PCA模組化與直接減少特征數模組化對比----鸢尾花資料集為例
      • 3.1 直接減少特征數目模組化
      • 3.2 不減少特征數目進行模組化
      • 3.3 交叉驗證--直接比較是否減少特征數目模組化的準确率
      • 3.3 用PCA算法進行資料降維--然後進行評估
    • 4. 監督學習算法的特征降維----線性判别分析算法(LDA)

1. 特征降維的主要目的

1)在實際的項目中經常會遭遇到特征次元非常高的樣本(比如圖檔),往往無法借助于自己領域的知識來建構有效的特征

2)在資料表現方面,我們無法觀測超過三維的資料

2. 常見特征降維的算法是主成分分析:PCA

PCA算法核心:把高次元的向量向低次元投影

1)去平均值,即每一位特征減去各自的平均值

2)計算矩陣協方差和特征向量與特征值

3)把特征值從小到大排序

4)保留前K個特征值對應的特征向量

5)将資料投影到這K個特征所構成的一個新的向量空間中

3. PCA模組化與直接減少特征數模組化對比----鸢尾花資料集為例

3.1 直接減少特征數目模組化

from sklearn import datasets
           
data = iris.data
target = iris.target
data[:4]
           
array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2]])
           
from sklearn.neighbors import KNeighborsClassifier
           
# 直接取前連個特征,舍去後面的兩個特征然後進行模組化
# 這裡沒有分析哪些特征是主成分,必然會造成主成分丢失
train = data[:,:2]
train[:2]
           
array([[5.1, 3.5],
       [4.9, 3. ]])
           
# 使用KNN算法進行模組化
knn = KNeighborsClassifier()
           
# 訓練模型
knn.fit(train,target)
           
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=5, p=2,
           weights='uniform')
           
# 模型在訓練資料上的準确度
knn.score(train,target)
           
0.8333333333333334
           

3.2 不減少特征數目進行模組化

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=5, p=2,
           weights='uniform')
           
0.9666666666666667
           

3.3 交叉驗證–直接比較是否減少特征數目模組化的準确率

交叉驗證法不需要訓練,直接傳入模型和訓練資料就可以輸出每一次劃分的準确率

from sklearn.model_selection import cross_val_score
           
array([0.74509804, 0.74509804, 0.77083333])
           
array([0.98039216, 0.98039216, 1.        ])
           

通過以上是否減少特征資料模組化後預測準确度我們發現,

不減少特征情況下模組化準确率達到97%以上

,而如果

直接取前兩個特征進行模組化,模型準确度隻有70%多

,準确率相差還是很大的,說明如果直接減少特征數目降維,會丢失很多有用的資訊,進而導緻準确率降低。

下面我們用主成分分析PCA的方法進行降維

,然後看其模型準确度如何

3.3 用PCA算法進行資料降維–然後進行評估

# 引入PCA算法
from sklearn.decomposition import PCA
# 建構2個特征
pca = PCA(n_components=2)
           
# 訓練階段通過主成分分析,找出主成分的特征空間
pca.fit(data)
           
PCA(copy=True, iterated_power='auto', n_components=2, random_state=None,
  svd_solver='auto', tol=0.0, whiten=False)
           
# 轉化階段把資料由原來的空間投影到主成分空間
train_pca = pca.transform(data)
           
# 交叉驗證計算每次模組化的準确率
cross_val_score(knn,train_pca,target)
           
array([0.98039216, 0.94117647, 0.97916667])
           

我們可以看到,

通過PCA方法進行模組化後,模型準确率與不減少特征直接模組化的準确率差不多,效果還是非常好的

4. 監督學習算法的特征降維----線性判别分析算法(LDA)

通過主成分分析PCA降維以後可以大大的提高監督學習算法的性能。

主成分分析PCA降維屬于無監督學習的一種降維方法

,下面介紹一種

監督學習算法的降維方法--LDA算法

。由于監督學習算法需要考慮标簽,是以它的效率低于PCA。

# 導入LDA算法--線性判别分析算法(linear discriminant analysis,LDA)
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
           
#建立lda模型
lda = LinearDiscriminantAnalysis(n_components=2)
           
# 訓練算法并轉化資料,借用上述例子中的鸢尾花資料
train_lda = lda.fit_transform(data,target)
           
array([1.        , 0.94117647, 1.        ])
           

可以發現,這種LDA的降維方法也是很好的,準确率相比于原始資料模組化相差不多。

如果内容對你有幫助,感謝記得點贊+關注哦!

歡迎關注我的公衆号:

阿旭算法與機器學習

,共同學習交流。

更多幹貨内容持續更新中…

繼續閱讀