昨日までのはこちら
100日後にエンジニアになるキミ - 76日目 - プログラミング - 機械学習について
100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて
100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について
100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1
100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて
100日後にエンジニアになるキミ - 53日目 - Git - Gitについて
100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて
100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて
100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1
100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1
100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1
100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1
今回は機械学習についてのお話の続き
ディープラーニングの実装です。
ディープラーニングについて
ちょっとした説明は前回をみていただければと思います。
ざっくり、ディープラーニング
はニューラルネットワーク
の
中間層を2層以上にしたものです。
scikit-learnにもニューラルネットワーク
のライブラリは存在します。
あやめの分類を行うコードは次のように実装できます。
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
と一緒にインストールをしておきましょう。
インストールができたら実行です。
まずはデータを用意しておきます。
訓練用とテスト用でデータを分けておきます。
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関数を適用します
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)
これで学習は終わりです。
性能は・・・
# 評価実行
score = model.evaluate(x_test,y_test,batch_size = 1)
print(score[1])
30/30 [==============================] - 0s 886us/step
0.9666666388511658
なかなかいいんじゃないでしょうか。
予測もしてみましょう。
一番大きな値のインデックス値を予測値に変換します。
# 予測
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]]
各カテゴリの数値の確率が出る形になるので、一番大きなものを正解としています。
正解と見比べてみましょう。
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