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


はじめに

Wekaのベイズネットワークエディタおよび分類器(weka.classifiers.bayes.BayesNet)の使い方についてまとめます。
ベイジアンネットワークについてはWikipedia、またWekaについては公式ページおよびマニュアルを参照ください。

Wekaではベイジアンネットワークに関する以下機能が実装されています。

ベイズネットワークエディタ:
  • ネットワークを作成する
  • 作成したネットワークをXML形式で読み書きする
  • ノードに条件付き確率を与える
  • 証拠データを設定した時の各ノードの確率を求める
  • 確率分布に沿ってデータセット(.arff形式)を作成する
  • データセットを使った学習を行う
分類器:
  • データセットからネットワーク構造を学習する
  • 学習したネットワーク構造を検証する
  • 学習したネットワーク構造を図示する
  • ネットワーク構造をXMLファイルに出力する

これらを以下のユースケースに沿って操作してみます。

  1. 既知のモデルをGUIで構築する
  2. 与えられたデータセットを使ってネットワーク構造を学習する
  3. モデルに対する追加学習

今回は「1. 既知のモデルをGUIで構築する」の手順を説明します。

1. 既知のモデルをGUIで構築する

既知のモデルとして、「ベイジアンネットワーク概説」の例題を使います。

ホームズ君とワトソン君が非常に難しい難問を解いています。このように難しい問題でも、ホームズ君は、5割解けます。また、類似問題を模擬試験ですでに解いている場合は、ホームズ君は、9割解けます。ワトソン君は、それほど数学が得意ではなく、通常解ける割合が1割、模擬試験で既出でも4割の正答率です。ワトソン君は、かつてカンニングをしたことがあります。
ここで問題です。ワトソン君が問題を解きました。ワトソン君がカンニングをした可能性はどの程度でしょうか?

「ベイジアンネットワーク概説」ではこの文章に加えて、以下の仮定を置いています。

  • カンニングをする確率は1割
  • 二人は同時に模擬試験を受けるまたは受けない。模擬試験を受ける確率は5割
  • カンニングした時、ワトソンはホームズの答案を参照する。つまり正解率がホームズと等しくなる

以上を踏まえてモデルを作成し、例題を解いてみます。

[ノードを作成する]

ベイズネットワークエディッターを起動します。

最初に、ノードの詳細が見えるようにしておきます。Tools>Show Margins

それから、Edit>Add Nodeでノード追加画面を呼び出します。(またはエディタ上の空白箇所で右クリック>Add Node)

Nameは画面上に表示されます。日本語は通らないようです。また長すぎる場合は「1」「2」など番号が代わりに表示されます。
Cardinalityはノードが取り得る状態の数(2個以上)です。各状態は「Value1」「Value2」などの値を持ちます。

例題を説明するためのノードを以下の様に追加していきます。

Name Cardinality 説明
Holmes 2 ホームズ君が正解するかどうか
Watson 2 ワトソン君が正解するかどうか
Practice 2 二人が模擬試験を受けていたかどうか
Cunning 2 ワトソン君がカンニングをしていたかどうか

各ノードは、あるかないかの2値を取るので、それぞれYes,Noと呼ぶことにします。
が、私の環境では状態の追加、リネームをGUI上から行うことは出来ませんでした。
※ノードを右クリックした後のメニューから操作出来そうですが、反映されない。
そこで、一端保存したファイルを直接編集することにします。File>Save As から「examine.xml」という名前で保存しておきます。
このファイルをテキストファイルで開くと、
<OUTCOME>Value1</OUTCOME>
という箇所がノードの値を指しますので、Value1→Yes,Value2→No と置換して保存します。
File>Load からexamine.xmlを開き直して、作業を続けます。

[ノード間にリンクを設定する]

ベイジアンネットワークは有向グラフなので、向きがあります。これは原因→結果の関係を表わします。
ノードを右クリック>「Add Parent」>ノードを選択すると、選択したノードから右クリックしたノードに向かってリンク(矢印)が引かれます。

例題を説明するためには以下のリンクが必要です。

  • Practice→Holmes:模擬試験を受けるかどうかでホームズ君の正答率が変わる
  • Practice→Watson:模擬試験を受けるかどうかでワトソン君の正答率が変わる
  • Cunning→Watson:カンニングをしたかどうかでワトソン君の正答率が変わる

ノードの事前確率と条件付き確率を設定する

最後に、各ノードの確率を設定していきます。今回はこれらの確率を事前に知っているという前提です。親を持たないノードは単純に各値がどんな確率で現れるかを入力します。親を持つノードは、親の値毎の条件付き確率を入力します。


例題から読み取れた確率は以下のようになります。

Practice Yes:0.5
(No:0.5)
Cunning Yes:0.1
(No:0.9)
Holmes Yes|Practice=Yes:0.9
(No|Practice=Yes:0.1)
Yes|Practice=No:0.5
(No|Practice=No:0.5)
Watson Yes|Practice=Yes, Cunning=Yes: 0.9
(No|Practice=Yes, Cunning=Yes: 0.1)
Yes|Practice=Yes, Cunning=No: 0.4
(No|Practice-Yes, Cunning-No: 0.6)
Yes|Practice-No, Cunning-Yes: 0.5
(No|Practice-No, Cunning-Yes: 0.5)
Yes|Practice-No, Cunning-No: 0.1
(No|Practice-No, Cunning-No: 0.9)

例題の答え

例題では、ワトソンが正答した時に、カンニングしたかどうかの確率を求めます。これは、WatsonノードがYes状態であるという「証拠=evidence」を得た時にCunningがYesとなる確率ということになります。
Watsonノードを右クリックし、Set Evidence>Yes とすると確率分布が変わり、例題の答えは0.2372である事が分かります。

今回はここまでです。

参考書籍


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

Leave a reply