如何在R及Jupyter中美化决策树?R新手技术求助
嘿,作为R和决策树的新手,你遇到的这个可视化拥挤问题我太懂了——party包的ctree默认绘图确实容易挤成一团,尤其是在Jupyter环境里。另外rpart那边的分类变量问题也很好解决,下面给你几个实用的方案,帮你搞定这两个麻烦:
优化party包ctree的可视化效果
如果你想继续用party包,这两个方法能大幅改善绘图效果:
调整ctree默认绘图参数
ctree的plot()函数有很多可自定义的参数,通过减小字体、简化节点内容、调整间距就能让树变清爽。试试这段代码:plot(surv_tree, main = "泰坦尼克号生存决策树", node_font = list(size = 10), # 缩小节点文字尺寸 edge_font = list(size = 8), # 缩小分支标签文字 inner_panel = node_inner(surv_tree, pval = FALSE), # 移除节点内的p值,减少冗余 terminal_panel = node_terminal(surv_tree, digits = 2, fill = "lightblue") # 设置终端节点的填充色和小数位数 )去掉不必要的信息后,树的布局会宽松很多,Jupyter里显示也会更清晰。
用ggparty包(强烈推荐)
这是基于ggplot2的party可视化工具,能完全自定义树的样式,输出的图在Jupyter里适配性更好。先安装并加载包:install.packages("ggparty") library(ggparty)然后用这段代码绘图:
ggparty(surv_tree) + # 绘制节点标签,显示节点ID和分割变量 geom_node_label(aes(label = paste0("节点 ", id, "\n", splitvar)), fontface = "bold", size = 3.5) + # 每个节点内添加生存比例的条形图 geom_node_plot(gglist = list(ggplot(aes(x = "", fill = Survived)) + geom_bar(position = "fill") + scale_y_continuous(labels = scales::percent) + theme_minimal()), shared_axis_labels = TRUE) + # 绘制分支的条件标签 geom_edge_label(aes(label = splitval_level), size = 3) + # 设置标题样式 theme(plot.title = element_text(hjust = 0.5, size = 14)) + ggtitle("泰坦尼克号生存决策树")这种方式把每个节点的生存分布用条形图展示,结构清晰,还能随意调整颜色、字体、布局,非常适合Jupyter的输出场景。
修复rpart包的分类变量问题
你说rpart没把Pclass当作分类变量,其实是因为需要明确告诉它哪些是分类变量。只要提前把Pclass转成因子,或者在公式里用as.factor()包裹,就能解决准确性问题,再搭配rpart.plot包美化,效果会很棒:
library(rpart) library(rpart.plot) # 先把Pclass转换为分类变量(或者在公式里写as.factor(Pclass)也行) titanic_train$Pclass <- as.factor(titanic_train$Pclass) # 构建rpart决策树 surv_rpart <- rpart(as.factor(Survived) ~ Pclass + Sex + Age, data = titanic_train) # 用rpart.plot绘制美化后的树 rpart.plot(surv_rpart, type = 4, # 显示节点的分类结果 extra = 100, # 显示每个节点的样本占比 under = TRUE, # 把百分比放在节点下方,避免拥挤 cex = 0.8, # 缩小文字大小 box.col = c("lightgreen", "pink")[surv_rpart$frame$yval] # 按生存状态给节点上色 )
这样rpart就会正确处理Pclass的分类属性,而且rpart.plot输出的图简洁明了,在Jupyter里显示效果极佳。
内容的提问来源于stack exchange,提问作者Emily Lerman
相关产品推荐
相关产品推荐

