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
相关产品推荐
相关产品推荐

