最新のお知らせ

初心者の機械学習モデルの構築 by Tensorflow

はじめに

AIという言葉を聞いても現実にイメージするのはむずかしいと思います。
そこで、実際にモデルを作ってみて実感することの方が初めての方にはイメージがしやすいと思い、このチュートリアルを作ってみました。

AIといっても特別な機械が必要なわけではありません。お手持ちのパソコンでも構築が可能です。
まずは体験してみて、必要なことがあったらアレンジしてみるのが進歩の第一歩です。

あなたのコンピュータにanaconda navigator(アナコンダ ナビゲーター)がインストールされていなければ、まずインストールしてください。
公式サイトはhttps://www.anaconda.comです。

ここではanaconda navigatorのJupyterLaboを利用して機械学習を進めていきます。
anaconda navigatorやJupyterLaboの使い方についてはここでは詳しく述べませんが、チュートリアルの指示にそってコピペ→実行すれば完成するようにしてあります。

ここでおこなわれるのはある広告企業が広告の予算を使ってどれだけの利用者を増やしたというデータを元に予算を増やしたり減らしたりすることによって増減する利用者をAIで予測するということをやっています。

このチュートリアルはShadab Hussainさんの記事を参考にして解説しています。
興味がある方はhttps://shadabhussain.comに記事がありますので、是非閲覧してみてください。

必要なライブラリ

anaconda navigatorにはすでにインストールされていると思いますが、もしもインストールされていない場合はナビゲーターのスタート画面左のEnvironmentsからinstalled(インストール済み)で検索窓にTenとでも打ち込んで、下に出てくるライブラリにこの場合はTensorflowと出ていればインストール済みと確認できます。

もしも目的のものが入っていない場合はNot installedに切り替えて、ライブラリ名で検索して目的のライブラリの項目にあるチェックボックスにチェックを入れると最下部にApplyと出ますので、そこをクリックすればインストールされます。

今回利用するライブラリ

  • Tensorflow : テンソーフローまたはテンソルフローとも呼ばれる。多次元のデータ構造を流動的に処理ができるディープラーニングをするためのライブラリです。
  • numpy : ナムパイと呼ばれる。数値計算に用いられるライブラリです。
  • matplotlib : マットプロットリブと呼ばれる。numpyのために利用されるグラフ描画のライブラリです。

このライブラリは後の実践編でインポートして使いますので、必ず確認しておいてください。

初めての機械学習(実践編)

広告予算

($1000)

新規利用者

(1000人)

60 160
80 200
100 240
30 100
50 140
20 80
90 220
10 60

上記の表が元になるデータの表示です。
会社などで利用される表計算ソフトやデータベースと比較するとあまりにも小さいですが、大規模でも流用できますのでご安心ください。

JupyterLaboのFile→New→Notebookと進みセルの中にコードを随時コピペしたのちにShiftを押しながらreturnを押して進めてください。

エラーが発生するようでしたら、うまくコピーができていないかもしれませんのでスペルの先頭や最後尾を確認してください。 とくにPythonはインデントのエラーが発生することがありますから注意が必要です。

(1)

import tensorflow as tf 
import numpy as np
import matplotlib.pyplot as plt
 

まずは tensorflowをtfという記号でインポート。続いてnumpyはnpという記号で、matplotlibはpltという記号でインポート(利用)すると宣言します。

3つのライブラリをインポートしました。ライブラリとは色々な機能を提供するプログラムの塊とイメージしてください。

(2)

mar_budget    = np.array([60, 80,  100  , 30, 50, 20, 90,  10],  dtype=float)
subs_gained = np.array([160, 200, 240, 100, 140, 80, 220, 60],  dtype=float)

for i,c in enumerate(mar_budget):
  print("{} Market budget = {} new subscribers gained".format(c, subs_gained[i]))

mar_budgetとsubs_gainedという変数の中にデータの値を配列型式で生成します。
Shift+returnで下記のような文字が出てきたらここまでは成功です。


次は視覚化させてみます。

(3)

plt.scatter(mar_budget, subs_gained)
plt.xlim(0,120)
plt.ylim(0,260)
plt.xlabel('Marketing Budget(in thousand of Dollars)')
plt.ylabel('Subscribers Gained(in thousand)')
plt.show()

表として視覚化させるためにmatplotlibを使って加工します。
実行結果は以下のように出ましたか?

使われた予算とともに増加した利用者がドットで記されています。全てのドットをつなげれば線形の表示になりますが、より正確な線形を予測するための方程式を見つけさせて目に見える予測を出すのが目的となります。


(4)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(mar_budget,subs_gained,random_state=42, 
                                                    train_size=0.8, test_size=0.2)

ここでデータをトレーニングデータとテストデータに分離します。トレーニングデータはモデル(AIもしくはこのプログラム)をトレーニングするために利用し、テストデータは元になったデータです。

あとでトレーニングしたデータのラベル(増減した加入者)と元になったテストデータのラベルを比較して、このモデルのパフォーマンスを検証するために使います。

* このステップでは実行してもエラーがなければ何も表示されません。

(5)

layer_0 = tf.keras.layers.Dense(units=1, input_shape=[1])

次はレイヤーを作成します。
レイヤーとは階層のことです。このモデルは単純高密度なので単一のニューロンと単一の層のみを生成します。

tk.keras.layers.Denseからlayer_0という名でインスタンス化(実体化)して使用します。
input_shape=[1]はレイヤーの値が単一の値であることを指定しています。いわゆる一次元配列になっています。

units=1はレイヤーの中のニューロンの数を指定しています。
この数は多層の場合input_shapeと同じ数でなければいけません。
ニューロンとは神経単位をあらわし、AIの世界ではニューラルネットワークと呼ばれています。

これでレイヤーの作成ができたので、続いて以下のコードでレイヤーのリストを作ります。
ここではレイヤーは1つしかありませんが、リストを作ることで計算順序を指定する引数として指定します。

model = tf.keras.Sequential([
  tf.keras.layers.Dense(units=1, input_shape=[1])
])

上記のコードでレイヤーリストを引数としてmodelに代入しましたら、次のステップに移ります。

* このステップでは実行してもエラーがなければ何も表示されません。

 

(6)

model.compile(loss='mean_squared_error',
              optimizer=tf.keras.optimizers.Adam(0.1))

トレーニングする前にmodelをコンパイルする必要がありますので、まずはコンパイルして使えるようにします。

loss関数は予測が望んだ結果とどれだけ離れているかを測定する方法を提供します。
optimizer関数は内部値を調整して損失を減らす方法を提供してくれます。

kerasはtensorflowのバックエンドで働くラッパーライブラリです。
ここでは詳しく説明しませんが、面倒な記述を楽にしてくれているものと覚えておいてください。

Adam関数は最適化させる関数です。関数の機能はここで記述しませんが、学習係数を自動調整していく最適化関数の一つで過去の勾配と最新の勾配を元に各パラメータごとに学習率を調整するのが特徴です。

関数は無数にあります。とても便利なものがありますので英語文献が多いですが、眺めてみるのも面白いです。

* このステップでは実行してもエラーがなければ何も表示されません。


(7)

trained_model = model.fit(X_train, y_train, epochs=1000, verbose=False)
print("Finished training the model")

いよいよトレーニング本番です。
内部では計算→比較→調整とサイクルされてfitメソッドで制御されています。

カッコ内の最初の引数は入力、次の引数が目的の出力です。
トレーニングが完了すると以下の表示が出ます。

       Finish training the model

(8)

import matplotlib.pyplot as plt
plt.xlabel('Epoch Number')
plt.ylabel("Loss Magnitude")
plt.plot(trained_model.history['loss'])

fitメソッドで得られた履歴を元にmatplotlibを使って損失の減少過程を表示させます。
以下のように表示されたら成功です。


最初は急激に改善されて、あとはゆっくりと改善されていることが確認できました。

これで終了です。といきたいのですが、これでは一体何ができたのか? そして何ができるのか?
さっぱりですので、実際の使い方を説明します。

ステップ2でmar_budgetとsubs_gainedという変数を定義しました。
mar_budgetは広告予算で、subs_gaindは新規利用者を変数名という形で置き換えています。

今回トレーニングは完了していますので、実際に予算を増やしたら利用者がどれくらい増減するのかをみてみます。

(9)

print(model.predict([80.0]))
[ ]内の数値は80万ドルをあらわしています。では利用者の予測は以下のようです。

出力結果 : [ [200.66093] ]

正解は80✖️2➕40=200(千人)なので非常に近い数値を予測できています。

では次に元になったデータと予測したデータを表示して比較してみましょう。

y_pred = model.predict(X_test)
print('Actual Values\tPredicted Values')
print(y_test,'   ',y_pred.reshape(1,-1))


左は元になったデータです。右が予測値です。


(10)
パフォーマンスメトリックを使用して精度を確認してみます。

from sklearn.metrics import r2_score
r2_score(y_test,y_pred)

r2_scoreは決定係数とも呼ばれたりしますが、筆者も詳しくは理解していません。ただデータの比較をするためのメソッド程度です。r2_score( )のカッコの中に引数を入れて出力します。

出力結果 : 0.9952274626654819

ほぼ1に近いことから高精度に予測しています。

機械学習でおこなったことの確認

  • 高密度レイヤーを使ってモデルの作成
  • 3000例(6ペア・500エポック以上)でトレーニング
  • 正しい値を返せるまで変数(重み)を調整
  • テストデータ(元になったデータ)で検証
  • 元データと予測データの比較

もう少しレイヤーを増やせば限りなく1に近い高精度な予測は可能ですが、今回はここまでです。

おわりに

ひとくちにAIといっても映画に出てくるアンドロイドのような実態があるのであれば理解しやすいですが、機械学習・ディープラーニングなどの名称が出てくると頭がこんがらがってきます。

今のところデータの活用をコンピュータにさせる事ができる仕組みと理解しておけば間違いなさそうです。

今回はジュピターラボを使って説明の乏しい実践をやってみましたが、いかがだったでしょうか?
何事も興味を持って実際にやってみることの方が理解が深まるかと思います。
また新たなアイデアも浮かんでくるかもしれません。

筆者は機械学習を進めるたびに微分くらい真面目にやればよかったと数学音痴を実感してますが、いざとなればライブラリやメソッドの大まかな利用方法さえ理解していればなんとかなると開き直っています。

皆さんもよろしければこれを機会にAIの扉を開けてみてはいかがでしょう?
次は防犯カメラなどの画像認識でもやってみようかな〜なんて考えてます。
では次回をお楽しみに♬

 

 

ABOUT US

アバター
ハーレーとアウトドアが大好きで、日本の文化・伝統をこよなく愛する 男性です。サイト作成・PHP・Java・JavaScriptのプログラミングとweb ライティングを副業に、日々楽しんでいます。 1980年代にUnix.osに興味を持ち、linuxの開発にも少しばかり関わりました。 昨今のIT世界の進化を享受して頂き、少しでも誰かの役に立てればと奮闘しています。 このサイトはワードプレス を利用し、PHP言語でカスタマイズしており、私の趣味で公開しています。 閲覧には会員登録が必要ですが、全て無料ですので安心して閲覧してくください。  座右の銘は”座って半畳、寝て一畳” 所詮人間などそんなもんでしょうというところです。年齢や性別・学歴など不問。一緒に悩み・励まし・歩む、その様な仲間が増えることを願ってます。                           
%d人のブロガーが「いいね」をつけました。