Digit Recognizer Sample (A Beginner's Approach to Classification) を読んで勉強する

[Digit Recognizer の Tutorial](https://www.kaggle.com/c/digit-recognizer#tutorial) で紹介されている Notebook その 1 ([A beginner’s approach to classification](https://www.kaggle.com/archaeocharlie/a-beginner-s-approach-to-classification/notebook)) を読んで見て機械学習を勉強する。

# Introduction

* 数字の分類でベストな方法ではない
* 何をしたらいいかわからない人向け

```py
import pandas as pd
import matplotlib.pyplot as plt, matplotlib.image as mpimg
from sklearn.model_selection import train_test_split
from sklearn import svm
%matplotlib inline
```

* [pandas](https://pandas.pydata.org/): データ操作・分析のためのライブラリ
* [matplotlib](https://matplotlib.org/): グラフなどをプロットするためのライブラリ
* [scikit-learn](http://scikit-learn.org/stable/): 機械学習のためのライブラリ
* [svm](http://scikit-learn.org/stable/modules/svm.html)
    * Support Vector Machines
    * classification（分類）, regression（回帰）, outliers detection（外れ値検知）に使われる教師あり学習のモデル
    * 解説してくれている記事 -> [機械学習入門～ハードマージンSVM編～](https://qiita.com/pesuchin/items/c55f40b69aa1aec2bd19)

# Loading the data

* pandas の read_csv を使って DataFrame に train.csv を読み込む
    * DataFrame 2 次元データを分析するためのデータ構造のよう
    * ラベルをもつ行列
* 学習のために画像とラベルを分ける
* モデルの評価のため、train_test_split でデータをトレーニング用とテスト用に分割する
* 時間の節約のため、使用するデータは 5000 件のみ
* 数は自分でモデルを見て調整する

```py
labeled_images = pd.read_csv('../input/train.csv')
images = labeled_images.iloc[0:5000,1:]
labels = labeled_images.iloc[0:5000,:1]
train_images, test_images,train_labels, test_labels = train_test_split(images, labels, train_size=0.8, random_state=0)
```

* train_size ではなく、test_size を使えという warn が出るので引数を書き換える

# Viewing an Image

* numpy array と reshape を使って 1 次元画像データを 2 次元に変換する
    * [reshape についての記事](https://deepage.net/features/numpy-reshape.html)
* matplotlib で画像とラベルをプロットする

```py
i=1
img=train_images.iloc[i].as_matrix()
img=img.reshape((28,28))
plt.imshow(img,cmap='gray')
plt.title(train_labels.iloc[i,0])
```

* i の値を変えることで他のデータをチェックできる

# Examining the Pixel Values

* 画像は黒・白（0,1）ではなく、グレースケール（0-255）
* 画像の pixel の値をヒストログラムでプロットする

```py
plt.hist(train_images.iloc[i])
```

# Training our model

* sklearn.svm で vector classifier を作成する
* トレーニングデータを fit メソッドに渡して、モデルを訓練する
* テストデータを score メソッドに渡して、モデルを評価する
* 0 から 1 の浮動小数で精度が返される

```py
clf = svm.SVC()
clf.fit(train_images, train_labels.values.ravel())
clf.score(test_images,test_labels)
```

0.091 だった

# How did our model do?

* 10% 程度のひどい精度になっているはず
* ここでは簡単な方法から改善をしていく
* 真の黒白を使って画像を単純化していく
* pixel の値を 0 以外は全て 1 とする

```py
test_images[test_images>0]=1
train_images[train_images>0]=1

img=train_images.iloc[i].as_matrix().reshape((28,28))
plt.imshow(img,cmap='binary')
plt.title(train_labels.iloc[i])
```

* histogram を見ると 0, 1 になっていることが分かる

```py
plt.hist(train_images.iloc[i])
```

# Retraining our model

* 黒白に変換したデータを使って再トレーニングする

```py
clf = svm.SVC()
clf.fit(train_images, train_labels.values.ravel())
clf.score(test_images,test_labels)
```

0.86975 だった

# Labelling the test data

* competition に提出するために test.csv で予測して、結果を results.csv に出力する

```py
test_data=pd.read_csv('../input/test.csv')
test_data[test_data>0]=1
results=clf.predict(test_data[0:5000])
```

```py
df = pd.DataFrame(results)
df.index.name='ImageId'
df.index+=1
df.columns=['Label']
df.to_csv('results.csv', header=True)
```