sklearnで手書き文字認識
Python Advent Calendar 2013 - Adventar、20日目の記事です。
pythonの機械学習ライブラリのsklearnが便利。
ドキュメントも充実してるし、機械学習のアルゴリズムに詳しくなくても手軽に使えるので、動かしながら勉強できる。
↓ sklearnでできること(一部)
データセット | sklearn.datasets |
---|---|
クラスタリング | sklearn.cluster |
クロスバリデーション | sklearn.cross_validation |
行列の分解(PCA等) | sklearn.decomposition |
アンサンブル学習 | sklearn.ensemble |
線形モデル | sklearn.linear_model |
モデル評価 | sklearn.metrics |
近傍法 | sklearn.neighbors |
SVM | sklearn.svm |
決定木 | sklearn.tree |
今回はデータセットの手書き文字を、SVMとか使って画像認識をやってみた。
pythonの機械学習ライブラリsklearnで手書き文字の画像認識をやってみた。
手書き文字の準備
まずは、sklearnのデータセットから手書き文字をロードする。データセットは8x8の画像が1797枚。それぞれに0〜9のラベルがついている。
from sklearn import datasets images = datasets.load_digits() # 学習データ data = images.data # 教師データ(ラベル) target = images.target
images.dataは64個の数値が入ったlistになっているけど、images.imagesは8x8のlistなので、pylabのimshowを使うと画像が表示できる。
imshow(images.images[0], cm.gray_r, interpolation='NONE')
↓出力
クロスバリデーション
学習データと教師データがロードできたので、トレーニング用とテスト用のデータを準備する。from sklearn import cross_validation # トレーニングデータとテストデータの準備。 X_train, X_test, y_train, y_test = cross_validation.train_test_split(data, target, test_size=0.2, random_state=0)
全体のデータの2割を検証用に使う。このあたりのデータの分け方をよしなにやってくれる。
SVM
判別器はSVMを使う。先ほど作ったX_train、y_trainで学習させて、X_testのラベルを予測する。from sklearn import svm # 判別器はSVMを使う。 classifier = svm.SVC(C=1.0, kernel='linear') # 学習 fitted = classifier.fit(X_train, y_train) # 予測 predicted = fitted.predict(X_test)
検証
sklearn.metricsを使って検証する。from sklearn import metrics
confusion_matrix()で予測したpredictedと正解データのy_testでクロスをとる。
print metrics.confusion_matrix(predicted, y_test) >> [[27 0 0 0 0 0 0 0 0 0] [ 0 34 0 0 0 0 1 0 1 0] [ 0 0 36 0 0 0 0 0 1 0] [ 0 0 0 29 0 0 0 0 0 1] [ 0 0 0 0 30 0 0 1 0 0] [ 0 0 0 0 0 39 0 0 0 1] [ 0 0 0 0 0 0 43 0 0 0] [ 0 0 0 0 0 0 0 38 0 0] [ 0 1 0 0 0 0 0 0 37 0] [ 0 0 0 0 0 1 0 0 0 39]]
スコアの計算は、accuracy_score()を使う。
metrics.accuracy_score(predicted, y_test)
>>
0.97777777777777775
kaggleで猫と犬の画像認識やってたから挑戦してみたいなー。