R Academy · Урок

Случайный лес с ranger

Обучайте модели случайного леса, настраивайте mtry и ntrees и оценивайте ошибку OOB

Урок 2 из 413 шагов

«Случайный лес с ranger» — бесплатный урок R Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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 — бесплатная проверка

Поскольку каждое дерево обучается на бутстреп-выборке, примерно треть наблюдений остаётся неиспользованной (out-of-bag, 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))

Понятие матрицы ошибок

В задаче классификации матрица ошибок сопоставляет фактические и предсказанные классы. Среди основных метрик, вычисляемых на её основе, — точность, precision (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 существует оптимальный диапазон. В простом цикле настройки можно вычислить ошибку OOB для набора значений mtry и найти оптимальное значение без перекрёстной проверки.

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))

ranger через tidymodels

Вы можете использовать ranger через интерфейс tidymodels, который предоставляет единообразный синтаксис и интеграцию с рабочими процессами, перекрёстной проверкой и настройкой. Укажите движок как '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 как быструю sanity-проверку: если на большом наборе данных она чрезвычайно мала, заподозрите утечку данных.

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')

Быстрая проверка

Что оценивает ошибка OOB (out-of-bag) в случайном лесе, построенном с помощью ranger?

Повторение: случайные леса

Основные выводы из темы «Случайные леса с ranger»:

  • Случайные леса объединяют множество деревьев, построенных на бутстреп-выборках, со случайным выбором признаков при каждом разбиении.
  • mtry: sqrt(p) для классификации, p/3 для регрессии; этот параметр следует настраивать.
  • Ошибка OOB предоставляет бесплатную, почти несмещённую оценку на проверочных данных.
  • importance = 'impurity' или 'permutation' возвращает оценки важности переменных.
  • Установите probability = TRUE, чтобы получать вероятности классов при классификации.
  • ranger поддерживает широкую параллельную обработку; для больших наборов данных используйте num.threads.
  • Интегрируйте ranger с tidymodels с помощью rand_forest() |> set_engine('ranger').
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))
Можно начать бесплатно

Изучай R с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
43
Уроки
159

Часто задаваемые вопросы

Урок «Случайный лес с ranger» бесплатный?

Да — полный текст урока «Случайный лес с ranger» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Случайный лес с ranger»?

Обучайте модели случайного леса, настраивайте mtry и ntrees и оценивайте ошибку OOB Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Случайный лес с ranger»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Деревья решений: основа ансамблей
  2. Случайный лес с ranger
  3. Градиентный бустинг с xgboost
  4. Важность признаков и интерпретация моделей
← Назад к R Academy