忘れないようにメモっとく

機械学習とかプログラミングとか。

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で手書き文字の画像認識をやってみた。

f:id:Akiniwa:20131220113036p:plain
f:id:Akiniwa:20131220113044p:plain

手書き文字の準備
クロスバリデーション
SVM
検証


手書き文字の準備

まずは、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')

↓出力
f:id:Akiniwa:20131220114119p:plain


クロスバリデーション

学習データと教師データがロードできたので、トレーニング用とテスト用のデータを準備する。

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で猫と犬の画像認識やってたから挑戦してみたいなー。