使用 ranger 构建随机森林
训练随机森林模型,调整 mtry 和 ntrees,并评估 OOB 误差
使用 ranger 构建随机森林 是 CoddyKit 上的免费 R Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
什么是随机森林
随机森林在数据的自助采样样本上构建许多决策树,然后对它们的预测结果取平均(回归)或进行多数投票(分类)。两种随机性使这种集成方法得名:对行进行自助采样,以及在每次分裂时随机选择特征。
library(ranger)
# Minimal random forest: 500 trees, auto mtry
rf <- ranger(
medv ~ .,
data = MASS::Boston,
num.trees = 500
)
print(rf)mtry 参数
mtry 是每次分裂时随机考虑的特征数量。使用少于特征总数的特征,可以降低树之间的相关性,从而减少方差。经验法则是:分类使用 mtry = sqrt(p),回归使用 mtry = p/3,其中 p 是预测变量的数量。
p <- ncol(MASS::Boston) - 1 # number of predictors
rf_class <- ranger(
Species ~ ., data = iris,
num.trees = 500,
mtry = floor(sqrt(4)) # sqrt(p) for classification
)
rf_reg <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500,
mtry = floor(p / 3) # p/3 for regression
)
cat('Classification OOB Error:', rf_class$prediction.error)
cat('Regression OOB RMSE:', sqrt(rf_reg$prediction.error))OOB 误差——免费的验证
由于每棵树都在一个自助采样样本上训练,大约三分之一的观测会被留出(袋外,即 OOB)。这些 OOB 样本会充当每棵树内置的验证集。汇总后的 OOB 误差几乎是无偏的测试误差估计,不需要单独的验证集。
rf <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500,
mtry = 4
)
# OOB MSE
cat('OOB MSE:', rf$prediction.error)
# OOB RMSE
cat('OOB RMSE:', sqrt(rf$prediction.error))
# For classification: OOB error rate
rf_cl <- ranger(Species ~ ., data = iris)
cat('OOB Error Rate:', rf_cl$prediction.error)变量重要性
设置 importance = 'impurity' 后,会记录每个特征在所有树中的节点不纯度总下降量(基尼或 MSE)。设置 importance = 'permutation' 后,会衡量随机打乱每个特征时准确率的损失;这种方法更可靠,但速度较慢。
rf_imp <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500,
importance = 'impurity'
)
# Sorted importance scores
imp <- sort(rf_imp$variable.importance, decreasing = TRUE)
print(imp)
# Quick plot
barplot(imp, las = 2, col = 'steelblue',
main = 'Random Forest Variable Importance')使用 ranger 进行预测
使用 predict(rf, data = test) 生成预测结果。返回值是一个列表;通过 $predictions 访问预测结果。对于分类,预测结果默认为 factor 的各个水平。
set.seed(1)
idx <- sample(nrow(MASS::Boston), 400)
train <- MASS::Boston[idx, ]
test <- MASS::Boston[-idx, ]
rf <- ranger(medv ~ ., data = train, num.trees = 500)
pred <- predict(rf, data = test)
test_rmse <- sqrt(mean((pred$predictions - test$medv)^2))
cat('Test RMSE:', round(test_rmse, 3))混淆矩阵概念
对于分类,混淆矩阵会交叉统计实际类别与预测类别。由此得到的主要指标包括准确率、精确率(TP / (TP + FP))、召回率(TP / (TP + FN))和 F1 分数。ranger 可以直接提供 OOB 混淆矩阵。
rf_cl <- ranger(
Species ~ ., data = iris,
num.trees = 500,
mtry = 2
)
# OOB confusion matrix
print(rf_cl$confusion.matrix)
# OOB error rate
cat('OOB Error Rate:', rf_cl$prediction.error)
# Manual accuracy on OOB predictions
# (1 - error rate)
cat('OOB Accuracy:', 1 - rf_cl$prediction.error)调节 mtry 和 num.trees
增加树的数量总能降低方差,直到大约 300–500 棵时收益逐渐减小。mtry 参数存在一个最佳取值范围。通过一个简单的调节循环,在一组 mtry 值上评估 OOB 误差,即可找到最佳值,而无需进行交叉验证。
mtry_vals <- c(2, 4, 6, 8, 10)
oob_errors <- sapply(mtry_vals, function(m) {
rf <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 300, mtry = m
)
rf$prediction.error
})
best_mtry <- mtry_vals[which.min(oob_errors)]
cat('Best mtry:', best_mtry)
plot(mtry_vals, sqrt(oob_errors), type = 'b',
xlab = 'mtry', ylab = 'OOB RMSE')使用 ranger 进行分类
对于分类,将 probability = TRUE 设置为获取类别概率预测,而不是硬标签。这对于计算 ROC 曲线和获得校准后的概率估计是必要的,并且符合 yardstick 指标所需的输出格式。
# Ensure the target is a factor
iris$Species <- as.factor(iris$Species)
rf_prob <- ranger(
Species ~ ., data = iris,
num.trees = 300,
probability = TRUE # output class probabilities
)
# Predictions are a matrix of probabilities
pred_prob <- predict(rf_prob, data = iris[1:5, ])
print(pred_prob$predictions)ranger 中的并行处理
ranger 专为速度和并行处理而设计。将 num.threads 设置为使用所有可用的 CPU 核心。与较旧的 randomForest 包相比,这可以显著提速,尤其是在树很多的大型数据集上。
# Use all available cores
rf_fast <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 1000,
mtry = 4,
num.threads = parallel::detectCores()
)
cat('Trees:', rf_fast$num.trees)
cat('Threads used:', rf_fast$num.threads)
cat('OOB RMSE:', sqrt(rf_fast$prediction.error))通过 tidymodels 使用 ranger
您可以通过 tidymodels 接口使用 ranger。该接口提供一致的语法,并能与工作流、交叉验证和调参集成。将引擎指定为 'ranger',并通过 set_engine() 传入引擎特定的参数。
library(parsnip)
library(workflows)
rf_spec <- rand_forest(
mtry = tune(),
trees = 500,
min_n = tune()
) |>
set_engine('ranger', importance = 'impurity') |>
set_mode('regression')
wf <- workflow() |>
add_recipe(rec) |>
add_model(rf_spec)
print(wf)解读 ranger 输出
打印出的 ranger 模型会显示:树的数量、目标变量、使用的特征数量、OOB 预测误差,以及 R 平方(回归时)。请始终检查 OOB 误差,作为快速的合理性检查——如果大型数据集上的该误差低得异常,应怀疑存在数据泄漏。
rf <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500, mtry = 4,
importance = 'impurity'
)
# Key output fields
cat('OOB MSE: ', rf$prediction.error, '\n')
cat('OOB RMSE: ', sqrt(rf$prediction.error), '\n')
cat('R-squared: ', rf$r.squared, '\n')
cat('Num trees: ', rf$num.trees, '\n')
cat('Num features: ', rf$num.independent.variables, '\n')快速检查
在使用 ranger 构建的随机森林中,OOB(袋外)误差估计的是什么?
随机森林回顾
《使用 ranger 的随机森林》要点:
- 随机森林将基于自助采样样本构建的许多树结合起来,并在每次分裂时随机选择特征。
mtry:分类使用 sqrt(p),回归使用 p/3;请调节此参数。- OOB 误差提供免费的、几乎无偏的验证估计。
importance = 'impurity'或'permutation'可提供变量重要性分数。- 在分类中设置
probability = TRUE,以输出类别概率。 - ranger 具有高度的并行能力;处理大型数据集时请使用
num.threads。 - 通过
rand_forest() |> set_engine('ranger')与 tidymodels 集成。
rf <- ranger(
medv ~ ., data = MASS::Boston,
num.trees = 500,
mtry = 4,
importance = 'impurity',
num.threads = parallel::detectCores()
)
cat('OOB RMSE:', sqrt(rf$prediction.error))
cat('R2:', rf$r.squared)
print(sort(rf$variable.importance, decreasing = TRUE))常见问题解答
「使用 ranger 构建随机森林」课时是免费的吗?
是的 — 「使用 ranger 构建随机森林」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「使用 ranger 构建随机森林」这节课中我会学到什么?
训练随机森林模型,调整 mtry 和 ntrees,并评估 OOB 误差 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 ranger 构建随机森林」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 决策树:集成模型的基础
- 使用 ranger 构建随机森林
- 使用 xgboost 进行梯度提升
- 特征重要性与模型解读