本コマンドは、PMML(Predictive Model Markup Language)で記述された決定木モデルをD3ライブラリによりHTML文書として視覚化する。 mbonsaiコマンド用の出力結果を視覚化する目的で作成したコマンドであるが、 他のソフトウェアで生成される決定木のPMMLデータであっても視覚化できるであろう。 PMMLでは数値とカテゴリの分岐ルールの記述方法は定義されているが、 mbonsaiで扱う系列パターンの有無の記述は定義されていない。 そのため、mbonsaiでは、系列パーンによる分岐を記述するための拡張タグを定義しており、 本コマンドもその拡張タグに対応して決定木を視覚化できる。
mbonsaiで決定木を構築してから本コマンドで視覚化する一連の流れを以下に例示する。
|
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すればブラウザが起動され描画される
また、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すればブラウザが起動され描画される
統計解析パッケージ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
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