リファレンスにはないのに、決定木モデリングのプロットを描くdecisiontreeステートメントが追加されている話

以下を実行してみます。
ちなみにGTLのリファレンスには今時点(9.4 fifth ed)で「decisiontree」に関する記載はないです

https://support.sas.com/documentation/cdl/en/grstatug/69747/HTML/default/viewer.htm

proc template;
define statgraph temp;
   begingraph ;
      layout region;
         decisiontree nodeid=NODEID parentid=PARENTID;
      endlayout;
   endgraph;
end;
run;

data test;
NODEID=0;PARENTID=.;output;
NODEID=1;PARENTID=0;output;
NODEID=2;PARENTID=0;output;
NODEID=3;PARENTID=2;output;
NODEID=4;PARENTID=2;output;
NODEID=5;PARENTID=3;output;
NODEID=6;PARENTID=3;output;
run;

proc sgrender data=test template=temp;
run;































うわぁ、なんかでたし。




なんで、こんなことがわかったかというと
9.4で追加された決定木モデリングを行うhpslitプロシジャがods graphics onで作ってくれるプロットがかなり面白い形をしていたので気になりました。
以下のような感じです。


proc hpsplit data=sashelp.iris;
 class Species;
 model Species=SepalLength SepalWidth PetalLength PetalWidth;
 grow entropy;
 prune costcomplexity;
run;



























そこで気になったのでods trace on;にして
2つのプロットが以下のテンプレートで作成されいることを確認し
 HPStat.HPSplit.Graphics.ZoomedClassificationTreePlot
 HPStat.HPSplit.Graphics.WholeClassificationTreePlot

proc template;
source HPStat.HPSplit.Graphics.ZoomedClassificationTreePlot;
source HPStat.HPSplit.Graphics.WholeClassificationTreePlot;
run;

として、(むちゃくちゃパラメータあって複雑なテンプレートなので割愛)

中身をみて初めてdecisiontreeプロットが追加されていることをしったわけです。


ods output WholeTreePlot=out1;
ods output ZoomedTreePlot=out2;

として、流れ込んでいるデータセットの中身と見比べると、どのパラメータが何に効いているかが推測できます。

ただ、プロシジャ内部でdynamicをつかってどのように値を渡しているかは、見えないんですが、どなたか方法知りません?

4 件のコメント:

  1. おっ,SASのプログラムでCARTが使えるんですか? これは知らなかったです!

    返信削除
  2. どうもです。そうなんです!SAS/STAT 14.1で拡張されました。結構注目だと思いますが、あんまり知られてないですね

    返信削除
  3. こんにちは。

    >ただ、プロシジャ内部でdynamicをつかってどのように値を渡しているかは、見えないんですが、どなたか方法知りません?


    直接的な回答ではないかもしれませんが、内部でdynamicステートメントに渡されている値をproc documentで確認することができます。

    * ソースをログに表示 ;
    proc template;
    source HPStat.HPSplit.Graphics.ZoomedClassificationTreePlot;
    run;

    * odsオブジェクトを保存 ;
    ods document name=mydoc(write);
    proc hpsplit data=sashelp.iris;
    class Species;
    model Species=SepalLength SepalWidth PetalLength PetalWidth;
    grow entropy;
    prune costcomplexity;
    run;
    ods document close;

    * odsオブジェクトの構造を確認する ;
    proc document name=mydoc;
    list / levels=all;
    quit;


    * dynamicステートメントに渡される値を表示 ;
    proc document name=mydoc;
    obdynam \HPSplit#1\TreePlots#1\WholeTreePlot#1;
    quit;


    以下が詳しく記載されています。
    https://support.sas.com/resources/papers/proceedings16/SAS1800-2016.pdf

    この辺のテクニックは、かなりマニアックなのでブログ記事にするのは断念しましたが、参考までに。。

    返信削除
    返信
    1. おおぉ!凄い、確かにこれでいけますね。しかしこれは絶対に思いつけない。proc document奥が深いですね。記事にして喜ぶマニアも数人はいると思いますので、また是非。
      本当に有難うございました。

      削除