Я правильно использую xgboost () (в R)? - PullRequest
0 голосов
/ 06 февраля 2020

Я новичок в машинном обучении (а также в 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.

...