Wekaでベイジアンネットワーク(2)


前回に続き「2. 与えられたデータセットを使ってネットワーク構造を学習する」の手順を説明します。

Wekaではベイジアンネットワークは分類器の一種です。
分類器とは、あるデータを少数のカテゴリに分類するもので、既知のデータから未知のデータを推測することが出来ます。
既知のデータを使って、分類器がデータを分類できるようにすることを「学習」といいます。
Weka Explorer を使うと分類器の学習と評価が出来ます。

例題として、ユーザの行動から予想される購入サービスを「分類」するという問題を考えます。
「集合知プログラミング」第7章、表1のデータを使います。
これは、あるウェブサイトでのユーザの行動と購入サービスを関連付けたものです。

操作の流れは以下のようになります。

  1. ユーザの行動とそのユーザが購入したサービスのデータを入力する
  2. 学習アルゴリズムを決定し、パラメータを入力する
  3. 分類対象となる項目(ここでは購入サービス)と評価方法を指定し、学習実行
  4. 評価レポートを見てその分類器を採用するか判断
  5. 良いものが得られるまでアルゴリズムとパラメータを変えて繰り返し

なお、Weka Explorer 上では分類器の作り方は分かりますが、実際に推測を行う事は出来ません。
別のツールを使うか、自分でプログラムを書くかする必要があります。

Weka Explorerを起動する

Wekaを起動後、「エクスプローラー」を起動します。

arff形式のファイルを作成する

まず、学習データを用意する必要があります。weka標準のarff形式で作成してみます。
作成したファイルは以下のような内容のテキストファイルです。% 以降はコメントです。
詳細はhttp://www.cs.waikato.ac.nz/~ml/weka/arff.htmlを参照下さい。

作成したファイルはこちらです。


@RELATION decision                                            % このデータに名前を設定する
@ATTRIBUTE referrer {slashdot,google,digg,kiwitobes,(direct)} % データの1列目:リファラ-
@ATTRIBUTE location {USA,France,UK,"New Zealand"}             % データの2列目:所在地:"New Zealand"は空白を含むので引用符が必要
@ATTRIBUTE readfaq {yes,no}                                   % データの3列目:FAQを読んだか
@ATTRIBUTE pages {yes,no}                                     % データの4列目:見たページ数:元のページ数が21以上だったらyesとする
@ATTRIBUTE choice {None,Premium,Basic}                        % データの5列目:選択したサービス

@DATA                                                         % 以下元データをカンマ区切りで列挙
slashdot,USA,yes,no,None
google,France,yes,yes,Premium
digg,USA,yes,yes,Basic
kiwitobes,France,yes,yes,Basic
google,UK,no,yes,Premium
(direct),"New Zealand",no,no,None
(direct),UK,no,yes,Basic google,USA,no,yes,Premium
slashdot,France,yes,no,None
digg,USA,no,no,None
google,UK,no,no,None
kiwitobes,UK,no,no,None
digg,"New Zealand",yes,no,Basic
slashdot,UK,no,yes,None
google,UK,yes,no,Basic
kiwitobes,France,yes,no,Basic

データの4列目は元データは数値ですが、数値データは取り扱えないので2値に書き換えてあります。
閾値は「集合知プログラミング」での指定に従っています。
※実は、Wekaの機能で似たことは出来ますが、閾値を指定することが出来なかったので今回は手で編集しました。

ファイルを読み込ませると、分類タブをクリックできるようになります。

アルゴリズムの選択

以下のような流れです。今回確率計算のアルゴリズムはデフォルトのままとし、説明を省略します。

  1. 分類器を選択→BayesNet
  2. 分類器の学習アルゴリズムを選択→今回はweka.classifiers.bayes.net.search.local.HillClimberを選択
  3. 学習アルゴリズムのパラメータを設定(学習アルゴリズム毎に異なるパラメータがある)

  4. 確率計算のアルゴリズムとパラメータを設定

学習アルゴリズムには色々な種類があります。詳しい説明はマニュアルを見てください。
weka.classifiers.bayes.net.search.local.HillClimber は以下の特徴を持ちます。

  1. 代表的な局所探索法である山登り法を使って、ネットワークの構造を探す
  2. ノードの集まりにおいてアークを追加したり削除したり、アークの向きを変えてみながら成績の良いものを探す
  3. 成績を評価するのにローカルな評価指標(local score metrics)を用いる

という意味です。次に weka.classifiers.bayes.net.search.local.HillClimber のパラメータについて説明します。

initAsNaiveBayes
最初に単純な構造(親が一個で残りが子。子同士はつながっていない)を仮定した上で探索を始める。Falseの時はアークが一本も無い状態から始める
markovBlanketClassifier
できあがりがマルコフブランケットになるように調整する
maxNrOfParents
あるノードの親が最大いくつまで出来るのを許可するか(少ないほど単純な構造)
scoreType
評価指標を選択します。マニュアルの"8.2 Local score based structure learning"に解説があります
useArcReversal
探索時にアークの向きの入れ替えも考慮するかどうか。falseの場合はアークを追加または削除するのみ

いくつか試した結果、この問題については以下の組み合わせが良いようです。

initAsNaiveBayes True
markovBlanketClassifier False
maxNrOfParents 1
scoreType BAYES
useArcReversal False

学習結果を確認

分類に使う項目が「choice」になっていることを確認して学習を開始します。

正答率68.75%という結果となりました。その他組み合わせでは正答率が3割程度のこともありますので、まずまずと言えます。
ちなみに、同じく分類器の一種である決定木の学習アルゴリズムであるJ48による結果は正答率75%でした。
学習データが少ないのでこんなものかも知れません。

なお、結果リストを右クリックして「グラフをビジュアル化」するとベイジアンネットワークの形を確認出来ます。

左上のアイコンからXML形式で保存することも出来ます。

今回はここまでです。

参考書籍


This entry was posted in 確率・統計. Bookmark the permalink.