Linux環境でPython、機械学習を使って手書き文字を識別する
基本的には以下のサイトの通りに(言われるがままに)やっみた。
【機械学習】Python3 + scikit-learn で識別率99%の手書き数字の分類器を作った - 株式会社クイックのWebサービス開発blog
自分の環境はUbuntu 16.04 LTS
環境構築
1.apt-get使ってぱーっと入れる。
sudo apt-get install python3 python-dev python3-pip
sudo apt-get install virtualenv
sudo apt-get install python-pip
2.
mkdir image_classify
cd image_classify
virtualenv -p python3 env
source env/bin/activate
3.
教師データは↓のものを使うよ
MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges
# sudoで実行しない pip install numpy pip install scipy # 先にライブラリを入れておく sudo apt-get install gfortran liblapack-dev pip install scikit-learn
4.
# データを入れておく場所 mkdir data cd data wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
5.
gzip -dc train-images-idx3-ubyte.gz | od -An -v -tu1 -j16 -w784 | sed 's/^ *//' | tr -s ' ' > train-images.txt gzip -dc train-labels-idx1-ubyte.gz | od -An -v -tu1 -j8 -w1 | tr -d ' ' > train-labels.txt gzip -dc train-images-idx3-ubyte.gz | od -An -v -tu1 -j16 -w784 | sed 's/^ *//' | tr -s ' ' > test-images.txt gzip -dc train-labels-idx1-ubyte.gz | od -An -v -tu1 -j8 -w1 | tr -d ' ' > test-labels.txt
6.
適当にimage.pyみたいなの作って以下のコードをかく
#!/usr/bin/env python
import numpy as np
from sklearn.ensemble import RandomForestClassifier
# learninig data
data_training = np.loadtxt('data/train-images.txt', delimiter=' ')
label_training = np.loadtxt('data/train-labels.txt')
# test data
data_test = np.loadtxt('data/test-images.txt', delimiter=' ')
label_test = np.loadtxt('data/test-labels.txt', delimiter=' ')
# learn
#estimator = LinearSVC(C=1.0)
estimator = RandomForestClassifier()
estimator.fit(data_training, label_training)
# test
print(estimator.score(data_test, label_test))
7.
ターミナルで
python image.py
とかやると
0.9990166666666667
と出てきた。とりあえずやってみた感が強いので、明日あたりにちゃんと理解して編集、更新します。