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

Caret包train()方法随机森林变量重要性图分类变量拆分问题

问题解答

没办法完全不用额外代码解决这个问题——caret::varImp()默认会对分类变量的每个水平单独计算并展示重要性,直接调用plot(imp)必然会显示拆分后的水平。不过可以通过少量代码快速调整,得到14个原始变量的重要性图,以下是两种可行方法:

方法一:直接从随机森林模型提取原始变量重要性

跳过caret::varImp(),直接访问训练好的随机森林模型对象,这里面的重要性是按原始变量聚合的:

# 从最终模型提取原始变量的重要性(以MeanDecreaseGini为例)
imp_raw <- importance(rf_final$finalModel)[, "MeanDecreaseGini"]
# 转换为数据框并排序
imp_df <- data.frame(
  Variable = names(imp_raw),
  Overall = imp_raw,
  row.names = NULL
)
imp_df <- imp_df[order(-imp_df$Overall), ]

# 用ggplot绘制(或用基础绘图)
library(ggplot2)
ggplot(imp_df, aes(x = reorder(Variable, Overall), y = Overall)) +
  geom_col(fill = "#2E8B57") +
  coord_flip() +
  labs(title = "BD: 14V", x = "变量", y = "Mean Decrease Gini") +
  theme(axis.text = element_text(size = 10),
        plot.title = element_text(hjust = 0.5))

方法二:合并varImp()输出中的分类变量水平

如果习惯用caret::varImp()的输出,可以手动合并分类变量各水平的重要性:

imp <- varImp(rf_final)
imp_df <- imp$importance

# 合并ot_soilTextu所有水平的重要性
ot_total <- sum(imp_df[grepl("ot_soilTextu", rownames(imp_df)), ])
# 删除拆分的水平,添加合并后的行
imp_df <- imp_df[-grepl("ot_soilTextu", rownames(imp_df)), , drop = FALSE]
imp_df <- rbind(imp_df, Overall = ot_total)
rownames(imp_df)[nrow(imp_df)] <- "ot_soilTextu"

# 排序后绘图
imp_df <- imp_df[order(-imp_df$Overall), , drop = FALSE]
plot(imp_df, main="BD: 14V ", 
     xlab = list(font=1, cex = 1.25), 
     scales = list(x = list(font=1,cex=1),y=list(font=1,cex=1)))

内容的提问来源于stack exchange,提问作者BabakK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:42:14