SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2885|回复: 0
打印 上一主题 下一主题

[转] SAS决策树:二维空间的决策边界显示

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2013-8-5 07:45:42 | 只看该作者

[转] SAS决策树:二维空间的决策边界显示

在《数据挖掘导论》中看到斜决策树的介绍,如图-1所示,数据中存在着线性不等式的模式:

当 x1+x2<1 时,取值为0;否则,取值为1。
[code:27ws7y78]data source;
   seed=12345;
   do i=1 to 100;
      x1=ranuni(seed);
      x2=ranuni(seed);
      if x1+x2>=1 then target=1;
      else target=0;
      output;
   end;
run;

proc sgplot data=source;
   scatter x=x1 y=x2/group=target;
   lineparm x=1 y=0 slope=-1;
run;quit;[/code:27ws7y78]
接下来,我们使用 SAS EM 提供的 PROC ARBOR 生成一棵决策树。
[code:27ws7y78]proc arbor data=source criterion=ENTROPY splitsize=2 maxbranch=2;
   target target/level = binary;
   input x1 x2 /level = interval;
   subtree largest;
   save NODESTATS=nodstat1 RULES=rul1 ;
   score out=scoreout;
run;quit; [/code:27ws7y78]
想要通过SAS编程的方式显示决策树并不是很容易的事情,而且显示的效果也一般,好在有热心的网友在之前做了一些研究,这里我就直接借用他的代码,当然遇到了一点显示的问题,我对他的源代码做了一点小改动。

我借鉴的代码来自:http://www.sasanalysis.com/2011/02/visualize-decision-tree-by-coding-proc.html,作者是位资深的SAS用户,非常活跃,是分析方面的专家。
[code:27ws7y78]******** VISUALIZE DECISION TREE RESULTS************;
proc sql;
    create table treedata as
    select a.parent as act1, a.node, b.NODETEXT, b.U_Target
    from nodstat1 as a, nodstat1 as b
    where a.parent=b.node
    union
    select c.node as act1, . as node, c.nodetext, c.U_Target
    from nodstat1 as c
;
quit;

data treedata1;
    set treedata;
    if U_Target=1 then _pattern=1;
    else  _pattern=2;
  nodetext = compress(nodetext,'0920'x);
  nodetext = tranwrd(nodetext,':',': ');
run;

*NOTE: USE PROC NETDRAW TO REALIZE PHYSICAL TREE*;
pattern1  c=green; pattern2 v=s c=red;
footnote   c=green   '1  '  c=red     '0  ';
proc netdraw data=treedata1 graphics;
     actnet /activity=act1 successor=NODE nolabel id=(NODETEXT)
             tree compress rotate rotatetext arrowhead=0
             font=simplex ctext=white htext=2;
run;
footnote ' ';[/code:27ws7y78]
最后,我们使用 SAS/GRAPH 提供的 Annotate 功能来画决策边界,这里的决策边界是从决策树的结果表中人工提取的,我没有花时间研究如何通过代码自动生成。
[code:27ws7y78]data rules1;
   set rul1;
   where role='PRIMARY' and (stat='VARIABLE' or stat='INTERVAL');
run;

data decbounderies;
   set rules1;
   name=lag(character_value);
   value=numeric_value;
   if stat='INTERVAL' then output;
   keep node name value;
run;

data Lines;
   infile datalines dlm='#';
   length label $ 27
          textcolor $ 9
          linecolor $ 9;
   retain x1space 'datavalue';
   retain y1space 'datavalue';
   retain x2space 'datavalue';
   retain y2space 'datavalue';
   input function $ x1 y1 label x2 y2 textcolor linecolor;
datalines;
line # 0.4215868129 # 0 #   # 0.4215868129 # 1 #   # blue
line # 0 # 0.7397564595 #   # 0.4215868129 # 0.7397564595 #   # blue
line # 0.1081274502 # 0.7397564595 #   # 0.1081274502 # 1 #   # blue
line # 0.4215868129 # 0.2146758047 #   # 1 # 0.2146758047 #   # blue
line # 0.9196328702 # 0 #   # 0.9196328702 # 0.2146758047 #   # blue
line # 0.4215868129 # 0.4578804769 #   #1 # 0.4578804769 #   # blue
line # 0.6309236754 # 0.2146758047 #   # 0.6309236754 # 0.4578804769 #   # blue
;
run;

proc sgplot data=source sganno=Lines;
   scatter x=x1 y=x2/group=target;
run;quit; [/code:27ws7y78]
原帖:http://blog.sina.com.cn/s/blog_8db50cf70101i3vk.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-2 15:56 , Processed in 0.130594 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表