如何在R中为多分类随机森林模型的特征重要性图添加误差棒?
多分类随机森林交叉验证特征重要性聚合与绘图
一、修正特征重要性数据提取逻辑
原代码中get_fold_importance函数的物种列赋值逻辑有误,需调整为长格式数据结构,同时记录每个折的索引,方便后续聚合计算:
# 修正后的特征重要性提取函数 get_fold_importance <- function(fold_index, data, fold_num) { fold_data <- data[fold_index, ] fold_model <- randomForest(Species ~ ., data=fold_data, importance=TRUE) # 提取对每个类别的MeanDecreaseAccuracy(type=1),若需Gini系数可改为type=2 importance_df <- as.data.frame(importance(fold_model, type=1)) # 添加特征列并转换为长格式 importance_df$Feature <- rownames(importance_df) importance_long <- pivot_longer(importance_df, cols = -Feature, names_to = "Species", values_to = "Importance") # 添加折数标识 importance_long$Fold <- fold_num return(importance_long) } # 提取每个折的特征重要性,同步传递折数编号 fold_importance <- mapply(get_fold_importance, train_control$index, MoreArgs = list(data=df, fold_num=1:10), SIMPLIFY = FALSE) # 合并所有折的数据为单一数据框 importance_df <- bind_rows(fold_importance)
二、按特征+物种聚合计算均值与标准差
加载dplyr工具包,按特征和物种分组,计算10折交叉验证下的重要性均值与标准差:
library(dplyr) # 聚合生成目标数据框 agg_importance <- importance_df %>% group_by(Feature, Species) %>% summarise( Mean_Importance = mean(Importance), Std_Importance = sd(Importance), .groups = "drop" )
此时agg_importance的结构为:每行对应一个特征+一个物种的组合(共12行),包含该组合的重要性均值与标准差,完全满足绘图需求。
三、绘制带误差棒的特征重要性图
用ggplot2绘制分面图,匹配目标效果:
ggplot(agg_importance, aes(x = reorder(Feature, Mean_Importance), y = Mean_Importance)) + # 添加误差棒(均值±标准差) geom_errorbar(aes(ymin = Mean_Importance - Std_Importance, ymax = Mean_Importance + Std_Importance), width = 0.2) + # 绘制均值点 geom_point(size = 3, color = "#2E8B57") + # 按物种分面展示 facet_wrap(~ Species, scales = "free_y") + # 翻转坐标轴,提升特征标签可读性 coord_flip() + labs( x = "特征", y = "平均特征重要性(10折交叉验证均值)", title = "多分类随机森林特征重要性" ) + theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), strip.text = element_text(size = 12, face = "bold") )
关键说明
- 若需使用Gini系数衡量特征重要性,只需将
importance(fold_model, type=1)改为type=2即可。 reorder(Feature, Mean_Importance)用于让特征按重要性从高到低排序,优化图表可读性。- 分面参数
scales="free_y"允许每个物种的y轴范围独立,更贴合不同物种的重要性分布。
内容的提问来源于stack exchange,提问作者SK77
相关产品推荐
相关产品推荐

