You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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包变量重要性图重命名

可以通过两种方式修改变量标签:

  1. 直接在vip绘图后添加文本标签:
library(vip)

vip(tree_model, num_features=3) +
  geom_text(aes(label = c("VB/L", "SMI", "年龄")), hjust=-0.1) +
  labs(x="重要性得分", y="变量")
  1. 提取重要性数据框后重命名再自定义绘图:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 18:40:28