［Python］10数行のコードで機械学習を実装（手書き文字の認識）

## 書いた内容
機械学習についてのメモ書き

## 機械学習とは？
>人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のこと
>（[Wikipedia](https://ja.wikipedia.org/wiki/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92)）

## 今回利用するライブラリ
**scikit-learn**
機械学習のライブラリ。下記のようなデータセットが用意されている。

① Iris（アヤメの計測データ）
② Boston house-prices (ボストン市の住宅価格)
③ Diabetes (糖尿病患者の診断データ)
④ Digits (数字の手書き文字)
⑤ Linnerud (生理学的特徴と運動能力の関係)

今回は **④ Digits (数字の手書き文字)** を利用

## コード例
```python:sample.py
#scikit-learnライブラリの読み込み
from sklearn import datasets,svm

#scilit-learnライブラリに付属しているデータセット"digits"を利用
digits = datasets.load_digits()

#データセット"digits"のうち、0番目のデータを8×8の行列に整形
print("-----digits['data'][0].reshape(8,8)----")
print(digits['data'][0].reshape(8,8))

#データセット"digits"の0番目のデータは、数字の0
print("-----digits.target----")
print(digits.target[0])

#サポートベクターマシン（というもの）を使って、分類
clf = svm.SVC()
clf.fit(digits.data,digits.target)

#仮に下記の"test_data"のようなデータは、どの数字に該当するか？を予測
test_data = [[0,1,2,0,1,2,3,4,0,1,2,0,1,2,3,4,0,1,2,0,1,2,3,4,0,1,2,0,1,2,3,4,0,1,2,0,1,2,3,4,0,1,2,0,1,2,3,4,0,1,2,0,1,2,3,4,0,1,2,0,1,2,3,4]]

print("-----予測----")
print(clf.predict(test_data))
```

```command:出力結果
-----digits['data'][0].reshape(8,8)----
[[  0.   0.   5.  13.   9.   1.   0.   0.]
 [  0.   0.  13.  15.  10.  15.   5.   0.]
 [  0.   3.  15.   2.   0.  11.   8.   0.]
 [  0.   4.  12.   0.   0.   8.   8.   0.]
 [  0.   5.   8.   0.   0.   9.   8.   0.]
 [  0.   4.  11.   0.   1.  12.   7.   0.]
 [  0.   2.  14.   5.  10.  12.   0.   0.]
 [  0.   0.   6.  13.  10.   0.   0.   0.]]

-----digits.target----
0

-----予測----
[5]
```

## 参考資料
[python14日目の素人だけどscikit-learnで機械学習やってみたい](https://qiita.com/wtnb93/items/d7a3eb2c3cc0b8c8086b)
（scikit-learnのデータセット"Iris"を利用した記事）

[Python でデータサイエンス](https://pythondatascience.plavox.info/scikit-learn/scikit-learn%E3%81%AB%E4%BB%98%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88)
（scikit-learnのデータセットをわかりやすく紹介されている記事）


## 追記(2018.02.07)
もう少し詳細に機械学習を実装すると...

① データを、訓練データ・テストデータに分割
② 予測
③ 予測値の評価

### コード例
ここでは、**アヤメの分類**を利用

```python:sample.py
from sklearn import datasets,svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

iris = datasets.load_iris()

##説明変数
print("--------")
print(iris.data)

##目的変数
print("--------")
print(iris.target)

##トレーニングデータとテストデータを分割
iris_data_train,iris_data_test,iris_target_train,iris_target_test = train_test_split(iris.data,iris.target,test_size=0.3)
print("----iris_data_train----")
print(iris_data_train)
print(len(iris_data_train))

print("----iris_data_test----")
print(iris_data_test)
print(len(iris_data_test))

print("----iris_target_target----")
print(iris_target_test)

svc = svm.SVC()
svc.fit(iris_data_train,iris_target_train)

iris_predict = svm.SVC().fit(iris_data_train, iris_target_train).predict(iris_data_test)

##予測
print("----predict----")
print(svc.predict(iris_data_test))

##予測結果の評価
print("----score----")
print(accuracy_score(iris_target_test,iris_predict))
```

### 追記の参考資料
[scikit-learn で回帰モデルの結果を評価する](https://pythondatascience.plavox.info/scikit-learn/%E5%9B%9E%E5%B8%B0%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A9%95%E4%BE%A1)

[Pythonで機械学習の一端に触れてみる](https://qiita.com/fukuit/items/b94e58191790bfce7f8b)