中国のAI技術動向の調査を兼ねて、gCastleに実装された因果探索アルゴリズムを検証しました。gCastleはGUIツールCastleBoardを含んでいますが、パッケージにツールのマニュアル類は添付されていません。そのため、本稿では実際にアルゴリズムを検証するためのCastleBoardの使い方について解説します。
CastleBoardの操作
GUIツールはいくつかの設定項目への入力でテストデータを生成できるため、テストプログラムを組むより簡単にアルゴリズムを検証できます。ツールの機能は主に二つのタスクを実行させることです。一つはテストデータを生成し、もう一つはテストデータで探索アルゴリズムを実行させることです。
- テスト用のデータセットを生成して保存します。
- 因果探索アルゴリズムを選択し、生成したテスト用のデータセットを使ってアルゴリズムを検証します。
CastleBoardの起動
以下にリンクしている【gCastle因果探索アルゴリズムの検証】で解説したように、python39の仮想環境を起動し、パッケージのディレクトリ、gcastleに移動後、flaskサーバーを起動します。
以下のコマンドを実行し、Webブラウザで localhost:5000/index.html
にアクセスしてください。
conda activate python39
cd gcastle
python web/main.py
テストデータの生成
CastleBoardにアクセスできたら、左上に4つ並んだメニューからTask
メニューを選択してください。
Task
メニューで選択した図1で示すタスク一覧画面で、上部に三つ並んだボタンの中でAdd Task
ボタンを押します。
図1 タスクメニュー タスク一覧

以下の図2に示すように、タスク選択ダイアログ(Set task type)が表示されます。
図2 タスク選択ダイアログ

中央のメニューTask Type
からData Generation
を選択します。
図3 タスク選択ダイアログ2

Task Type選択後、Next step
ボタンを押します。
図4 タスク種別の設定

図5で示すAdd a Task -- Data Generationダイアログが表示されます。
図5 Add a task -- Dataset Generation Step1

ここでSimulation dataset name:
テキスト入力フィールドに、シミュレーション・データセットの名称を入力します。これは後で因果探索アルゴリズムを実行するときのデータセットに指定します。
生成するデータセットに名前をつけた後、 Next step
ボタンを押します。
以下の図6で示すStep2 画面が表示されます。
図6 Step2

保存場所Storage location
を表示します。生成されるテストデータの保存先を指定します。
デフォルトの設定で問題ありません。そのままNext step
ボタンを押してください。
以下の図7で示すStep3画面が表示されます。
図7 Step3 Causal mechanism for sample generation

中央にあるプルダウンメニューからサンプル生成のための因果関係の仕組みを選択します。以下の三つの選択肢から選択します。
- IID LINEAR
- IID_NONLINEAR
- EVENT
図8 Causal mechanism for sample generation

ここでは、IID_LINEAR
を選択します。
図9 Configuration Parameters

Configuration Parameters
ボタンを押します。Configuration Parameters
パラメータの設定画面が表示されます。
図10 Configuration Parameters

n_edges
とn_nodes
の項目にそれぞれ値を入力します。ここでは一例として、それぞれ10、8を入力します。
ここで指定するnodesは因果ダイアグラムのノード、エッジは二つのノード間を結ぶ原因と結果を示す線であり、因果の方向が矢印で表示されます。
項目に数値を入力したら、Confirm
ボタンを押します。Step3画面に戻ります。
Next step
ボタンを押します。
図11で示すStep4の確認画面が表示されます。
図11 Step4 Check the configuration

入力した内容が表示されます。内容を確認します。
右下の三つ並んだボタンの中で中央にあるConfirm
ボタンを押します。
正常に終了すると、下の図12のタスク画面の一番下に表示されているように、新しく生成したデータセットが、"ds_iid_test1
"の名称でタスクに登録されます。これは、上の手続き Step1
図5のテキスト入力フィールドSimulation dataset name:
に入力した名称に一致します。
図12 Task一覧 ds_iid_test1

生成したテストデータの表示
生成したデータを表示するには、タスクリストの右端のOperations
欄にあるView
ボタンをクリックします。
図13 Operations Viewボタン

下の図14に示すように、DAGノード間を結ぶエッジが表示されます。
図14 View

画面右上にあるView Edges
ボタンを押します。
下の図15に示すように、ノード間を結ぶエッジのリストを表示します。
図15 View ノード間を結ぶエッジのリスト

エッジの上にマウスを移動させると、ノードを結ぶエッジがハイライト表示されます。(図16)ハイライトで表示された 6>2
はノード6からノード2への矢印を意味し、6が2の原因であることを示しています。
図16 ノード間を結ぶエッジ(6>2)

因果探索アルゴリズムの実行
図17のタスク一覧画面の上部に並んだ三つのボタンの中のAdd Task
ボタンを押します。
図17 タスク一覧

Task Type選択画面で Causal Discovery
を選択します。
図18 Set task type

Task Type選択後に、Next Step
ボタンを押します。
図19で示すStep1画面が表示されます。
図19 Add a task -- Causal Discovery Step 1

中央のTask nameで示されたテキスト入力フィールドに任意のタスクの名称を入力します。このタスク名はタスク一覧表のリストに追加されます。
任意のタスク名入力後に、Next step
ボタンを押します。
以下の図20で示す Step2 画面が表示されます。
図20 Step2画面 User-defined training dataset

データセットの選択画面が表示されます。User defined training dataset
とBuilt-in training dataset
のどちらかを選択するラジオボタンがあります。
User defined training dataset
のラジオボタンを選択します。このラジオボタンを選択すると、生成したデータセットが選択できます。
【テストデータの生成】項目に記した手続きで生成したデータセットを選択してください。
Next step
ボタンを押してください。Step3画面が表示されます。
図21 Step3画面 Select an algorithm

アルゴリズムの選択(Select an algorithm): ポップアップメニューを選択して、因果探索アルゴリズムを選択します。
因果探索に用いるアルゴリズムを選択します。
ここではICA LiNGAM
を選択しました。
Configuration
ボタンを押します。以下の図22で示すパラメータの設定画面が表示されます。
図22 Configuration parameters

デフォルト設定のまま、Confirm
ボタンを押します。
Next step
ボタンを押します。
図23 Step3 アルゴリズムの選択

以下の図24で示す Step4 画面が表示されます。
図24 Step4 確認画面

入力内容を確認します。確認画面に、テストに用いるテストデータセットの名称が表示されます。
入力内容に問題がなければ、画面の右下 中央にあるConfirm
ボタンを押してください。
タスクが正常に終了すると、図25に示すように、タスク一覧画面に、因果探索の実行結果が、因果探索タスクとして登録されます。下図では項目10に登録されています。
図25 タスク一覧

各タスクの行の右端のOperation
欄のView
ボタンを押すと、タスクの結果をグラフィカルモデルで表示します。(図26)
図26 因果探索結果の表示

探索結果の表示
タスク一覧画面で、タスクの種別がCausalDiscoveryのリストを選択します。Viewボタンを押すと、下の図27で示すように、ノードを結ぶエッジが表示されます。
図27 因果探索結果

これは、因果探索アルゴリズムが探索したDAGを表示しています。
'ViewEdges
'ボタンを押します。
ノード間を結ぶ、エッジのリストをパネル表示します。(図28)
図28 エッジリスト

パネルのメニューにある、'Edges(True Graph)
'をマウスでクリックすると、真のノードを結ぶエッジのリストが表示されます。これはテストデータを生成したときに作ったオリジナルのグラフです。
'TP
'(True Positive)を選択すると、正しいノードを結ぶエッジのリストを表示します。オリジナルのグラフと探索結果が一致しているエッジを表示します。
'FP
'(False Positive)を選択すると、誤ったエッジ(予測が1で実際は0)のリスト表示します。
'FN
'(False Negative)を選択すると、誤ったノードを結ぶエッジ(予測が0で実際は1)のリストを表示します。
エッジの上にマウスを移動させると、ノードを結ぶエッジがハイライト表示されます。5>7
という表示はノード5から7へ矢印が向いていることを示しており、ノード5がノード7の原因となっていることを示します。
図29 ノード5からノード7へのエッジ

Comparison
'ボタンを押すと、図30で示されるように、真のDAG(オリジナルのDAG)が青い線で表示されます。赤の線は探索アルゴリズムの探索結果です。
図30 元のデータと探索結果の比較

マウスをエッジの上に移動するとハイライト表示されます。
図31 ノード2からノード7へ向かう真のグラフ(青線)

図32 ノード2からノード7へ向かう探索結果のDAG(赤線)

'Cancel Comparison
'ボタンを押すと、元の探索結果の表示に戻ります。
図33 探索結果

'Select Nodes
'ボタンを押すと、図34で示すように、ノードの選択画面が表示されます。
図34 Select Node

ノードのチェックボックスを選択し、'Confirm'ボタンを押すと、選択されたノードだけが表示されます。(図35)
図35 選択ノードのみ表示

探索結果の評価
'Evaluatie
'ボタンを押すと、評価のための操作パネルを表示します。(図36)
図36 Evaluate

Select evaluation indicatorに Select All
のチェックボックスにチェックを入れます。
チェックボックスの項目の意味を以下に記します。
- fdr: False Discovery Rate, rev + FP_TP + FP
- tpr: True Positive Rate, TP_TP + FN
- fpr: False Positive Rate, rev + FP_TN + FP
- shd: Structual Hamming Distance,
- nnz:Non-Negative Entries, TP + FP
- precision:Precision, TP_TP + FP
- recall: Recall, TP_TP + F_N
- F1 : F1 Score,
- gscore: G-Score, max(0, TP-FP_TP + FN)
ここで、TPはTrue Positiveの数、FPは、False Positiveの数、TNは、True Negativeの数、FNは、False Negativeの数、revは、reversed edge(方向の逆転)の数を意味します。
- TP: adjacency matrix(注1)のエントリーが、予測結果が1で、真のエントリーが1の場合に計数されます
- FP: 予測結果が1で、真のエントリーが0だった場合に計数されます。
- FN: 予測結果が0で、真のエントリーが1だった場合に計数されます。
- rev:予測結果と、真のグラフのエントリーの両方が1だった場合で、その方向が間違っていた場合に計数されます。
True Causal Graphの項目で、二つのラジオボタンが選択できます。下側の use a built-in true causal graph
を選択します。
Use a built-in True Causal Graph:に生成したテストデータセットを設定します。プルダウンメニューから生成したデータセットを選択します。
'Evaluate
' ボタンを押します。
Performance Indicator 欄に、結果が表示されます。(図37)
図37 Performance Indicator

タスクメニューに戻ってタスク一覧を表示すると、評価した結果がPerformance欄に表示されます。
図38 タスク一覧
