[Python] scikit-learn 機械学習入門

scikit-learnの超入門

チュートリアルの最初を理解するのに時間かかったので、覚書のためにも書いておく。

sklearnには既にサンプルとして、数字の認識のテスト問題と答えが入っている。
サンプルのSVM (Support Vector Machine) で学習させ、ペイントで雑に描いた下の数字を判断させる。

上の画像は9のつもりで描いた。最初は横長だったので、サイズを8x8 pixelsの正方形に変形した。歪になった。機械学習はこれをちゃんと9として判断してくれるだろうか。

コード

from sklearn import datasets
from sklearn improt svm
from PIL import Image
digits = datasets.load_digits()
clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(digits.data, digits.target)
img = Image.open(r'Path\to\Image.png')
rgb = list(img.getdata())
len(rgb) # 64
lum = [0.299*i[0]+0.587*i[1]+0.114*i[2] for i in rgb]
len(lum) # 64
clf.predict(lum) # array([1])

import numpy as np
import matplotlib.pyplot as plt
lum = np.array(lum)
lum.shape = 8,8
plt.imshow(lum)
plt.colorbar()
plt.show()


SVMの学習と予想

1-3行目はライブラリのimport。
4行目はscikit-learnにもとから入ってる数字群を呼び出した。
64の配列と、それに対応した数字が1797セット入っている。
もともと、上のような荒っぽい上のような画像と対応する数字(target)が1797セットある。画像の方は、8x8ピクセルあり、白黒なので、64ピクセルそれぞれの輝度0-16を一列に並べた、長さ64の配列が1797あることで1797枚の画像を表現している。
5行目はSVMを呼び出し。こんなのが出てくる。

 SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.001, kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False)
6行目は、各成0-16,で長さ64の配列と、対応する数字のペア1797個を学習させてる。
7行目は画像ファイルを呼び出し。今回の画像は自分で描きました。
8行目は画像ファイルのrgbを呼び出した。rgbは、[(r, g, b), (r, g, b), ..., (r,g,b)]というように、各ピクセルごとにタプルになって読み込まれる。
9行目。縦横8ピクセルずつなので、64の長さです。それぞれ3タプルあります。
10行目はLuminosity = 0.299R + 0.587G + 0.114B の 公式に従って、各ピクセルの輝度を読み込む。今回は白黒画像なのでR=G=Bなのだが、汎用性や後学のため。
11行目はlumの長さ。8x8サイズの白黒画像の輝度が64個入ってます。
12行目は学習したSVMで読み込んだ画像の数字を認識。9ではなく1になってしまった。

輝度から画像を表示

16行目でlistをnumpy.arrayに変換
17行目で64の長さの配列を8 x 8サイズに折り曲げる
18行目でカラーマップ作成。引数にcmap = cm.Greys_rを持たせると、グレースケールのマップになる。
plt.imshow(lum, cmap = cm.Greys_r)
19行目はなくてもよいが、ないと画像横のバーが出てこない。

参考文献



コメント