実践型AIプログラミング特講 最終章その1 #40

実践型AIプログラミング特講  最終章その1 #40

今回は実践型AIプログラミング特講としての最終回を飾るべく、シリーズ集大成を書き記していこうと思います。中々最後まで読んでくださった方は少ないかとは思いますが最後まで責任を持って締めくくりたいと思います。最後もどうぞよろしくお願い致します。例に漏れず最後まで一読いただけると幸いです。

機械学習で業務を効率化しよう

業務システムへ機械学習を導入しよう

これまででは、機械学習やディープラーニングを行うプログラムを中心に学んできました。その機械学習やディープラーニングプログラムを業務システムのなかで利用する方法について学んでみましょう。その導入として、全体像と以降の節でどのように進めていくのかの概要を学びます。

既存の業務システムについて

世のなかには、さまざまな業務システムが存在しており、利用されている技術や言語、サーバー機成などもさまざまです。以下のような構成の業務システムに対して、機械学習を導入する方法について見ていきたいと思います。
・業務プログラム(Webアプリなど)
・バッチプログラム(夜間処理など)
・ユーザー
・業務DB

▲業務システム画像添付

ユーザーは業務プログラムにアクセスし、業務プログラムは業務DB にアクセスして必要な処理それとは別に、夜間処理を行うバッチプログラムが存在し、ユーザーが利用しない時間帯に業務DBに対する ETL(Extract/Transform/Load)処理を実施します。

業務システムへ機械学習を導入しよう

では、この業務システムに、機械学習を導入する場合、どのような構成にすれば良いのでしょうか。
以下のような基本構成にする方法について解説したいと思います。

▲画像業務システムに組み込んだ例
まず、夜間処理などにより、機械学習プログラムが業務 DB のデータを使って機械学習を行い、学習済みデータ(機械学習した結果をエクスポートしたもの)を生成します。
次に、業務システムは判定用プログラムを呼び出して判定用プログラムが学習済みデータを読み込み、機械学習の判定結果を返すというものです。これまででは、機械学習(ft)した後すぐに判定処理(predict) を実施しており、学習用データの保存や読み込みは行っていませんでした。また、判定用プログラムを Web アプリから利用することもありませんでした。さらに、利用するデータはCSVなどのテキストデータが多く、データベース(RDBMS) も利用していませんでした。
・学習済みデータの保存と読み込み方法(判定用プログラムと機械学習プログラムの分離も含む)
・判定用プログラムをWeb アプリから利用する方法
・学習用データとして、データベース(RDBMS) を利用する方法
本記事のシリーズを学ぶことにより、業務システムに機械学習を導入するイメージがグッと膨らむことでしょう。

機械学習で業務を効率化しよう

学習モデルの保存と読み込みについて

業務システムで機械学習を使う場合に、毎回データを学習させないといけないのでは、時間がかかり効率的ではありません。そこで、学習テデータの読み込みと保存の方法について学びます。

学習した分類器を保存して再利用する方法

これまで取り上げてきた機械学習プログラムでは、1つのプログラムのなかで、機械学習(it)し、その後すぐに判定処理(predict) を実施していました。しかし、実際の業務システムで使う場合、毎回プログラムを起動するたびに、データの学習から松めていてはレスポンスに時間がかかってしまいます。たとえば、ディープラーニングを行う場合 学習に何時間もかかることが多いので、学習をしてから判定処理をし、その後レスポンスを返すといのでは時間がかかりすぎてしまいます。
そのため、機械学習を業務で使う場合、下図の四角の囲み部分のような構成にするのが一般的です。

▲画像業務で使う一般的な機械学習の構成
具体的には、以下のような構成です。
・機械学習用プログラムと判定用プログラムを分離する
・機械学習用プログラムは、夜間処理などで学習を行い、学習済みデータを保存する
・判定用プログラムは、プログラム起動時に学習済みデータを読み込み、判定を行う
そこで本記事では、ライブラリーごとに学習済みのデータを保存したり、読み込んだりする方法を紹
介します。

scikit-learn で学習済みデータの保存と読み込み

保存と読み込みの方法を示すために、scikit-learn のサンプルデータを用いてみましょう。
まずは、保存する例です。

from sklearn import datasets, svm
import pickle
# アヤメのサンプルデータを読み込む
iris = datasets.load_iris()
# データを学習
clf = svm. SVC()
clf.fit(iris.data, iris.target)
# 学習済みデータを保存
with open(‘iris.pkl’, ‘wb’) as fp:
pickle.dump(clf, fp)

プログラムの末尾にある、pickle.dump0 関数に注目してみましょう。この関数を利用すると、分類器パラメーター、学習済みデータをファイルに保存します。続いて、保存した学習器を読み込んでテストしてみましょう。

from sklearn import datasets, svm
from sklearn.metrics import accuracy_score
import pickle
# 保存した学習済みデータと分類器を読み込む
with open(‘iris.pkl’, ‘rb’) as fp:
clf = pickle.load(fp)
# アヤメのサンプルデータを読み込み
iris = datasets.load_iris()
# 予測する
pre = clf.predict(iris.data)
# 正解率を調べる
print (accuracy_score (iris.target, pre))

すると、0.9733 と表示され、正しくアヤメデータを分類できていることが確認できます。ポイントは、pickle.load 関数です。この関数により、保存した分類器を読み込んで復元できます。

TensorFlow とKeras で学習済みデータの保存と読み込み

次に、TensorFlowと Keras を使った場合の例を確認してみましょう。ここでも同じように、scikit-learn に付属しているアヤメのデータを使ってみます。

from sklearn import datasets
import keras
from keras.models import Sequential
from keras. layers import Dense, Dropout
from keras.utils import to_categorical
# アヤメのサンプルデータを読み込む
iris =datasets.load_iris()
in_size = 4
nb_classes=3
# ラベルデータを One-Hot ベクトルに直す
x = iris.data
y = to_categorical (iris.target, nb_classes)
# モデルを定義(*1)
model =Sequential ()
model.add (Dense (512, activation=’relu’, input_shape=(in_size,)))
model.add (Dense (512, activation=’relu’))
model.add(Dropout(0.2))
model.add (Dense (nb_classes, activation=’softmax’))
# モデルを構築(*2)
model.compile(
loss=’categorical_crossentropy’,
optimizer=’adam’,
metrics=[‘accuracy’])
# 学習を実行(*3)
model.fit(x, y, batch_size=20, epochs=50)
# モデルを保存(*4)
model.save (‘iris_model.h5’)
# 学習済み重みデータを保存(*5)
model.save_weights(‘iris_weight.h5’)

Keras では、プログラム(※1)のようにモデルを定義して、(※2)で構築して、(※3)で学習するという流れです。そして、学習モデルと学習済み重みデーータを個別に保存する必要があります。(※4)のようにmodel.save) メソッドでモデルを保存し、(※5) の model.save_weights() メソッドで学習済みの重みデーータを保存します。続いて、Keras でモデルと重みデータを読み込んでテストしてみましょう。

from sklearn import datasets
from keras.models import load_model
from keras.utils import to_categorical
import keras
# アヤメのサンプルデータを読み込む
iris =datasets.load_iris()
in_size=4
nb_classes=3
# ラベルデータを One-Hot ベクトルに直す
x = iris.data
y=to_categorical (iris.target, nb_classes)
# モデルを読み込む(*1)
model =load_model(‘iris_model.h5’)
# 重みデータを読み込む(*2)
model.load_weights(‘iris_weight.h5’)
# モデルを評価(*3)
score = model.evaluate(x, y, verbose=1)
print (” E =”, score[1])

まずは、実行してみましょう。正しくモデルと学習済みの重みデータを読み込んで、正しく判定できています。
それでは、プログラムを確認してみましょう。プログラムの(※1)の部分で、モデルを読み込みます。そのために、load_model) 関数を使います。ここで読み込んだモデルは、すでに構築された状能能となっています。モデルを読み込んだら、(※2)の部分のように、load_weights() メソッドを利用して、学習済みの重みデータを読み込みます。
モデルと重みデータが読み込めたら、predict) メソッドでデータを予想したり、プログラムの(※3)の部分のように、evaluate() メソッドでデータを評価できるようになります。

本記事のまとめ

・学習済みのデータを保存しておいて、業務システムから読み込んで使うと効率が良い
・scikit-learn では、pickle を利用して保存と読み込みを行う
・TensorFlowと Keras では、モデルに備わっているメソッドを使って行う

いかがでしたでしょうか。実践的な内容は当たり前のように記述してきましたが、ここまでついてきてくださった皆様なら食らい付いて来れる方も少なくはないでしょう。ただ、これから記事を読み始めていただいた方や少し経験不足で何を言っているのか理解できなかった方も、少しずつでいいので検索し自己学習を継続して行ってみてください、その繰り返しの結果が皆様の実力になって現れてくるはずです。

次回の記事

プログラミングカテゴリの最新記事