0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

昨日までのはこちら

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?