sklearnを使用したLDA(Linear Discriminant Analysis:線形判別分析)の実装方法
はじめに
本記事では、sklearnのLDA(Linear Discriminant Analysis)のライブラリを使用してアヤメのクラス分離をしながら、LDAの実装方法を記述していく。
LDAとは?
複数の次元をもつデータを、データが持つ情報を保ちながら次元を減らし、データを分離する次元削除手法です。
例えば、2次元座標上に(a, b)、(c, d), (e, f)... と2次元の成分をもつデータの集まりがあるとします。まず、この集合内のデータを新たな軸に写像して、(a, b) → (x)、(c, d) → (y)、(e, f) → (z)... と新たな軸上で1次元の座標に変換します。このときに、1次元の座標が最もよく分離できる軸を見つけて、境界線を引くことでデータの判別を行います。
この新しい軸を見つけるための指標は、LDAでは座標が属するクラスとクラスの間の分散は最大にし、クラス内での分散は最小にすることで新しい軸を見つけます。
実装方法
1. データの読み込み
# 前処理 データセットのダウンロード %matplotlib inline from sklearn import datasets import numpy as np # アヤメデータセットを用いる iris = datasets.load_iris() # データセットのdict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']) # 例として、3,4番目の特徴量の2次元データで使用 # iristデータの特徴量['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']の3、4番目を使用 #x = iris.data[:, [2,3]] x = iris.data[:, [0,1]] #x = iris.data # クラスラベルを取得 # target_names : ['setosa' 'versicolor' 'virginica'] y = iris.target
2. LDAの識別器の学習と交差検証による識別率評価
# 識別器の設定 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.model_selection import cross_val_score lda = LinearDiscriminantAnalysis() lda.fit(x_train, y_train) score = lda.score(x_test, y_test) scores = cross_val_score(lda, x_test, y_test, cv=5) print('LDAの識別率:{}'.format(score)) print('交差検証による識別率の平均:{}'.format(np.mean(scores)))
実行結果
LDAの識別率:0.8 交差検証識別率:0.7333333333333333
識別状況の可視化
# データのプロット import matplotlib.pyplot as plt from mlxtend.plotting import plot_decision_regions # データの可視化 plt.style.use('ggplot') # trainデータとtestデータを連結 x_combined_std = np.vstack((x_train, x_test)) y_combined = np.hstack((y_train, y_test)) fig = plt.figure(figsize=(13, 8)) plot_decision_regions(x_combined_std, y_combined, clf=lda, res=0.02) plt.show()
実行結果
識別率が低い理由として、データが混じりあっているところがあるためであると考えられる。
最後に
sklearnライブラリを使用することで、かなり簡単に識別器を実装することができました。
ライブラリは偉大だなと思いました。