Вопрос или проблема
По профессиональным причинам я хочу изучить и понять случайные леса. Я чувствую себя неуверенно в том, правильно ли я понимаю или совершаю логические ошибки.
У меня есть набор данных с 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 такое огромное, что я не уверен, если это должно быть на других сайтах? Если да, то на каких?
-
Правильный ли код?
Да, по-моему, он правильный -
Как рассчитывать ошибки:
Рассчитайте точность для тренировочных данных
Рассчитайте точность для тестовых данных
Если ошибка на тренировочных данных высока (RMSE в вашем случае) – высокое смещение, переобучение модели с большим количеством деревьев, меньшей скоростью обучения, большими данными (если возможно)
Если ошибка на тренировочных данных низкая, но на тестовых данных высокая – высокая дисперсия или переобучение: регуляризация, увеличение k-склада
Если ошибка на тренировочных и тестовых данных низкая – ваша модель готова к использованию.
Надеюсь, это отвечает на ваш вопрос.
Ответ или решение
Проверка корректности кода и реализации метода случайных лесов с использованием R и gbm
Анализ кода и его реализации
На основании предоставленного описания и кода, кажется, что вы пытаетесь использовать модель градиентного бустинга для прогнозирования числового показателя (времени) с использованием пакета gbm
в R. Прежде всего, обратите внимание, что вы говорите о случайных лесах, но в вашем примере, точнее, используется метод градиентного бустинга. Убедитесь, что вы различаете эти модели и осознаете их функциональные особенности и различия.
-
Корректность кода:
-
Ваш код в целом выглядит корректно, однако есть несколько моментов, на которые следует обратить внимание:
-
Ошибка при вычислении RMSE: В коде, где вы вычисляете ошибку обучения
errorTrain
, вы неверно используете данные из тестовой выборки. Для вычисления ошибки модели на обучающей выборке используйте только соответствующие данные, т.е.,fitTrain
иtrain$target
, а неtest$target
. -
Определение лучшего числа деревьев: Вы правильно используете кросс-валидацию для выбора наилучшего количества деревьев с функцией
gbm.perf
. Это полезный шаг для настройки модели и предотвращения переобучения.
-
-
-
Вычисление ошибок:
-
Ошибки обучения: Это ошибка между предсказанными и фактическими значениями на обучающем наборе данных. Для вычисления используйте
fitTrain
иtrain$target
. -
Ошибки тестирования: Аналогичным образом, ошибки тестирования должны быть между предсказаниями на тестовом наборе данных и фактическими значениям тестового набора.
-
-
Логические ошибки:
- Убедитесь, что вы разделили данные на обучение и тестирование должным образом, и используйте эту разделённую структуру данных на протяжении всего процесса.
- Настройка гиперпараметров методом "проб и ошибок" может быть эффективной на начальных этапах. Однако, рассмотрите возможность автоматизации этого процесса (например, используя библиотеки для сеточного поиска гиперпараметров).
Конечные рекомендации
- Тем не менее, если разница в ошибках на обучающем и тестовом наборах значительна, пересмотрите выбранные параметры модели или внесите изменения в процесс подготовки данных.
- Убедитесь, что ваш анализ включает проверку значимости признаков, анализ остаточной ошибки и визуализацию ключевых показателей модельного процесса.
- Дополнительно, обратите внимание на оптимизацию архитектуры вашего решения, если работа с большими наборами данных вызывает значительное время выполнения.
Если у вас остаются вопросы по использованию моделей случайных лесов или методом градиентного бустинга, обратитесь к специализированным профессиональным сообществам или форумам, связанным с анализом данных на R, такими как Cross Validated на Stack Exchange.
Эта информация должна помочь вам уверенно двигаться дальше в разработке моделей машинного обучения с помощью R.