[sklearn] 手書き数字のデータセットから学習

まずmatplotlibとsklearnを入れます。

$ sudo pip3 install matplotlib
$ sudo pip3 install sklearn

scikit-learnに付属しているHandwritten Digits Data Setを使います。

import matplotlib.pyplot as plt

from sklearn import datasets
digits = datasets.load_digits()

d0 = digits.images[0]
print(d0)

$ python3 app.py
[[ 0. 0. 5. 13. 9. 1. 0. 0.]
[ 0. 0. 13. 15. 10. 15. 5. 0.]
[ 0. 3. 15. 2. 0. 11. 8. 0.]
[ 0. 4. 12. 0. 0. 8. 8. 0.]
[ 0. 5. 8. 0. 0. 9. 8. 0.]
[ 0. 4. 11. 0. 1. 12. 7. 0.]
[ 0. 2. 14. 5. 10. 12. 0. 0.]
[ 0. 0. 6. 13. 10. 0. 0. 0.]]

### 画像の学習

from sklearn.model_selection import train_test_split # 学習用データとテスト用データに分割
from sklearn import datasets, svm, metrics # データセット、SupportVectorMachine, metrics
from sklearn.metrics import accuracy_score

digits = datasets.load_digits()
x = digits.images # 画像
y = digits.target # 数字
x = x.reshape((-1, 64)) # 画像の二次元配列を一次元配列に変換

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

# データ学習
clf = svm.LinearSVC()
clf.fit(x_train, y_train)

y_pred = clf.predict(x_test) # 学習データを元にテスト画像から数字を予測
print(accuracy_score(y_test, y_pred)) # 答えと予想の精度を確認

92%の精度
$ python3 app.py
/usr/local/lib64/python3.6/site-packages/sklearn/svm/_base.py:977: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
“the number of iterations.”, ConvergenceWarning)
0.9277777777777778

手順としては、
(1)画像をピクセルの二次元配列データにして、データセットとラベルをセットに保存
(2)上記データセットを集める
(3)ピクセルの二次元配列を一次元配列に変換し、学習用データとテスト用データに分割する
(4)SVMで学習用データを学習
(5)テストデータから正解を予測
(6)制度をチェックする

### 学習済みデータの保存/呼び出し
※from sklearn.externals import joblibだとバインドされないので注意

import joblib
# 学習用データの保存
joblib.dump(clf, 'digits.pkl')

呼び出し

import joblib
clf = joblib.load("digits.pkl")

$ python3 app.py
0.9777777777777777

なるほど、OpenCVで画像を二次元配列にするわけだな
フローはほぼ理解した