[问题] 随机森林画决策树

楼主: SFMAndroid (安卓发送)   2015-07-25 21:15:11
[问题类型]:
程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
[软件熟悉度]:
请把以下不需要的部份删除
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
如题
最近在用randomForest这个package做分类预测 y是binary variable
跑出结果后用getTree抓其中一颗决策树出来
输出大概就是
left daughter right daughter split var split point status prediction
这样
然后有几点想请教版友:
1. getTree的split pint判断 stack overflow有人说
若split point是2.5 则<=2.5往左走 >2.5往右走
但是若split var是factor的话呢?
像是三个levels "学生" "老师" "教官"
若直接这样getTree的话 split point那会变成乱数 ex. 3
所以我后来试着给他数字 学生为1 老师为2 教官为3
split point变成2.5 1.5之类
但在解释上说不过去 也无法套用stack overflow里的人的逻辑
若split var是年龄区间还可以解释
例如20岁以下为1 20~30岁是2 30岁以上是3
split point为2.5时 我还能理解为<=2.5是30岁以下 >2.5是30岁以上
当然 这是现阶段的理解
ex.
set.seed(100)
data <- data.frame(y=sample(c("好", "不好"), 100, replace=TRUE),
x1=sample(c("学生", "老师", "教官"), 100, replace=TRUE),
x2=sample(c("20岁以下", "20~30岁", "30岁以上"), 100, replace=TRUE)
)
library(randomForest)
rf <- randomForest(y~., data=data, ntree=10, proximity=TRUE)
tree <- getTree(rf, labelVar=TRUE)
然后tree的结果就如上面所述
请问我究竟该如何理解这个结果呢?
(2015/07/25 09:39)
补充:根据?getTree得到split point的解释是
x1有3个类别 split point若为3 则是指(1,1,0)
因为1*2^0+1*2^1+0*2^3=3
然后学生和老师都归类到左边
所以判断依据是"是否为教官" 否就丢到左边这样吗?
2. 最后是画图的问题
我在网络上找到一位网友自己写了一个函式叫to.dendrogram
程式附在下面
但是画出来的决策树只有split point的名称 ex.学生 教师
可是我希望把split point也画上去 ex. <=2.5, <=1.5等
目前知道的绘图有几个package:rpart, tree之类
但那都要用rpart或ctree来跑"一颗"决策树
然后再用package内的绘图函式画图
但是跟随机森林的那10颗(ntree=10)决策数是不一样的吧!
不要求很精美的图 主要是想修改网友的to.dendrogram的code
弄成有split point的结果
但是attr(rval, "edgetext")那边一直搞不定@@
或是这里有大神能提供更好的解法
感激不尽!!
总结一下问题
1. randomForest中getTree的split var为factor时 split point该如何判断?
2. to.dendrogram的图中 如何修改code才能把split point放上去?
这些问题困扰小弟好久了~"~
再次感谢
[程式范例]:
http://pastie.org/10311492
[系统环境]:
R version 3.2.1 (2015-06-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 8 x64 (build 9200)
locale:
[1] LC_COLLATE=Chinese (Traditional)_Taiwan.950
[2] LC_CTYPE=Chinese (Traditional)_Taiwan.950
[3] LC_MONETARY=Chinese (Traditional)_Taiwan.950
[4] LC_NUMERIC=C
[5] LC_TIME=Chinese (Traditional)_Taiwan.950
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] tree_1.0-36 data.table_1.9.4 randomForest_4.6-10
loaded via a namespace (and not attached):
[1] magrittr_1.5 plyr_1.8.3 tools_3.2.1 reshape2_1.4.1 Rcpp_0.11.6
[6] stringi_0.5-5 stringr_1.0.0 chron_2.3-47
[关键字]:
randomForest 随机森林 getTree
作者: ntme (one shot one kill)   2015-07-25 21:35:00
没用过,但看pdf文件中说y是factor才作分类
作者: celestialgod (天)   2015-07-25 21:38:00
你可以给一个seed还有你R的版本吗我这里没有试出来split point像你说的情形
楼主: SFMAndroid (安卓发送)   2015-07-25 21:41:00
seed设成100 R版本跟系统环境已补上 谢谢~
作者: celestialgod (天)   2015-07-25 21:42:00
你后面补的解释应该没有错 1.的答案应该如你理解
楼主: SFMAndroid (安卓发送)   2015-07-25 21:43:00
请问c大 那若predictor是连续变量的话 <=是往左
作者: celestialgod (天)   2015-07-25 21:43:00
不过seed一百我还是没有看到6(摊手
楼主: SFMAndroid (安卓发送)   2015-07-25 21:44:00
>是往右没错吧?
作者: celestialgod (天)   2015-07-25 21:44:00
作者: celestialgod (天)   2015-07-25 21:50:00
http://tinyurl.com/pwtzucf上面连结是别人写的plot.getTree有不少FUNCTION 下载之后 都source应该就可以用我就不测试了
楼主: SFMAndroid (安卓发送)   2015-07-25 21:52:00
好的感谢c大 再请教一个问题 若x2多一个类别"清洁工"split point得到9 (1,0,0,1)这样 就是学生跟清洁工归左边 其余归右边这样? 但我以为决策树是二分(是否)的
作者: celestialgod (天)   2015-07-25 21:54:00
对每一个类别都有是否 所以有2^类别数那么多个组合
楼主: SFMAndroid (安卓发送)   2015-07-25 21:55:00
区分方式 像这样是"是否是教官或老师" 不是就往左?
作者: celestialgod (天)   2015-07-25 21:55:00
类别比较麻烦 所以他要每一个种类做一个CHECK
楼主: SFMAndroid (安卓发送)   2015-07-25 21:56:00
完全理解了 谢谢!!
作者: celestialgod (天)   2015-07-25 21:57:00
忘了讲 刚刚那个我发现是一个套件应该可以用devtools:::install_github来安装
楼主: SFMAndroid (安卓发送)   2015-07-25 21:58:00
尝试中 感谢:)
作者: celestialgod (天)   2015-07-25 22:00:00
install_github("araastat/reprtree")
楼主: SFMAndroid (安卓发送)   2015-07-25 22:03:00
下载成功了 又多学一招XD 谢c大

Links booklink

Contact Us: admin [ a t ] ucptt.com