Я новичок в машинном обучении (а также в R). Я выяснил, как запустить некоторую базовую c линейную регрессию, модели elasti c net и случайные леса в R, и получил некоторые достойные результаты для проекта регрессии (с непрерывной зависимой переменной), который я ' Я работаю над.
Я пытался узнать, как использовать алгоритм повышения градиента и, в частности, команду xgboost (). Мои результаты здесь намного хуже, и я не знаю почему.
Я надеялся, что кто-нибудь может взглянуть на мой код и посмотреть, есть ли какие-либо явные ошибки.
# Create training data with and without the dependent variable
train <- data[1:split, ]
train.treat <- select(train, -c(y))
# Create test data with and without the dependent variable
test <- data[(split+1):nrow(data), ]
test.treat <- select(test, -c(y))
# Load the package xgboost
library(xgboost)
# Run xgb.cv
cv <- xgb.cv(data = as.matrix(train.treat),
label = train$y,
nrounds = 100,
nfold = 10,
objective = "reg:linear",
eta = 0.1,
max_depth = 6,
early_stopping_rounds = 10,
verbose = 0 # silent
)
# Get the evaluation log
elog <- cv$evaluation_log
# Determine and print how many trees minimize training and test error
elog %>%
summarize(ntrees.train = which.min(train_rmse_mean), # find the index of min(train_rmse_mean)
ntrees.test = which.min(test_rmse_mean)) # find the index of min(test_rmse_mean)
# The number of trees to use, as determined by xgb.cv
ntrees <- 25
# Run xgboost
model_xgb <- xgboost(data = as.matrix(train.treat), # training data as matrix
label = train$y, # column of outcomes
nrounds = ntrees, # number of trees to build
objective = "reg:linear", # objective
eta = 0.001,
depth = 10,
verbose = 0 # silent
)
# Make predictions
test$pred <- predict(model_xgb, as.matrix(test.treat))
# Plot predictions vs actual bike rental count
ggplot(test, aes(x = pred, y = y)) +
geom_point() +
geom_abline()
# Calculate RMSE
test %>%
mutate(residuals = y - pred) %>%
summarize(rmse = sqrt(mean(residuals^2)))
Как это выглядит?
Кроме того, одна вещь Я не понимаю xgboost (), поэтому мне нужно извлечь зависимую переменную из набора данных в опции «data», а затем добавить ее обратно в опцию «label». Почему мы это делаем?
Мой набор данных содержит 809 наблюдений и 108 независимых переменных. Вот произвольное подмножество:
structure(list(year = c(2019, 2019, 2019, 2019), ht = c(74, 76,
74, 73), wt = c(223, 234, 215, 215), age = c(36, 29, 32, 24),
gp_l1 = c(16, 16, 11, 14), gp_l2 = c(7, 0, 16, 0), gp_l3 = c(16,
15, 16, 0), gs_l1 = c(16, 16, 11, 13), gs_l2 = c(7, 0, 16,
0), gs_l3 = c(16, 15, 16, 0), cmp_l1 = c(372, 430, 226, 310
), cmp_l2 = c(154, 0, 297, 0), cmp_l3 = c(401, 346, 364,
0), att_l1 = c(597, 639, 365, 486), y = c(8, 71.5, 26, 22
)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"
))
Моя RMSE из этой модели xgboost () составляет 31,7. Принимая во внимание, что мои модели случайного леса и gl mnet дают среднеквадратичные средние значения около 13. Прогнозируемая метри c, с которой я сравниваю, имеет среднеквадратическое среднеквадратичное значение 15,5. Я не понимаю, почему моя модель xgboost () работает намного хуже, чем мой случайный лес и модели gl mnet.