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

如何使用ranger包从随机森林获取树级别的袋外预测结果?

使用ranger获取随机森林的袋外(OOB)单棵树预测值

可以通过ranger包的参数设置结合后续计算实现需求,核心思路是先保存样本在每棵树中的袋内状态,再筛选出每个样本对应的OOB树的预测值。具体步骤如下:

1. 训练模型时保存袋内信息

训练随机森林时,设置keep.inbag=TRUE,让模型保存每个样本在每棵树中的采样次数(0代表该样本是对应树的OOB样本):

library(ranger)
data("iris")

set.seed(123) # 固定随机种子确保结果可复现
iris_train <- sample(1:nrow(iris), size=floor(nrow(iris)*0.8))
train_data <- iris[iris_train, ]

rf <- ranger(
  formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width + Species,
  data = train_data,
  keep.inbag = TRUE, # 关键参数,保存袋内采样信息
  num.trees = 500 # 树的数量,可根据需求调整
)

2. 获取所有树对训练样本的预测值

使用predict.all=TRUE对训练数据做预测,得到每棵树对每个训练样本的预测结果:

# 得到所有树的预测结果,矩阵维度:样本数 × 树的数量
all_tree_preds <- predict(rf, data = train_data, predict.all = TRUE)$predictions

3. 筛选每个样本的OOB树预测值

将模型保存的袋内信息转换为矩阵,然后为每个样本筛选出它属于OOB的树的预测值:

# 将inbag计数列表转换为矩阵(行=样本,列=树)
inbag_matrix <- do.call(cbind, rf$inbag.counts)

# 遍历每个样本,提取对应的OOB树预测值
oob_tree_preds <- lapply(1:nrow(train_data), function(i) {
  # 找到该样本为OOB的树(采样次数为0)
  oob_tree_indices <- which(inbag_matrix[i, ] == 0)
  # 返回这些树对该样本的预测值
  all_tree_preds[i, oob_tree_indices]
})

4. 计算OOB预测的离散程度

基于提取的OOB单树预测值,可以计算离散程度(比如标准差):

# 计算每个样本OOB预测的标准差
oob_pred_sd <- sapply(oob_tree_preds, sd)

# 查看前5个样本的离散程度结果
head(oob_pred_sd)

说明

  • keep.inbag=TRUE会增加模型对象的内存占用,若树的数量极大或样本量极多,需注意内存限制。
  • 上述方法得到的oob_tree_preds列表中,每个元素对应一个训练样本的所有OOB树预测值,可直接用于后续分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:35:45