Является ли этот случайный лес логически правильным и корректно реализованным с помощью R и gbm?

Вопрос или проблема

По профессиональным причинам я хочу изучить и понять случайные леса. Я чувствую себя неуверенно в том, правильно ли я понимаю или совершаю логические ошибки.

У меня есть набор данных с 15 миллионами записей, и я хочу сделать регрессию для числовой цели (время). Структура данных следующая:

У меня есть 7 категориальных переменных, 1 дата и 4 числовые признаки. После подготовки данных я разделил данные на тренировочный и тестовый наборы.

Затем я определил модель градиентного бустинга и подбираю правильные параметры методом проб и ошибок, исследуя и снова методом проб и ошибок. Правилен ли этот подход до сих пор?

#train и test - это подготовленные датафреймы
#RMSE - это реализация функции квадратного среднего отклонения
#тренировочная модель градиентного бустинга
gbmTraining <- gbm(train$target~., data=train, distribution = "gaussian", verbose = TRUE,
                 n.trees = 500, #количество деревьев
                 cv.folds=5, #кросс-валидация
                 n.cores=2, #количество процессорных ядер
                 shrinkage = .03,       #скорость обучения
                 interaction.depth = 42, #количество узлов
                 n.minobsinnode = 15)   #глубина дерева
print(gbmTraining)
png(file = "Results/RelativeInfluence.png")
summary.gbm(gbmTraining, plot = TRUE)
dev.off()

print("лучшее количество деревьев: ")
png(file = "Results/Convergence.png")
best_iter <- gbm.perf(gbmTraining, method="cv", plot.it=TRUE)
dev.off()
print(best_iter)

#создание прогнозов для тренировочных данных
fitTrain <- predict(gbmTraining, train, best_iter, type = "response", verbose = TRUE)

#ошибка на тренировочных данных
errorTrain <- RMSE(fitTrain, test$target)
errorTrain <- round(errorTrain, digits = 1)
errorDiffTrain <- fitTrain - test$target
print("средняя ошибка на тренировочных данных (предсказанное, фактическое):")
print(mean(errorDiffTrain))

#запись и сохранение результатов
print("резюме тренировок")
print(head(data.frame("Фактическое" = train$target, "Предсказанное" = fitTrain)))
print(summary(data.frame("Фактическое" = train$target, "Предсказанное" = fitTrain)))
trainTable <- data.frame("Фактическое" = train$target, "Предсказанное" = fitTrain)

write.csv(trainTable, "Results/trainTable.csv", row.names = FALSE)

Здесь я хочу узнать, использую ли я правильные аргументы при расчете ошибок. Рассчитываю ли я ошибки между подогнанными данными и данными из тестового набора или использую здесь данные из обучающего набора?

Если я нашел хорошие параметры и хочу перейти к проверке, то реализация становится короче, поскольку я использую найденные параметры. Я создаю новую модель для тестов:

#тестовая модель gbm 
gbmTesting = gbm(test$target~., data=test, distribution = "gaussian", n.trees = 500,
                 n.cores=2, verbose = FALSE,
                 shrinkage = .03,
                 interaction.depth = 42,
                 n.minobsinnode = 15)

#создание прогнозов для тестовых данных
fitTest <- predict(gbmTesting, data=test, n.trees = 500, type = "response", verbose = FALSE)

#ошибка на тестовых данных
errorTest <- RMSE(fitTest, test$target)
errorTest <- round(errorTest, digits = 1)
errorDiffTest <- fitTest - test$target
print("средняя ошибка на тестовых данных (предсказанное, фактическое):")
print(mean(errorDiffTest))

print("резюме тестирования")
print(head(data.frame("Фактическое" = test$target, "Предсказанное" = fitTest)))
print(summary(data.frame("Фактическое" = test$target, "Предсказанное" = fitTest)))
testTable <- data.frame("Фактическое" = test$target, "Предсказанное" = fitTest)

write.csv(testTable, "Results/testTable.csv", row.names = FALSE)

Это правильно или я погряз в ментальной ловушке?

п.с.
сообщество Stack Exchange такое огромное, что я не уверен, если это должно быть на других сайтах? Если да, то на каких?

  1. Правильный ли код?
    Да, по-моему, он правильный

  2. Как рассчитывать ошибки:
    Рассчитайте точность для тренировочных данных
    Рассчитайте точность для тестовых данных

Если ошибка на тренировочных данных высока (RMSE в вашем случае) – высокое смещение, переобучение модели с большим количеством деревьев, меньшей скоростью обучения, большими данными (если возможно)

Если ошибка на тренировочных данных низкая, но на тестовых данных высокая – высокая дисперсия или переобучение: регуляризация, увеличение k-склада

Если ошибка на тренировочных и тестовых данных низкая – ваша модель готова к использованию.

Надеюсь, это отвечает на ваш вопрос.

Ответ или решение

Проверка корректности кода и реализации метода случайных лесов с использованием R и gbm

Анализ кода и его реализации

На основании предоставленного описания и кода, кажется, что вы пытаетесь использовать модель градиентного бустинга для прогнозирования числового показателя (времени) с использованием пакета gbm в R. Прежде всего, обратите внимание, что вы говорите о случайных лесах, но в вашем примере, точнее, используется метод градиентного бустинга. Убедитесь, что вы различаете эти модели и осознаете их функциональные особенности и различия.

  1. Корректность кода:

    • Ваш код в целом выглядит корректно, однако есть несколько моментов, на которые следует обратить внимание:

      • Ошибка при вычислении RMSE: В коде, где вы вычисляете ошибку обучения errorTrain, вы неверно используете данные из тестовой выборки. Для вычисления ошибки модели на обучающей выборке используйте только соответствующие данные, т.е., fitTrain и train$target, а не test$target.

      • Определение лучшего числа деревьев: Вы правильно используете кросс-валидацию для выбора наилучшего количества деревьев с функцией gbm.perf. Это полезный шаг для настройки модели и предотвращения переобучения.

  2. Вычисление ошибок:

    • Ошибки обучения: Это ошибка между предсказанными и фактическими значениями на обучающем наборе данных. Для вычисления используйте fitTrain и train$target.

    • Ошибки тестирования: Аналогичным образом, ошибки тестирования должны быть между предсказаниями на тестовом наборе данных и фактическими значениям тестового набора.

  3. Логические ошибки:

    • Убедитесь, что вы разделили данные на обучение и тестирование должным образом, и используйте эту разделённую структуру данных на протяжении всего процесса.
    • Настройка гиперпараметров методом "проб и ошибок" может быть эффективной на начальных этапах. Однако, рассмотрите возможность автоматизации этого процесса (например, используя библиотеки для сеточного поиска гиперпараметров).

Конечные рекомендации

  • Тем не менее, если разница в ошибках на обучающем и тестовом наборах значительна, пересмотрите выбранные параметры модели или внесите изменения в процесс подготовки данных.
  • Убедитесь, что ваш анализ включает проверку значимости признаков, анализ остаточной ошибки и визуализацию ключевых показателей модельного процесса.
  • Дополнительно, обратите внимание на оптимизацию архитектуры вашего решения, если работа с большими наборами данных вызывает значительное время выполнения.

Если у вас остаются вопросы по использованию моделей случайных лесов или методом градиентного бустинга, обратитесь к специализированным профессиональным сообществам или форумам, связанным с анализом данных на R, такими как Cross Validated на Stack Exchange.

Эта информация должна помочь вам уверенно двигаться дальше в разработке моделей машинного обучения с помощью R.

Оцените материал
Добавить комментарий

Капча загружается...