Случайный лес с ranger
Обучайте модели случайного леса, настраивайте mtry и ntrees и оценивайте ошибку OOB
«Случайный лес с 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 — локальная установка не требуется.
Все уроки этого курса
- Деревья решений: основа ансамблей
- Случайный лес с ranger
- Градиентный бустинг с xgboost
- Важность признаков и интерпретация моделей