本文記錄使用sklearn庫實現有監督的數據降維技術——線性判別分析(LDA)。在上一篇LDA線性判別分析原理及python應用(葡萄酒案例分析),咱們經過詳細的步驟理解LDA內部邏輯實現原理,可以更好地掌握線性判別分析的內部機制。固然,在之後項目數據處理,咱們有更高效的實現方法,這篇將記錄學習基於sklearn進行LDA數據降維,提升編碼速度,並且會感受更加簡單。html
LDA詳細介紹與各步驟實現請看上回:LDA線性判別分析原理及python應用(葡萄酒案例分析)。python
學習以後能夠對數據降維處理兩種實現方法進行對比:服務器
這個函數與上一篇文章 運用sklearn進行主成分分析(PCA)代碼實現 裏是同樣的,plot_decision_region函數在分類結果區別決策區域中能夠複用。dom
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)
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使用了數據集的標籤,是有監督的學習。編碼
更準確來講,咱們要看模型在測試集上的效果,對好比下:spa
可見,通過邏輯迴歸分類器,提取了兩個最具線性判別性的特徵,將包含13個特徵的葡萄酒數據集投影到二維子空間,實現了精確地分類。.net
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在特徵提取方面更有優點。
這裏列出此次學習過程的博文記錄,方便查找:
個人博客園:運用sklearn進行線性判別分析(LDA)代碼實現
個人CSDN:https://blog.csdn.net/Charzous/article/details/108064317
版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:https://blog.csdn.net/Charzous/article/details/108064317