天天看點

用scikit-learn進行LDA降維

    線上性判别分析LDA原理總結中,我們對LDA降維的原理做了總結,這裡我們就對scikit-learn中LDA的降維使用做一個總結。

1. 對scikit-learn中LDA類概述

    在scikit-learn中, LDA類是sklearn.discriminant_analysis.LinearDiscriminantAnalysis。那既可以用于分類又可以用于降維。當然,應用場景最多的還是降維。和PCA類似,LDA降維基本也不用調參,隻需要指定降維到的維數即可。

2. LinearDiscriminantAnalysis類概述

    我們這裡對LinearDiscriminantAnalysis類的參數做一個基本的總結。

    1)solver : 即求LDA超平面特征矩陣使用的方法。可以選擇的方法有奇異值分解"svd",最小二乘"lsqr"和特征分解"eigen"。一般來說特征數非常多的時候推薦使用svd,而特征數不多的時候推薦使用eigen。主要注意的是,如果使用svd,則不能指定正則化參數shrinkage進行正則化。預設值是svd

    2)shrinkage:正則化參數,可以增強LDA分類的泛化能力。如果僅僅隻是為了降維,則一般可以忽略這個參數。預設是None,即不進行正則化。可以選擇"auto",讓算法自己決定是否正則化。當然我們也可以選擇不同的[0,1]之間的值進行交叉驗證調參。注意shrinkage隻在solver為最小二乘"lsqr"和特征分解"eigen"時有效。

    3)priors :類别權重,可以在做分類模型時指定不同類别的權重,進而影響分類模型建立。降維時一般不需要關注這個參數。

    4)n_components:即我們進行LDA降維時降到的維數。在降維時需要輸入這個參數。注意隻能為[1,類别數-1)範圍之間的整數。如果我們不是用于降維,則這個值可以用預設的None。

    從上面的描述可以看出,如果我們隻是為了降維,則隻需要輸入n_components,注意這個值必須小于“類别數-1”。PCA沒有這個限制。

3. LinearDiscriminantAnalysis降維執行個體

    在LDA的原理篇我們講到,PCA和LDA都可以用于降維。兩者沒有絕對的優劣之分,使用兩者的原則實際取決于資料的分布。由于LDA可以利用類别資訊,是以某些時候比完全無監督的PCA會更好。下面我們舉一個LDA降維可能更優的例子。

    完整代碼參加我的github: https://github.com/ljpzzz/machinelearning/blob/master/classic-machine-learning/lda.ipynb

    我們首先生成三類三維特征的資料,代碼如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
from sklearn.datasets.samples_generator import make_classification
X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2,
                           n_clusters_per_class=1,class_sep =0.5, random_state =10)
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
ax.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o',c=y)      

    我們看看最初的三維資料的分布情況:

用scikit-learn進行LDA降維

    首先我們看看使用PCA降維到二維的情況,注意PCA無法使用類别資訊來降維,代碼如下:

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)
plt.show()      

    在輸出中,PCA找到的兩個主成分方差比和方差如下:

[ 0.43377069  0.3716351 ]
[ 1.20962365  1.03635081]
      

    輸出的降維效果圖如下:

用scikit-learn進行LDA降維

    由于PCA沒有利用類别資訊,我們可以看到降維後,樣本特征和類别的資訊關聯幾乎完全丢失。

    現在我們再看看使用LDA的效果,代碼如下:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(X,y)
X_new = lda.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)
plt.show()      

    輸出的效果圖如下:

用scikit-learn進行LDA降維

    可以看出降維後樣本特征和類别資訊之間的關系得以保留。

    一般來說,如果我們的資料是有類别标簽的,那麼優先選擇LDA去嘗試降維;當然也可以使用PCA做很小幅度的降維去消去噪聲,然後再使用LDA降維。如果沒有類别标簽,那麼肯定PCA是最先考慮的一個選擇了。

(歡迎轉載,轉載請注明出處。歡迎溝通交流: [email protected])