前回手書き数字データについてイメージで確認した結果、人の目で確認する分には区別ができる。では機械学習ではどのように実施していくのか。
今回は以下の内容について説明する。
- 多様体学習による次元縮約
- ナイーブベイズによる分類
多様体学習による次元縮約
さてこのイメージデータは64次元であり、取り扱うには不便である。そこで次元縮約により2次元に落とす。次元縮約といえばPCAであるが、残念ながらPCAの前提はデータが線形であること。イメージのデータ、つまりバイナリであることから、線形を仮定するには無理がある。非線形の次元縮約に利用できるのが多様体の学習(Manifold Learning)である。
2.2. Manifold learning — scikit-learn 0.21.3 documentation
多様体学習のアルゴリズムとしてはいくつかあるが今回はIsomapを利用する。
from sklearn.datasets import load_digits digits = load_digits() from sklearn.manifold import Isomap iso = Isomap(n_components=2) # 次元縮約 n_components=2を指定にする。 iso.fit(digits.data) # 次元縮約 data_projected = iso.transform(digits.data) # 縮約されたデータ data_projected.shape # (1797,2)
Isomapの結果、各イメージデータは2次元に縮約されていることがわかる。
次のこのデータを2次元でプロットし、データが区別されているかを確認する。Isomapの結果から取得した2次元データをそれぞれX, Y軸でプロットする。数字データにより色分けをする。
import matplotlib.pyplot as plt import matplotlib.cm as cm %matplotlib inline plt.style.use('seaborn-darkgrid') plt.scatter(data_projected[:, 0], data_projected[:, 1], c=digits.target,alpha=1, cmap = cm.Accent) plt.colorbar(ticks=range(10))
数字の分類
手書き数字を分類する。正解データが存在しているので教師ありモデルのナイーブベイズを利用する。
データを訓練用および検証用に分割する。
from sklearn.model_selection import train_test_split X = digits.data y = digits.target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
次に、ナイーブベイズモデルを構築する
from sklearn.naive_bayes import GaussianNB model = GaussianNB() model.fit(X_train, y_train) y_model = model.predict(X_test)
最後にモデルを検証する。
from sklearn.metrics import accuracy_score accuracy_score(y_test, y_model) # 0.8333333333333334
結果として最も単純な分類アルゴリズムでありナイーブベイズであっても83%という高い制度であることが分かった。