KNIMEによる消費者行動予測-問題設定編-


以前、KNIMEというツールにまつわる記事を書きました。その時はほんの一部の機能だけを紹介しましたが、より実用的と言える利用法についてまとめたいと思います。

KNIMEについて

KNIMEを使うと、データマイニングのプロセス全体、つまり、データソースからデータを読み取り、何らかの加工を行い、分析を実行、結果をレポートしたり、ファイルに出力したり、といった諸々をGUIで設計し、実行することが出来ます。こうしたツールが無ければ手作業で複数のコマンドを実行したり、少なからぬプログラムを書かなければなりません。今後の説明のために、KNIMEの構造について簡単にご説明しておきます。

workflow

一連のデータマイニングプロセスをまとめる単位です。KNIMEは複数のworkflowを管理することが出来ます。

node

workflowにおける様々な操作が実装された単位。workflow上に複数の様々なnodeを組み合わせることでプログラムレスで多様なデータマイニングを設計することが出来ます。全てのnodeを紹介することは出来ませんが、以下のような種類が存在します。

  • ファイル入出力。CSVファイルの読み書きなどが出来ます。
  • データベース入出力。JDBCを介してRDBのテーブルを読み書き出来るものです。
  • データ操作。レコードのフィルタや離散化などデータを加工するためのものです。
  • データ閲覧。データを概観するためのグラフなどです。
  • 統計。検定や回帰分析を実行することが出来ます。
  • データマイニング。クラス分類やクラスタリングなどのメジャーなアルゴリズムを使うことが出来ます。
  • フロー制御。ループや条件分岐を実現することが出来ます。

また、ノードには5つの状態があり、信号のアイコンで区別することが出来ます。

  • 赤信号。設定が不十分またはエラーのため実行出来ない
  • 黄信号。設定が完了しているが未実行
  • 青信号。実行完了

後2つは信号ではありませんが、同じアイコン上で表現されます。一つは「実行中」で、アニメーションで動作中と分かるようになっています。もう一つは「待機中」です。実行を指示されたが前段のnodeが実行中の場合、前段のnodeが青信号になるまで、「queued」と表示されます。

flow variable

マニュアルにも詳細な使い方が載っていないのですが、大まかに言うとnodeの振る舞いを変えるための変数で、node間を受け渡しされます。

port

nodeには他のnodeと通信するためのインタフェースがついているのですが、これはportと呼ばれ、nodeから突き出た形をしています。入力が左側、出力が右側についており、通信されるデータによって異なる形状をしています。port同士をつなぐ事で直感的にデータと処理の流れを組み上げることが出来ます。portには以下の種類があるようです。簡単に紹介だけしておきます。

  • データ。表形式のデータが受け渡しされるイメージです。
  • モデル。学習と推論の二段階で計算を行うデータマイニングの手法において、二つを繋げる働きをします。
  • データベース接続。データベースの接続先と読み取りのSQLだけが受け渡されるイメージです。
  • flow variable port。上述したflow variableを受け渡すためのportです。どのnodeにもflow variableを入出力するportは存在しますが、ほとんどの場合隠されていて、表示させるための操作が必要です。

問題設定

ここから、KNIMEを使って実現したいworkflowについて説明します。といっても長くなりますので、今回は問題設定までとさせていただきます。

問題(Problem)

消費者の属性とさまざまな履歴情報を用いて、消費者が数ヶ月後にある行動をとるかを毎月予測したい。

この問題は「クラス分類」と見なすことが出来ます。一般に以下のプロセスを踏みますが、ここではKNIMEに実装されたナイーブベイズを使った学習と推論について説明します。

  1. 変数設計。予測に使うデータ項目(説明変数)と予測対象のデータ項目(目的変数)を定義します。
  2. 前処理。様々なデータソースを組み合わせて予測モデルの学習用データセットを作成します。同様に予測対象となる推論用データセットを作成することも必要です。
  3. 学習。目的変数と説明変数の関係性を過去の傾向から学習し、予測モデルを構築します。
  4. 推論。推論用データセットはほとんど学習用データセットと同じ構造ですが、目的変数が不明なままとなっているのが大きな違いです。過去の傾向から不明な目的変数を計算することを推論と呼び、これが行動を予測することに相当します。
  5. 評価。推論(予測)結果を受け取って何らかの分析や意志決定を行います。

クラス分類での予測は未来のある時点のみを対象とします。時間変化を知るには1ヶ月後、2ヶ月後など複数の時点の予測結果を組み合わせて見る必要があります。そこで、1ヶ月後、2ヶ月後、...に相当する複数の目的変数を用意することにします。

制約(Force)

さらに運用にまつわる制約として以下の前提を置きます。

  1. 複数の実行環境で使用する。開発者とオペレータが異なる、あるいは複数のオペレータを想定します。KNIMEはJavaで書かれているのでOSが異なるケースにも対応できます。今回はデータベース接続先が異なるという前提を置きます。
  2. 予測対象のレコードは数百万件程度。ビッグデータというには小さいですが、現在のデスクトップPCで扱うには少々大きく、KNIMEが利用するヒープメモリサイズが初期値の512MBでは全てがメモリに載らないことがあります。また、用意したPCの都合でメモリの拡張は出来ないものとします
  3. 予測モデルは最初に作成したものを何度か再利用する。新しいデータが増える度にモデルを更新することも出来ますが、学習のための準備に計算コストがかかるのと、モデルそのものの妥当性を追跡検証したいというのが理由です。
  4. 予測対象のデータはRDB(PostgreSQL)から読み出し、予測結果もRDBに書き戻すことにします。KNIMEはJDBC経由で大半のデータベースに接続することが出来ますが、PostgreSQLのドライバは同梱されていません。

解決策(Solution)

学習用と推論用のworkflowを用意します。作成のポイントは三つ。これらについてそれぞれエントリを書いていくつもりです。
[2013/7/23 追記:記事へのリンクを貼りました]

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

推論用のworkflowはこんな感じになります。

今回はここまでです。


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