※ こちらの記事は以下2つの記事の続編となります、併せてお読みいただければ幸いです! ※
・ Tabpy Clientを使ってあらかじめ定義した関数をTableauから呼ぶ
・ 決定木モデルを使った機械学習とデータマイニングプロセスを体験しよう!
データマイニングのプロセスでは、多くの場合大量の過去データから機械学習によるモデルを作成し、作成したモデルを使って、結果がまだわからない未知のデータに対する予測を行います。この場合、「① 過去データを使って予測モデルを作る」タイミングと、「② 予測されたモデルを使って未知のデータに対する予測結果を得る」タイミングは実際には異なってくるわけです。
※イメージ図
「① 過去データを使って予測モデルを作る」
「② 予測されたモデルを使って未知のデータに対する予測結果を得る」
多くの場合、「① 過去データを使って予測モデルを作る」フェーズでは大量の過去データを利用する一方で、「② 予測されたモデルを使って未知のデータに対する予測結果を得る」では比較的少量のデータに対して予測を実施し、適切なアクションに繫げます。
ここで、毎回大量の過去データからモデルを作っていたのでは、時間がかかってしまい、現実的ではないので、一度学習モデルを作成しておいて、そのモデルを再利用し、テストデータをそのつど変更して予測結果を確認します。
Tableau + Python連携でも、Tabpy ServerにデプロイされたモデルをTabpy Client から呼び出すことで、一度作成して置いたモデルを再利用して、予測したいデータに対してのみ、そのつど予測結果を得ることができます。
前回の記事(決定木モデルを使った機械学習とデータマイニングプロセスを体験しよう!)では予測結果を事前にCSVファイルとして書き出し、これをTableau から可視化しました。バッチ処理で予測値を確認したい場合はこちらの方法でOKなのですが、更にTabpy Server連携を利用すると、フィルタの変更、パラメータの変更、画面のリフレッシュによってその都度予測結果の再計算が実行されるため、リアルタイムで変化する予測結果を取得したい場合は今回紹介するTabpy Server / Tabpy Client 連携の利用価値が出てきます。
今回は決定木モデルをサンプルに取り上げ、過去データから一度作成した予測モデルをTabpy Clientから再利用し、可視化して次のアクションに繫げるまでのステップを見ていきましょう。
ざっくりと説明すると以下のステップになります。
① 予測モデルの作成
過去データから予測モデルを作成します。Jupyter Notebookを使って決定木の予測モデルを作り、Tabpy Serverにデプロイし再利用可能とします。
② 予測モデルの利用
Tableau からTableau Serverにデプロイ済みのモデルを利用して予測結果を得て、可視化に利用します。
それでは早速やってみましょう!!
① 予測モデルの作成
まずは、Jupyter Notebookを使って予測モデルを作成します。過去データを使って予測モデルを作成します。決定木アルゴリズムを使った予測についてはこちら前回の記事を参照ください。引き続き、銀行のコールセンターのデータを使って、定期預金の申し込みをするかしないかを予測します。
(以下、詳細なステップについては添付のJupyter Notebookファイルを参照ください。)
こちらの記事の通り、max_depth =6(決定木のレベルの深さ)でモデルを作成した場合、予測に必要となる説明変数は’nr.employed’, ‘duration’, ‘pdays’, ‘cons.price.idx’ , ‘cons.conf.idx’ , ‘age’ , ‘emp.var.rate’, ‘contact_telephone’の8つであることが分かります。(ここでは何とか目検で頑張ります・・・)
これらの説明変数をインプットとする予測モデルを再作成します(もちろん利用可能な全ての説明変数をインプットとすることも可能ですが、次ステップでTableauからの入力としてすべての説明変数を計算式に指定しなければいけなくなってしまうため、ここでは簡単のため説明変数をピックアップしてモデルを作成することにします。)
Tabpy clientのインポートと接続先のTabpy ServerのIPアドレスとポートを指定します。
#tabpy clientのインポートと準備 import tabpy_client client = tabpy_client.Client('http://localhost:9004/')
Tabpy Serverにデプロイする関数を定義します。Tabpy Serverにデプロイする関数の定義方法についてはこちらの記事を参照ください。
#関数の定義 def clf6d(nr_employed, duration, pdays, cons_price_idx , cons_conf_idx , age , emp_var_rate,contact_telephone): #pandasのインポート import pandas as pd #入力変数をデータフレームとして格納 nr_employed = pd.DataFrame(nr_employed) duration = pd.DataFrame(duration) pdays = pd.DataFrame(pdays) cons_price_idx = pd.DataFrame(cons_price_idx) cons_conf_idx = pd.DataFrame(cons_conf_idx) age = pd.DataFrame(age) emp_var_rate = pd.DataFrame(emp_var_rate) contact_telephone = pd.DataFrame(contact_telephone) #入力変数を1つのデータフレームに連結 data=pd.concat([nr_employed, duration, pdays, cons_price_idx , cons_conf_idx , age , emp_var_rate,contact_telephone],axis=1) #作成したモデルを利用して予測値を取得 y_pred = clf6.predict_proba(data) #予測結果をリストとして返す return y_pred[:,1].tolist()
client.depoy で 作成したモデル “clf6d” を ”clf6d”という名前でデプロイします。
client.deploy('clf6d', clf6d, 'Decision Tree 6', override=True)
これで過去データから学習したモデルをTableauから利用できるようになりました。
② 予測モデルの利用
それでは次に、先ほどTableau Serverにデプロイした予測モデルをTableau から利用し、未知のデータに対して予測結果を取得してみましょう。たとえば、先ほど訓練データに利用したデータ構造と同じデータ構造で、目的変数だけがない(定期預金の申し込み有無の結果が分からない)テストデータがあるとします。これに対して学習したモデルを利用し、定期預金を申し込む確率を取得し、可視化に利用します。(簡単のため、カテゴリカルデータのダミー化は既に前処理として行われているとします。)
今回は予測に利用する説明変数以外にも顧客のマスターデータ(氏名、住所、年収等)が得られると仮定し、説明変数となるデータに顧客マスターデータを結合して、更にインサイトが得られるかどうかをトライしてみましょう。
目的変数(定期預金を申し込む確率)をデプロイされた関数を用いて取得する計算式を以下のように”@tabpy_query_clf6″という名前の計算式をTableauから定義します。実際の処理内容は既に定義済みなので、ここでは、tabpy.query(‘clf6’ … ) として呼び、入力としてメジャーを渡すだけですので、いたってシンプルです。
この計算式”@tabpy_query_clf6″(定期預金を申し込む確率)を使って実際に可視化を行っていきましょう。
顧客名を年収順に並べて、申し込み確率によって色を付けてみましょう。オレンジの濃い顧客が申し込み確率が高いことを表しています。もちろん申し込み確率の高い顧客のみをフィルタすることもできますね。
申し込み確率に影響を与えている”pdays(最終コンタクト日からの日数)” と “duration(コンタクト時間・秒数)”を軸とした散布図を書き、申し込み確率を色に、年収を大きさにドラッグして可視化を行います。傾向としては”duration”が短いと申し込み確率も低い(青色)ようです。可視化を行うと、年収が高くて(丸が大きくて)、申し込み確率の高い(オレンジ色の濃い)顧客は誰なのだろう?といったデータ探索ができますし、例えば、durationはとても長いのに、申し込み確率はそれほどでもない顧客の申し込み確率が低いのはなぜだろう?と飛び値を深堀りしてみることもできるでしょう。
また、顧客属性に位置情報が保存されているのであれば、これを利用して地図上にマップすることもできますね。年収を大きさ、申し込み確率を色にドラッグすると営業担当エリアの中に優良なプロスペクトいるか分かるかもしれません。この場合、中央区の「今泉 小百合」さんや、同じく中央区の「赤羽 優月」さんが有力なプロスペクトとなりそうです。
以上、Tablpy Clientの仕組みを利用して、学習済みのモデルをTableau から呼び出して予測結果を可視化する方法を紹介しました。時間のかかる予測モデルの学習処理は前もって実施しておいて、Tableau から再利用することでスムーズに予測結果を得ることができますね。訓練データが更新された場合や、予測モデルが改善された場合は、同じ名前で予測モデルをデプロイすれば、Tableauから同じインターフェイスで予測モデルを利用することができますし、予測結果は表計算のメジャーですので、今回ご紹介したい以外にも様々な可視化が考えられると思います。(注: 既に表計算となりますので、更なる表計算、LODには利用できないことは留意点です。)詳細は添付ワークブックを参照ください。
以上、ご参考になれば幸いです。