作者SFMAndroid (安卓发送)
看板R_Language
标题[问题] 随机森林
时间Sat Jul 25 21:15:11 2015
[问题类型]:
程式谘询(我想用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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.229.215.230
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1437830114.A.120.html
※ 编辑: SFMAndroid (36.229.215.230), 07/25/2015 21:15:34
※ 编辑: SFMAndroid (36.229.215.230), 07/25/2015 21:24:00
※ 编辑: SFMAndroid (36.229.215.230), 07/25/2015 21:26:49
※ 编辑: SFMAndroid (36.229.215.230), 07/25/2015 21:37:25
1F:推 ntme: 没用过,但看pdf文件中说y是factor才作分类 07/25 21:35
2F:→ celestialgod: 你可以给一个seed还有你R的版本吗 07/25 21:38
3F:→ celestialgod: 我这里没有试出来split point像你说的情形 07/25 21:38
※ 编辑: SFMAndroid (36.229.215.230), 07/25/2015 21:40:34
4F:→ SFMAndroid: seed设成100 R版本跟系统环境已补上 谢谢~ 07/25 21:41
5F:→ celestialgod: 你後面补的解释应该没有错 1.的答案应该如你理解 07/25 21:42
6F:→ SFMAndroid: 请问c大 那若predictor是连续变数的话 <=是往左 07/25 21:43
7F:→ celestialgod: 不过seed一百我还是没有看到6(摊手 07/25 21:43
8F:→ SFMAndroid: >是往右没错吧? 07/25 21:44
9F:→ celestialgod: 对 07/25 21:44
10F:→ SFMAndroid: 抱歉 设完seed後我忘记改结果了@@ 07/25 21:44
※ 编辑: SFMAndroid (36.229.215.230), 07/25/2015 21:46:32
11F:→ SFMAndroid: 谢谢c大:) 07/25 21:46
13F:→ celestialgod: 上面连结是别人写的plot.getTree 07/25 21:50
14F:→ celestialgod: 有不少FUNCTION 下载之後 都source应该就可以用 07/25 21:50
15F:→ celestialgod: 我就不测试了 07/25 21:51
16F:→ SFMAndroid: 好的感谢c大 再请教一个问题 若x2多一个类别"清洁工" 07/25 21:52
17F:→ SFMAndroid: split point得到9 (1,0,0,1)这样 就是学生跟清洁工归 07/25 21:53
18F:→ SFMAndroid: 左边 其余归右边这样? 但我以为决策树是二分(是否)的 07/25 21:54
19F:→ celestialgod: 对 07/25 21:54
20F:→ celestialgod: 每一个类别都有是否 所以有2^类别数那麽多个组合 07/25 21:55
21F:→ SFMAndroid: 区分方式 像这样是"是否是教官或老师" 不是就往左? 07/25 21:55
22F:→ celestialgod: 类别比较麻烦 所以他要每一个种类做一个CHECK 07/25 21:55
23F:→ SFMAndroid: 完全理解了 谢谢!! 07/25 21:56
24F:→ celestialgod: 忘了讲 刚刚那个我发现是一个套件 07/25 21:57
25F:→ celestialgod: 应该可以用devtools:::install_github来安装 07/25 21:57
26F:→ SFMAndroid: 尝试中 感谢:) 07/25 21:58
27F:→ celestialgod: install_github("araastat/reprtree") 07/25 22:00
28F:→ SFMAndroid: 下载成功了 又多学一招XD 谢c大 07/25 22:03