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

如何用R的caret包获取随机森林模型预测概率的95%置信/预测区间

Ranger随机森林预测概率95%置信区间获取方案

你用caret训练的ranger随机森林模型可以直接通过底层ranger对象返回所有单棵树的预测结果,再基于分位数计算置信区间,适配Shiny实时计算的需求,具体实现如下:

实现逻辑

随机森林的每棵树都会对新样本输出独立的预测概率,对所有树的预测概率取2.5%和97.5%分位数,即可得到对应预测概率的95%置信区间。

代码实现

1. 加载已保存的模型

# 读取之前保存的模型文件
RF.up.samp <- readRDS("./final_model.rds")

2. 自定义预测带CI的函数

# 入参说明:
# new_data:新受试者特征数据框,列名、类型需和训练数据完全一致
# model:加载的ranger caret模型
# ci_level:置信区间水平,默认0.95即95%CI
predict_rf_with_ci <- function(new_data, model = RF.up.samp, ci_level = 0.95) {
  # 调用底层ranger模型,返回所有单棵树的预测结果
  all_tree_pred <- predict(
    object = model$finalModel,
    data = new_data,
    predict.all = TRUE,
    type = "response"
  )
  
  # 提取正类的所有树预测结果,[,2,]对应结局因子的第二个水平(阳性事件)
  # 如需负类CI则将2改为1
  pos_prob_matrix <- all_tree_pred$predictions[,2,]
  
  # 计算点估计(所有树预测概率的平均值)
  p_hat <- rowMeans(pos_prob_matrix)
  
  # 计算CI上下限
  lower_bound <- apply(pos_prob_matrix, 1, quantile, probs = (1 - ci_level)/2, na.rm = TRUE)
  upper_bound <- apply(pos_prob_matrix, 1, quantile, probs = 1 - (1 - ci_level)/2, na.rm = TRUE)
  
  # 整理输出结果,包含数值和指定格式的区间字符串
  result <- data.frame(
    predict_prob = p_hat,
    ci_lower = lower_bound,
    ci_upper = upper_bound,
    ci_format = paste0("[", round(lower_bound, 3), ", ", round(upper_bound, 3), "]")
  )
  return(result)
}

3. 调用示例

# 构造新受试者特征数据,需和训练时的X1~X6特征完全匹配
new_subject <- data.frame(
  X1 = 1.2,
  X2 = 3,
  X3 = 0.7,
  X4 = 5,
  X5 = 2.1,
  X6 = 4
)

# 得到预测结果
pred_result <- predict_rf_with_ci(new_subject)
# 直接取format字段即可得到形如[0.234, 0.567]的区间字符串
pred_result$ci_format

注意事项

  • 新输入的特征数据必须和训练数据的列名、数据类型、因子水平完全一致,否则会触发预测报错,可在Shiny中增加输入校验逻辑规避
  • 该方案直接复用训练完成的树结构计算,运算效率高,不会增加Shiny的交互延迟
  • 如需调整置信区间水平,修改ci_level参数即可,比如传入0.9即可得到90%置信区间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:24:04