如何在rpart.plot与VIP图中重命名变量节点及标签?
rpart决策树节点重命名与变量重要性问题解决方案
一、树节点变量名重命名(rpart.plot)
不用修改rpart树对象的属性,直接利用rpart.plot的var.names参数即可替换变量显示名,终端节点可通过extra参数自定义显示内容:
library(rpart) library(rpart.plot) # 示例数据集片段 set.seed(123) df <- data.frame( vbl = rnorm(100), SMI = rnorm(100), age = sample(18:60, 100, replace=T), target = factor(sample(c(0,1), 100, replace=T)) ) # 构建原模型 tree_model <- rpart(target ~ vbl + SMI + age, data=df, method="class") # 绘图时指定自定义变量名 rpart.plot(tree_model, var.names = c("VB/L", "SMI", "年龄"), # 按公式中变量顺序对应替换 extra = 101, # 显示终端节点类别+占比 fallen.leaves = TRUE, box.palette = "GnBu", main = "决策树(变量重命名后)")
如果要提前重命名数据集列,注意含特殊字符(如/)的列名必须用反引号包裹,避免公式解析错误:
library(dplyr) # 重命名列 df_renamed <- df %>% rename(`VB/L` = vbl, 年龄 = age) # 构建模型时用反引号包裹特殊列名 tree_model_renamed <- rpart(target ~ `VB/L` + SMI + 年龄, data=df_renamed, method="class") # 直接绘图,变量名已自动替换 rpart.plot(tree_model_renamed, extra=101)
二、vip包变量重要性图重命名
可以通过两种方式修改变量标签:
- 直接在vip绘图后添加文本标签:
library(vip) vip(tree_model, num_features=3) + geom_text(aes(label = c("VB/L", "SMI", "年龄")), hjust=-0.1) + labs(x="重要性得分", y="变量")
- 提取重要性数据框后重命名再自定义绘图:
vip_df <- vi(tree_model) %>% mutate(Variable = case_when( Variable == "vbl" ~ "VB/L", Variable == "age" ~ "年龄", TRUE ~ Variable )) ggplot(vip_df, aes(x=Importance, y=reorder(Variable, Importance))) + geom_col(fill="steelblue") + geom_text(aes(label=round(Importance, 2)), hjust=-0.1) + labs(x="重要性得分", y="变量") + theme_minimal()
三、变量重要性疑惑解答
rpart的变量重要性是变量在所有分裂节点上的增益总和(比如Gini系数下降值的累加)。SMI出现在树中但vbl重要性更高,通常是因为:
- vbl参与了更多分裂节点(尤其是根节点这种影响全局样本的分裂),总增益远大于SMI;
- 根节点用vbl分裂时带来的样本划分增益权重极高,即使SMI在子节点分裂,总累加值仍不及vbl。
内容的提问来源于stack exchange,提问作者Sofia
相关产品推荐
相关产品推荐

