Я использую пакет caret
для настройки модели случайного леса (RF) с помощью ranger
. Поскольку в пакете ranger
я не могу настроить количество деревьев, я использую пакет caret
. Метрикой для нахождения оптимального количества деревьев является R-Squared. Диапазон деревьев, которые я тестирую, составляет от 500 до 3000 с шагом 500 (500, 1000, 1500,..., 3000).
Проблема в том, что R-квадрат одинаков для каждого числа деревьев (см. прикрепленное изображение ниже):
Я не думаю, что это правильно, поэтому я считаю, что с моим кодом что-то не так. Почему я получаю тот же R-квадрат?
Вот код:
library(caret)
library(ranger)
# Load the data
block.data <- read.csv("path/block.data.csv")
eq1 = ntl ~ .
# Define the cross-validation method for hyperparameter tuning
control <- trainControl(method = "cv", number = 10, savePredictions = FALSE,
search = 'grid', allowParallel = TRUE)
# default model
rf_default = train(eq1,
data = block.data,
method = "ranger",
metric = "Rsquared",
trControl = control)
print(rf_default)
# Define the grid of hyperparameters to be tuned
tuneGrid <- expand.grid(mtry = c(2, 3, 4, 5, 6, 7), # number of predictor variables to sample at each split
splitrule = c("variance", "extratrees"), # splitting rule
min.node.size = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) # minimum size of terminal nodes
# Train the model with hyperparameter tuning using caret
set.seed(234)
rf_model <- train(eq1, # formula for the response and predictors
data = block.data,
method = "ranger",
trControl = control,
tuneGrid = tuneGrid)
rf_model$bestTune
tuneGrid <- expand.grid(mtry = rf_model$bestTune$mtry,
splitrule = rf_model$bestTune$splitrule,
min.node.size = rf_model$bestTune$min.node.size)
store_maxtrees <- list()
for (ntree in c(500, 1000, 1500, 2000, 2500, 3000)) {
set.seed(345)
rf_maxtrees <- train(eq1,
data = block.data,
method = "ranger",
metric = "Rsquared",
tuneGrid = tuneGrid,
trControl = control,
ntree = ntree)
key <- toString(ntree)
store_maxtrees[[key]] <- rf_maxtrees
}
results_tree <- resamples(store_maxtrees)
summary(results_tree)
В цикле for
мне пришлось заменить ntree
на num.tree
, вот так:
for (num.tree in c(500, 1000, 1500, 2000, 2500, 3000)) {
set.seed(345)
rf_maxtrees <- caret::train(eq1,
data = block.data,
method = "ranger",
metric = "Rsquared",
tuneGrid = tuneGrid,
trControl = control,
num.tree = num.tree)
key <- toString(num.tree)
store_maxtrees[[key]] <- rf_maxtrees
}