福岡人データサイエンティストの部屋

データサイエンスを極めるため、日々の学習を綴っています。

【SVM】手書き文字識別やってみた【Python】



こんにちは!こーたろーです。


ちょっとブログにつかれてきたので、基礎トレーニングも混ぜながらやっていきます。


1年前に少しやりましたが、今回は別のモデルでやってみます。


手書き文字識別をSVMサポートベクターマシン)を使ってやってみます。


学生の練習にはうってつけですね。




データのロード



データは、UCIのデータになります。
UCI Machine Learning Repository


scikit-learn から呼び出せるため、それを使ていきます。

from sklearn import datasets
text = datasets.load_digits()

print(text.DESCR)



Descriptionを表示させるとこんな感じです。





データの数が1797枚(画像の枚数)、8×8(64)ピクセルのようです。


データの取り出し方としては、


[変数].images : 画像の情報
[変数].target  : 正解ラベル


で取り出すことができます。


画像を少し見てみます。

import matplotlib.pyplot as plt

for i in range (9):
    plt.subplot(3, 3, i+1)
    plt.title(str(text.target[i]))
    plt.imshow(text.images[i], cmap = "gray")

plt.show()






64ピクセルなだけあって、結構粗いことが分かります。


データの前処理



データは、既にできているので、機械学習できるように加工します。

from sklearn.model_selection import train_test_split

x = text.images
y = text.target
x = x.reshape((-1, 64))

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2)



各イメージ画像のデータをxに、正解ラベルをyに取り出します。


xラベルについては、機械学習のために、8×8の2次元になっているところを64の1次元に変換しておきます。


そして、学習データとテストデータに分けます。

モデルの作成と学習、評価



モデルの作成と学習、評価を行います。

from sklearn import datasets, svm, metrics
from sklearn.metrics import accuracy_score

model = svm.LinearSVC()
model.fit(x_train, y_train)

y_pred = model.predict(x_test)
accuracy_score(y_test, y_pred)



SVMの中の線形分類を行うSVCをつかって行います。





正答率としては、94%で識字できています。


64ビットで、これだけでれば十分かなと思います。


予測値と正解値をマトリックスで表示してみます。

import numpy as np
import pandas as pd

y_test = np.array(y_test)
y_pred = np.array(y_pred)

matrix = np.array([y_test,y_pred]).T
df = pd.DataFrame(matrix, columns = ["y_test","y_pred"] )
df



ごちゃごちゃしていますが、見やすいようにDataFrameで縦に並べてみました。





画像で見えている範囲は、全て正解していますね。


360データのうち、339個が正解のようです。


皆さんもやってみてください。


ではでは。


サポートベクターマシン入門