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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:16:08