Есть ли способ уменьшить вес определенного атрибута / переменной в XGBoost? - PullRequest
0 голосов
/ 20 января 2020

Я использую пакет mlr и пытаюсь построить модель XGBoost в R studio на следующем наборе данных:

return          age        diff_in_days     item_odds     picky_users
0             50.75877          5             -14           -3
0             50.75877         NA             -42           -3
1             49.74507          5              1             3
0             49.74507          5              16            3
1             49.74507          5             -31            3
1             49.74507          5             -27            3
0             49.74507          5             -30            3

Я пытаюсь предсказать, вернет ли клиент элемент или нет на остальных 4 переменных. Моя модель работает хорошо без переобучения, пока я не включу переменную picky_users.

picky_users - это специально разработанная функция, которая подсчитывает, сколько возвратов против невозвращений для идентификатора пользователя, так что вы могли выяснить, что моя модель сильно перегоняется при тестировании на новых данных. Однако я не хочу полностью исключать переменную, потому что думаю, что она может улучшить мои прогнозы.

Моя проблема в том, что XGBoost придает слишком большой вес этой переменной, поэтому я хотел бы знать, есть ли способ уменьшить это вручную, настраивая модель. Вот мой код:

>task <- makeClassifTask(data = train, target = "return", positive = "1")
>xgb.learner <- makeLearner("classif.xgboost", predict.type = "prob",
                           par.vals = list("verbose" = 0,
                                           "early_stopping_rounds"=10))

xgb.parms <- makeParamSet(
    makeNumericParam("eta", lower = 0.01, upper = 0.5),
    makeNumericParam("lambda", lower = -1, upper = 20),
    makeNumericParam("lambda_bias",  lower = 0, upper = 200),
    makeNumericParam("alpha", lower = -1, upper = 10),
    makeIntegerParam("nrounds", lower=80, upper=700),
    makeIntegerParam("max_depth", lower= 1, upper= 6),
    makeNumericParam("gamma", lower = 0, upper = 10),
    makeNumericParam("colsample_bytree", lower=0, upper = 1),
    makeDiscreteParam("min_child_weight", values = 1),
    makeNumericParam("subsample", lower=0, upper=1))

>tuneControl <- makeTuneControlRandom(maxit=100, tune.threshold = FALSE)
>rdesc <- makeResampleDesc(method = "RepCV", rep = 2, folds=3, stratify = TRUE) 
>xgb.tuning <- tuneParams(xgb.learner, task = task, resampling = rdesc,
                         par.set = xgb.parms, control = tuneControl, measures = mlr::auc)

Я участвую в частном конкурсе Kaggle, поэтому не знаю, содержат ли новые данные некоторые идентичные идентификаторы пользователей. Существует ли вероятность того, что моя модель не должна переопределяться и что прогнозы не будут выполняться, потому что новые данные имеют совершенно разные идентификаторы пользователей?

Я не эксперт, поэтому любые советы по улучшению моего кода и не отвечаю на Вопрос напрямую также приветствуется.

Спасибо

...