KNIMEによる消費者行動予測-学習したモデルを保存して再利用する


前回のエントリで設定した問題の解決法について述べていきます。今回は

  1. 学習したモデルを保存して再利用する←ここ
  2. 作成したworkflowを持ち運べるようにし、さらに環境に依存する設定情報を外部化する
  3. メモリに載るだけのレコードに分割して処理する

について説明します。

動機・着想

消費者行動予測でクラス分類を利用する場合、当然ながら推論用データセットは学習用データセットとは異なります。
また、「予測モデルは最初に作成したものを何度か再利用する」という前提を置いていますので、
予測をする度に学習用データセットの読み込みとモデルを学習し直すのは時間の無駄となります。
そのため、KNIMEには学習したモデルそのものをファイルとして読み書きするノードがあります。(Model Reader/Model Writer)

これを使い、モデルを学習して保存するまでのワークフローは、データ読み出し>加工>学習>モデルを保存、という構造になりますが、モデルの精度を確認するために、簡単なホールドアウト検証(学習データを二つに分けて片方で学習、もう片方で推論を行う)を実現するノードも追加することにします。

また、KNIMEのナイーブベイズ学習は一つの目的変数しか取れないので、目的変数毎に同様のワークフローを並べます。

ワークフローの説明

以上を踏まえたワークフローは以下のようになります。

以下、各ノードについて説明します。

データ読み取り

Database Reader
RDBの接続先とselect文を設定しておくと、テーブル構造のデータを読みとることが出来ます。
今回PostgreSQLを使うことにしているので、対応するJDBCドライバをここなどから入手してKNIMEに登録しておく必要があります。メニューからFile>Preferencesを開き、KNIME以下のDatabase Driverという設定画面から登録が出来ます。登録が出来ると、Database Driverにorg.postgresql.Driverが選択出来るようになります。

データ加工

Number To String
指定した複数の数値型カラムを文字列型に変換します。Naive Bayes Learnerは数値型を扱うことが出来ません。基本的に年齢や日数など数値の離散化はRDB側で済ませる前提でしたが、0/1のいずれかを取るような項目(例えばPostgreSQLのBoolean型はtruefalseといった文字列ではなく数値の1または0に置き換わります)が残っていたので、ここで一括して処理しています
Partitioning
データを行方向に2分割するノードです。先頭100件と残りとか、ランダムに20%と80%に分割するといった指定が可能です。ここでは学習データの半分を検証用に使うためにランダムに50%ずつ分割する、ということをしています。
Column Filter
指定した項目を削除するノードです。学習データには参考情報として顧客IDといったカラムを含めてあります。これらは学習には使わないので取り除いておく必要があります。また、今回は目的変数を3つ用意しましたが、同時に推論出来るのは1つだけなので、これも除いておきます。
Naive Bayes Predictorに渡すデータにはColumn Filterが掛かっていませんが、こちらは学習に使われていない項目を無視してくれるのでFilterの必要はありません。逆に推論結果を出力して分析するときに顧客IDも必要となります。

データマイニング

Naive Bayes Learner
Classification Column(分類対象項目、目的変数)を指定すると、その他項目との組み合わせを集計して予測モデルを作成してくれます。Classification Column以外の項目が全て説明変数に使われるため、無関係なカラムはColumn Filterで除いておく必要があります。

モデル出力

Model Writer
Naive Bayes Learnerが学習したモデルをzip形式のファイルに保存することが出来ます。保存したモデルは、Model Readerというノードを使って読み出すことが出来ます。つまりNaive Bayes Learnerに代わってNaive Bayes Predictorにモデルを渡すことが出来ます。

検証

Naive Bayes Predictor
Naive Bayes Learnerが学習したモデルを使って推論を行います。推論結果として、Classification Columnの値がどれに分類されたか、というカラムが追加されます。またAppend probability value column per class instance というチェックボックスをオンにすると、Classification Columnが各値を取る確率を表わすカラムが追加されます。後段のLift Chartで必要になるのでオンにしておきます
Lift Chart
Lift Chartを説明するのは結構難しいのですが、要は予測の性能を確認することが出来るグラフです。例えば、購買の可能性が高い顧客の上位10%を取った時、その中で実際に購買した顧客が全体の60%含まれていたという見方をします。詳しくはこちら(英語の説明)などをご覧下さい。このノードでは以下3つを設定しなければなりません。

  • Column containing true labels : Naive Bayes Learnerで設定したClassification Columnを選択します。
  • Response Label : 予測結果を見るために、Classification Columnがどの値を取るかを一つ指定します。
  • Column containing score (probabilities) : Response Labelに対する予測の確率が入ったカラムを指定します。つまり、Naive Bayes PredictorがAppend probability value column per class instanceを指定した時に付与されるカラムを指定するのですが、カラム名はClassification Columnの値になります。例えばClassification Columnが購買の有無を"1"/"0"で表わすような項目だったとすると、「1」と「0」が選択肢に現れます。

おさらい

ここで説明出来たのは以下項目です。

  • PostgreSQLからデータを読み込む方法
  • Naive Bayesによる学習と推論の方法
  • 学習したモデルを読み書きする方法
  • 予測性能を確認する方法

ワークフローの左端に「メタノード」というのがありますが、これについては次のエントリでご説明したいと思います。
今回はここまでです。


This entry was posted in データマイニング. Bookmark the permalink.