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()

実行結果

f:id:Yunos:20200506113617p:plain
LDAによる識別状況


識別率が低い理由として、データが混じりあっているところがあるためであると考えられる。

最後に

sklearnライブラリを使用することで、かなり簡単に識別器を実装することができました。
ライブラリは偉大だなと思いました。