Number Recognizer

今回は、ブラウザ上に書いた手書きの数字を認識させます。具体的には、canvasに書かれた数字が0~9のどれであるかを当てさせます。
その予測を行うためのモデルを、以下のステップに沿って作成していきます。


In [1]:
# グラフが文章中に表示されるようにするおまじない
%matplotlib inline

Load the Data

scikit-learnには、最初から手書きの数字を認識するための学習データ(手書き数字の画像データと、その画像の数字が0~9の何れであるかという答えのセット)が搭載されているため、それを利用します。


In [2]:
from sklearn import datasets
digits = datasets.load_digits()

print(digits.data.shape)


(1797, 64)

1797は行数、64は次元数です。手書き文字の画像データが8×8のサイズであるため、その中のピクセル情報は64となります。


In [3]:
import matplotlib.pyplot as plt

plt.figure(1, figsize=(3, 3))
plt.imshow(digits.images[0], cmap=plt.cm.gray_r, interpolation='nearest')
plt.show()


Create the Model

今回扱うのは画像の分類問題になります。そこで、分類問題で非常によく使われるSupport Vector Machineを利用します。


In [4]:
from sklearn import svm

create_model = lambda : svm.SVC(C=1, gamma=0.0001)
classifier = create_model()

Training the Model

データとモデルがそろったため、学習させてみます。


In [5]:
classifier.fit(digits.data, digits.target)


Out[5]:
SVC(C=1, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0001,
  kernel='rbf', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)

Evaluate the Model

学習させたモデルの精度を計測してみます。predictで予測させることができるので、これで予測させた値と実際の答え(digits.target)を比べてみます。


In [6]:
from sklearn import metrics

predicted = classifier.predict(digits.data)
score = metrics.accuracy_score(digits.target, predicted)
print(score)


0.9816360601

Store the Model

最後に、学習させたモデルを保存します。アプリケーション側で、その結果を確認してみてください。


In [17]:
from sklearn.externals import joblib

joblib.dump(classifier, "./machine.pkl")


Out[17]:
['./machine.pkl',
 './machine.pkl_01.npy',
 './machine.pkl_02.npy',
 './machine.pkl_03.npy',
 './machine.pkl_04.npy',
 './machine.pkl_05.npy',
 './machine.pkl_06.npy',
 './machine.pkl_07.npy',
 './machine.pkl_08.npy',
 './machine.pkl_09.npy',
 './machine.pkl_10.npy',
 './machine.pkl_11.npy']

In [ ]: