目次
はじめに
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人) |
1 | 60 | 160 |
2 | 80 | 200 |
3 | 100 | 240 |
4 | 30 | 100 |
5 | 50 | 140 |
6 | 20 | 80 |
7 | 90 | 220 |
8 | 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]))
出力結果 : [ [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の扉を開けてみてはいかがでしょう?
次は防犯カメラなどの画像認識でもやってみようかな〜なんて考えてます。
では次回をお楽しみに♬