本コマンドは、PMML(Predictive Model Markup Language)で記述された決定木モデルをD3ライブラリによりHTML文書として視覚化する。 mbonsaiコマンド用の出力結果を視覚化する目的で作成したコマンドであるが、 他のソフトウェアで生成される決定木のPMMLデータであっても視覚化できるであろう。 PMMLでは数値とカテゴリの分岐ルールの記述方法は定義されているが、 mbonsaiで扱う系列パターンの有無の記述は定義されていない。 そのため、mbonsaiでは、系列パーンによる分岐を記述するための拡張タグを定義しており、 本コマンドもその拡張タグに対応して決定木を視覚化できる。
mbonsaiで決定木を構築してから本コマンドで視覚化する一連の流れを以下に例示する。
Table 2.6: 入力データdat1.csv。全データは例を参照のこと。
|
Table 2.6に示されるデータを訓練データとしてmbonsaiコマンドで決定木を構築する。 決定木は、O=に指定したディレクトリにPMMLファイルmodel.pmmlとして保存されている。
$ mbonsai c=入院歴 n=来店距離 p=購入パターン d=性別 i=dat1.csv O=outdat #END# kgbonsai O=outdat c=入院歴 d=性別 i=dat1.csv n=来店距離 p=購入パターン; IN=81; $ ls outdat alpha_list.csv model.pmml model.txt model_info.csv param.csv predict.csv
そして、model.pmmlを視覚化するには以下のように本コマンドを実行すればよい。 出力されたmodel.htmlをブラウザで描画したものをFigure 2.7に示す。
$ mdtree.rb i=outdat/model.pmml o=model.html #END# mdtree.rb i=outdat/model.pmml o=model.html; $ open model.html # macの場合はhtmlファイルをopenすればブラウザが起動され描画される
![]() Table 2.7: 本コマンドによる決定木の描画。 接点内の円グラフは、クラスの分布を示している(色は凡例に表示)。 背景が水色の節点は中間節点を、緑色の節点は葉節点を表している。 節点の直ぐ下には分岐に使う項目名が閉められており、節点の直ぐ上には分岐のルールが示されている。 例えば、最上位の節点では、来店距離が2.15以下であれば左に、2.15より長ければ右に分岐する。 系列パターンの場合は、そのパターンを含めば左に、含まなければ右に分岐する。 例えば、上から2段目の左の節点は、購入パターンに"44"を含んでいれば左に、含まなければ右に分岐することを意味している。 また、系列パターンの文字は、図の左上に示されたalphabet-indexの対応表におけるindexに示されている。 |
また、mbonsaiで構築される決定木には最大木が保存されているので、 枝刈り度をalpha=で指定することで枝刈りされた決定木を描画することもできる。 alpha=は0以上の実数で、大きくすると枝が多く刈られる。 alphaを指定しなかった場合、mbonsaiで交差検証を指定しなければ、 alpha=0.01が指定されたことになり、交差検証を指定していれば、誤分類率最小のモデルが描画される。
Figure 2.8に、alpha=0.1で枝刈りした決定木を示す。
$ mdtree.rb alpha=0.1 i=outdat/model.pmml o=model2.html #END# mdtree.rb alpha=0.1 i=outdat/model.pmml o=model.html; $ open model2.html # macの場合はhtmlファイルをopenすればブラウザが起動され描画される
![]() Table 2.8: 枝刈り度alpha=0.1で描画した決定木 |
統計解析パッケージRには多くの決定木構築パッケージが用意されている。 以下では、rpartで構築した決定木を本コマンドで描画する方法を解説する。
以下では、アヤメデータセット(iris)と前立腺がんデータセット(stagec)の2つのデータセットから 決定木を構築するRスクリプトである。 そこでは、決定木を構築するrpartライブラリとモデルをPMML出力するpmmlライブラリを最初に読み込んでいる。 データセットの内容および決定木モデルの構築方法についての詳細は省略する。 最終的に、アヤメの決定木と前立腺がんの決定木が、 それぞれPMMLファイルmodel_r1.pmml、model_r1.pmm2として出力される。
library(pmml) library(rpart) iris.rp=rpart(Species~.,data=iris) sink("model_r1.pmml") pmml(iris.rp) sink() stagec$progstat <- factor(stagec$pgstat, levels = 0:1, labels = c("No", "Prog")) cfit <- rpart(progstat ~ age + eet + g2 + grade + gleason + ploidy, data = stagec, method = 'class') sink("model_r2.pmml") pmml(cfit) sink()
得られた2つのPMMLファイルについて、本コマンドで決定木を描画する手順は以下のとおりである。 そして、それぞれの決定木はFigure 2.9、Figure 2.9に示されるように描画される。
$ mdtree.rb i=model_r1.pmml o=$op/out_r1.html #END# mdtree.rb i=model_r1.pmml o=model_r1.html; $ mdtree.rb i=model_r2.pmml o=$op/out_r2.html #END# mdtree.rb i=model_r2.pmml o=model_r2.html; $ open model1_r1.html $ open model1_r2.html
![]() Table 2.9: アヤメデータセットの決定木 |
![]() Table 2.10: 前立腺がんの決定木 |
mdtree.rb i= o= [alpha=] [--help]
i= : 決定木モデルのPMMLファイル o= : 出力ファイル(HTMLファイル) alpha= : 枝刈り度を指定する(0以上の実数で、大きくすると枝が多く刈られる)。 : 指定しなかった場合、mbonsaiで交差検証を指定しなければ、 : 0.01が指定されたことになり、交差検証を指定していれば、誤分類率最小のモデルが描画される。 : このパラメータはmbonsaiで構築した決定木のみ有効。 --help : ヘルプの表示
前節の解説で用いてる例。
$ cat dat1.csv 性別,来店距離,購入パターン,入院歴 男,1.2,ABCAAA,あり 男,10.5,BCDADD,あり 男,0.5,AAAA,なし 男,2.0,BBCC,なし 男,3.1,DEDDA,あり 女,0.7,CCCAA,なし 女,1.5,DDDEEE,あり 女,2.6,BACD,あり 女,3.5,ABBB,あり 女,4.0,DDDD,あり 女,2.1,DEDE,なし 男,1.2,ABCAAA,あり 男,10.5,BCDADD,あり 男,0.5,AAAA,なし 男,2.0,BBCC,なし 男,3.1,DEDDA,あり 男,0.7,CCCAA,なし 男,1.5,DDDEEE,なし 男,2.6,BACD,あり 男,3.5,ABBB,あり 男,4.0,DDDD,あり 男,2.1,DEDE,なし 男,1.2,ABCAAA,あり 男,10.5,BCDADDA,あり 男,0.5,AAAAA,なし 男,2.0,BBCCA,なし 男,3.1,DEDDA,あり 男,0.7,CCCAA,なし 男,1.5,ADDDEEE,あり 男,2.6,BACD,あり 男,3.5,ABBB,あり 男,4.0,DDDD,あり 女,2.1,DEDE,なし 女,1.2,ABCAAA,あり 女,10.5,BCDADD,あり 女,0.5,AAAA,なし 女,2.0,BBCC,なし 女,3.1,DEDDA,あり 女,0.7,CCCAA,なし 女,1.5,DDDEEE,あり 女,2.6,BACD,あり 女,3.5,ABBB,あり 女,4.0,DDDD,あり 女,2.1,DEDE,なし 女,1.2,ABCAAA,あり 女,10.5,BCDADD,あり 女,0.5,AAAA,なし 女,2.0,BBCC,なし 女,3.1,DEDDA,あり 女,0.7,CCCAA,なし 女,1.5,DDDEEE,あり 女,2.6,BACD,あり 女,3.5,ABBB,あり 女,1.0,DDDD,あり 女,2.5,DEDE,なし 女,2.5,ABBB,あり 女,1.0,DDDD,あり 女,1.1,DEDE,なし 女,2.2,ABCAAA,あり 女,10.5,BCDADD,あり 女,1.5,AAAA,なし 女,2.6,BBCC,なし 女,3.3,DEDDA,あり 女,1.7,CCCAA,なし 女,1.5,DDDEEE,あり 女,2.6,BACD,あり 女,3.9,ABBB,あり 女,4.5,DDDD,あり 女,2.1,DEDE,なし 女,3.9,BABB,あり 男,4.5,BAA,なし 女,2.1,DEDE,なし 男,3.9,BABB,あり 女,3.9,BABB,あり 男,4.5,BAA,なし 女,2.1,DEDE,なし 男,3.9,BABB,あり 女,3.9,BABB,あり 男,4.5,BAA,なし 女,2.1,DEDE,なし 男,3.9,BABB,あり $ mbonsai c=入院歴 n=来店距離 p=購入パターン d=性別 i=dat1.csv O=outdat ABCDE = 12345 *improved(errev:0.037037 *improved(errMin:0,leaf:1) #END# kgbonsai O=outdat c=入院歴 d=性別 i=dat1.csv n=来店距離 p=購入パターン $ mdtree.rb i=outdat/model.pmml o=model1.html #END# /usr/bin/mdtree.rb i=outdat/model.pmml o=model1.html $ mdtree.rb alpha=0.1 i=outdat/model.pmml o=model2.html #END# /usr/bin/mdtree.rb alpha=0.1 i=outdat/model.pmml o=model2.html $ head model1.html <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style type="text/css"> p.title { border-bottom: 1px solid gray g > .type-node > rect { stroke-width: 3px g > .type-leaf > rect { fill: green .edge path { fill: none svg >.legend > rect { stroke-width: 1px $ head model2.html <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style type="text/css"> p.title { border-bottom: 1px solid gray g > .type-node > rect { stroke-width: 3px g > .type-leaf > rect { fill: green .edge path { fill: none svg >.legend > rect { stroke-width: 1px