0Pricing
R Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 决策树:集成模型的基础
  2. 使用 ranger 构建随机森林
  3. 使用 xgboost 进行梯度提升
  4. 特征重要性与模型解读
← 返回 R Academy