100日後にエンジニアになるキミ - 85日目 - プログラミング - 機械学習について10

昨日までのはこちら

[100日後にエンジニアになるキミ - 76日目 - プログラミング - 機械学習について](https://qiita.com/otupy/items/6a4f960ba4df06e27050)

[100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて](https://qiita.com/otupy/items/f53e2e7d16adf80b5acf)

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

今回は機械学習についてのお話の続き
ディープラーニングの実装です。

## ディープラーニングについて

ちょっとした説明は前回をみていただければと思います。

ざっくり、`ディープラーニング`は`ニューラルネットワーク`の
中間層を2層以上にしたものです。

scikit-learnにも`ニューラルネットワーク`のライブラリは存在します。

あやめの分類を行うコードは次のように実装できます。

```python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier

iris = load_iris()
X = iris.data
Y = iris.target
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
clf = MLPClassifier(solver="sgd",random_state=0,max_iter=10000)
clf.fit(x_train, y_train)

print (clf.score(x_test, y_test))
```
0.9555555555555556

ディープラーニングではこのニューラルネットを
どのように組むのかがポイントになります。

そのため専用のライブラリがいくつか存在します。

### ディープラーニングのライブラリについて

現在主流となっているディープラーニングのライブラリは
`TensorFlow`:Googleが開発をしているライブラリ
`Keras`:TensorFlowやTheanoといった他のディープラーニングのライブラリ上部で動くような作り
`Pytorch`:最近の最新論文の内容をPyTorchで実装して発表する研究者が多い

が挙げられます。
割と最近では`Pytorch`の例が増えてきたかなと思いますが、この3つの使い方を抑えておけば
良いのではないかと思います。

### Kerasでディープラーニングを実装

`Keras`を使ってディープラーニングを実装していきましょう。
`Keras`を使うにはインストールなどが必要なので
`TensorFlow`と一緒にインストールをしておきましょう。

インストールができたら実行です。
まずはデータを用意しておきます。

訓練用とテスト用でデータを分けておきます。

```python
import numpy as np
from sklearn.model_selection import train_test_split as split
from sklearn import datasets

iris = datasets.load_iris()
x_train, x_test, y_train, y_test = split(iris.data,iris.target,train_size=0.8,test_size=0.2)
```

これであやめのデータを用意できました。

次はニューラルネットワークを組みます。
まずは必要なライブラリを読み込みしておきます。

モデルを読み込みしたらそこに構造を追加していきます。
今回は中間層が32層あるようなモデルを組んでみます。

まず中間層が32個、入力層が4個のニューロンを指定します
それぞれの中間層には活性化関数にReLU関数を指定します。

出力層を3個に指定し、活性化関数にsoftmax関数を適用します

```python
from keras.models import Sequential
from keras.layers import Dense,Activation
 
# ニュートラルネットワークで使用するモデルの作成
model = Sequential()
model.add(Dense(32, activation = 'relu' , input_dim=4))
model.add(Dense( 3, activation = 'softmax'))
model.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
 
# 学習実行
model.fit(x_train,y_train,epochs=100)
```

これで学習は終わりです。
性能は・・・

```python
# 評価実行
score = model.evaluate(x_test,y_test,batch_size = 1)
print(score[1])
```
30/30 [==============================] - 0s 886us/step
0.9666666388511658

なかなかいいんじゃないでしょうか。

予測もしてみましょう。
一番大きな値のインデックス値を予測値に変換します。

```python
# 予測
predicts = model.predict(x_test)
print(predicts)

# 一番大きな値のインデックス値を取る
predict = [p.argmax()  for p in predicts]
```
[[1.1208696e-01 6.7907917e-01 2.0883384e-01]
 [2.8818967e-03 2.8327599e-01 7.1384215e-01]
 [9.5001817e-01 4.9240895e-02 7.4097671e-04]
 [7.4494570e-03 5.3676081e-01 4.5578974e-01]
 [4.5553190e-03 4.4827569e-01 5.4716897e-01]
 [9.0425771e-01 9.3258828e-02 2.4834664e-03]
 [9.8394436e-01 1.5963007e-02 9.2610091e-05]
 [9.3106699e-01 6.7388512e-02 1.5446048e-03]
 [2.9033832e-03 3.8279051e-01 6.1430609e-01]
 [7.6781757e-02 7.3785144e-01 1.8536681e-01]
 [9.0473723e-01 9.2504598e-02 2.7581297e-03]
 [2.3145874e-03 2.9854658e-01 6.9913888e-01]
 [1.1571125e-03 2.1894032e-01 7.7990258e-01]
 [3.8370032e-02 5.8638370e-01 3.7524620e-01]
 [1.8353970e-03 3.2460487e-01 6.7355973e-01]
 [4.0023820e-03 3.6881861e-01 6.2717897e-01]
 [9.3579787e-01 6.3313372e-02 8.8873273e-04]
 [2.8993792e-03 3.9125395e-01 6.0584664e-01]
 [1.7156457e-03 3.7600714e-01 6.2227720e-01]
 [5.9143644e-02 7.4147564e-01 1.9938073e-01]
 [4.4851364e-03 4.1915748e-01 5.7635736e-01]
 [2.1494372e-01 6.4855641e-01 1.3649981e-01]
 [7.4421586e-03 4.6687931e-01 5.2567846e-01]
 [4.7624888e-04 3.0563667e-01 6.9388705e-01]
 [9.5614207e-01 4.3193795e-02 6.6417205e-04]
 [5.6969654e-02 7.1488911e-01 2.2814126e-01]
 [2.0755678e-03 3.4245396e-01 6.5547043e-01]
 [9.3328977e-01 6.5471925e-02 1.2382563e-03]
 [1.8808943e-03 2.6230952e-01 7.3580956e-01]
 [9.6379587e-04 2.6067016e-01 7.3836607e-01]]

各カテゴリの数値の確率が出る形になるので、一番大きなものを正解としています。

正解と見比べてみましょう。

```python
for y_pred,y_true in zip(predict,y_test):
    print(y_pred,y_true)
```
1 1
2 2
0 0
1 2
2 2
0 0
0 0
0 0
2 2
1 1
0 0
2 2
2 2
1 1
2 2
2 2
0 0
2 2
2 2
1 1
2 2
1 1
2 2
2 2
0 0
1 1
2 2
0 0
2 2
2 2

1つを除いてあっていますね、すごい精度です。


## まとめ

本日はディープラーニングでの実装をお送りしました。
ディープラーニングは奥が深すぎて、自分も全然学習できていません。

今後もIT系のトレンドの中心であることは間違い無いので
勉強しておいても損することはないはずです。

是非抑えておきましょう。

君がエンジニアになるまであと15日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython