如何基于归一化后的imp2绘制与imp1一致的随机森林变量重要性图?
解决方法
方法一:重构caret的varImp对象格式
你归一化后得到的imp2是普通data.frame,而imp1属于varImp.train类,自带对应的plot方法。只要把imp2放回原对象结构,恢复类属性就能继续用原plot函数:
- 先确认
imp1的结构(可以用str(imp1)查看),通常它是一个包含importance和model的列表,且带有varImp.train类属性。 - 把归一化后的
imp2替换进原结构:
# 假设你是这样做的归一化: imp2 <- as.data.frame(imp1$importance / sum(imp1$importance)) colnames(imp2) <- "Overall" # 确保列名和原imp1一致 # 重构varImp.train对象 imp_normalized <- list( importance = imp2, model = "ranger" # 和你用的模型一致 ) class(imp_normalized) <- "varImp.train" # 给对象添加类属性
- 现在就可以用原plot方法画图了:
plot(imp_normalized, top = 10)
方法二:用ggplot手动绘制(更灵活)
如果不想折腾对象结构,直接用ggplot画自定义的图也很方便,还能调整样式:
library(ggplot2) library(dplyr) library(tibble) # 把data.frame整理成ggplot需要的格式:变量名列+重要性列,取前10个并排序 imp_plot_data <- imp2 %>% rownames_to_column("Variable") %>% arrange(desc(Overall)) %>% slice(1:10) %>% mutate(Variable = factor(Variable, levels = Variable)) # 保持排序顺序 # 画图 ggplot(imp_plot_data, aes(x = Overall, y = Variable)) + geom_bar(stat = "identity", fill = "steelblue") + labs(title = "前10个变量归一化重要性", x = "归一化重要性值", y = "变量") + theme_bw()
注意点
- 归一化时要对所有变量的重要性值求和再做除法,而不是只针对前10个,不然结果会有偏差。
- 如果你的
imp1里有多列(比如分类任务的多类别重要性),归一化时要按列分别处理,再放回原结构。
内容的提问来源于stack exchange,提问作者bangmin li
相关产品推荐
相关产品推荐

