運用sklearn進行線性判別分析(LDA)代碼實現


基於sklearn的線性判別分析(LDA)代碼實現

一、前言及回顧

本文記錄使用sklearn庫實現有監督的數據降維技術——線性判別分析(LDA)。在上一篇LDA線性判別分析原理及python應用(葡萄酒案例分析),我們通過詳細的步驟理解LDA內部邏輯實現原理,能夠更好地掌握線性判別分析的內部機制。當然,在以后項目數據處理,我們有更高效的實現方法,這篇將記錄學習基於sklearn進行LDA數據降維,提高編碼速度,而且會感覺更加簡單。

LDA詳細介紹與各步驟實現請看上回:LDA線性判別分析原理及python應用(葡萄酒案例分析)

學習之后可以對數據降維處理兩種實現方法進行對比:

  1. 無監督的PCA技術:主成分分析PCA數據降維原理及python應用(葡萄酒案例分析)
  2. 有監督的LDA技術:LDA線性判別分析原理及python應用(葡萄酒案例分析)

二、定義分類結果可視化函數

這個函數與上一篇文章 運用sklearn進行主成分分析(PCA)代碼實現 里是一樣的,plot_decision_region函數在分類結果區別決策區域中可以復用。

def plot_decision_regions(x, y, classifier, resolution=0.02):
    markers = ['s', 'x', 'o', '^', 'v']
    colors = ['r', 'g', 'b', 'gray', 'cyan']
    cmap = ListedColormap(colors[:len(np.unique(y))])
 
    x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1
    x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
    z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    z = z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap)
 
    for idx, cc in enumerate(np.unique(y)):
        plt.scatter(x=x[y == cc, 0],
                    y=x[y == cc, 1],
                    alpha=0.6,
                    c=cmap(idx),
                    edgecolor='black',
                    marker=markers[idx],
                    label=cc)

三、10行代碼實現葡萄酒數據集分類

sklearn依然實現了LDA類方法,我們只需要直接調用而無需自己實現內部邏輯,這樣顯得更加方便。所以,10行代碼實現也不為過,重點需要先理解內部邏輯原理。

關鍵代碼如下:

lda = LDA(n_components=2)
lr = LogisticRegression()
x_train_lda = lda.fit_transform(x_train_std, y_train)  # LDA是有監督方法,需要用到標簽
x_test_lda = lda.fit_transform(x_test_std, y_test)   # 預測時候特征向量正負問題,乘-1反轉鏡像
lr.fit(x_train_lda, y_train)
plot_decision_regions(x_train_pca, y_train, classifier=lr)
plt.xlabel('LD1')
plt.ylabel('LD2')
plt.legend(loc='lower left')
plt.show()

使用訓練集擬合模型之后,分類效果如何呢?

 

可以看到模型對訓練數據集精確地分類,比PCA效果好,因為LDA使用了數據集的標簽,是有監督的學習。

更准確來說,我們要看模型在測試集上的效果,對比如下:

可見,經過邏輯回歸分類器,提取了兩個最具線性判別性的特征,將包含13個特征的葡萄酒數據集投影到二維子空間,實現了精確地分類。

四、完整代碼

from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
 
 
def plot_decision_regions(x, y, classifier, resolution=0.02):
    markers = ['s', 'x', 'o', '^', 'v']
    colors = ['r', 'g', 'b', 'gray', 'cyan']
    cmap = ListedColormap(colors[:len(np.unique(y))])
    x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1
    x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
    z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    z = z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap)
 
    for idx, cc in enumerate(np.unique(y)):
        plt.scatter(x=x[y == cc, 0],
                    y=x[y == cc, 1],
                    alpha=0.6,
                    c=cmap(idx),
                    edgecolor='black',
                    marker=markers[idx],
                    label=cc)
 
 
def main():
    # load data
    df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None)  # 本地加載
    # df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',
    #                       header=None)  # 服務器加載
 
    # split the data,train:test=7:3
    x, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, stratify=y, random_state=0)
 
    # standardize the feature 標准化單位方差
    sc = StandardScaler()
    x_train_std = sc.fit_transform(x_train)
    x_test_std = sc.fit_transform(x_test)
 
    lda = LDA(n_components=2)
    lr = LogisticRegression()
    x_train_lda = lda.fit_transform(x_train_std, y_train)  # LDA是有監督方法,需要用到標簽
    x_test_lda = lda.fit_transform(x_test_std, y_test)  # 預測時候特征向量正負問題,乘-1反轉鏡像
    lr.fit(x_train_lda, y_train)
    plt.figure(figsize=(6, 7), dpi=100)  # 畫圖高寬,像素
    plt.subplot(2, 1, 1)
    plot_decision_regions(x_train_lda, y_train, classifier=lr)
    plt.title('Training Result')
    plt.xlabel('LD1')
    plt.ylabel('LD2')
    plt.legend(loc='lower left')
 
    plt.subplot(2, 1, 2)
    plot_decision_regions(x_test_lda, y_test, classifier=lr)
    plt.title('Testing Result')
    plt.xlabel('LD1')
    plt.ylabel('LD2')
    plt.legend(loc='lower left')
    plt.tight_layout()  # 子圖間距
    plt.show()
 
 
if __name__ == '__main__':
    main()

五、降維壓縮數據技術總結

至此,數據降維壓縮的技術學習告一段落,經過這次學習,我感覺到一次比較系統的學習會收獲更多,此次學習了主成分分析(PCA)和線性判別分析(LDA),這兩種經典的數據降維技術各有特點。

前者是無監督技術,忽略分類標簽,尋找最大化方差方向提取主成分;后者是有監督技術,訓練時候考慮分類標簽,在線性特征空間最大化類的可分性。應用場景也各有優勢,PCA在圖像識別應用好,LDA在特征提取方面更有優勢。

這里列出這次學習過程的博文記錄,方便查找:

  1. 主成分分析PCA數據降維原理及python應用(葡萄酒案例分析)
  2. 運用sklearn進行主成分分析(PCA)代碼實現
  3. LDA線性判別分析原理及python應用(葡萄酒案例分析)
  4. 運用sklearn進行線性判別分析(LDA)代碼實現

我的博客園:運用sklearn進行線性判別分析(LDA)代碼實現

我的CSDN:https://blog.csdn.net/Charzous/article/details/108064317

 

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/Charzous/article/details/108064317


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM