如何使用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
相关产品推荐
相关产品推荐

