Функция xgboost cv перегружена - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь использовать перекрестную проверку XGBoost для настройки параметров, как показано здесь: https://blog.cambridgespark.com/hyperparameter-tuning-in-xgboost-4ff9100a3b2f. Разница в том, что моя проблема - проблема двоичной классификации.

Проблема в том, что кажется, что это слишком много, и я думал, что перекрестная проверка предотвратит это. Чем больше я увеличиваю max_depth, тем лучше становится мой AUC. Я уже пробовал значения от 6 до 14 (по 2). dtrain - это более 8 миллионов образцов и 20 функций.

Вот мой фрагмент кода:

num_boost_round = 25

params = {
        #parameters to tune   #defaults
        'max_depth':12,        #6
        'min_child_weight':3, #1
        'eta':0.3,            #0.3
        'subsample':1,        #1
        'colsample_bytree':1, #1
        #other parameters
        'objective':'binary:logistic',
}
params['eval_metric'] = 'auc'

gridsearch_params = [
      (max_depth, min_child_weight)
      for max_depth in range(16,23,2)
      for min_child_weight in range(3,4,1)
]

for max_depth, min_child_weight in gridsearch_params:
      print("CV with max_depth={}, min_child_weight={}".format(max_depth, min_child_weight))

      #update our params
      params['max_depth'] = max_depth
      params['min_child_weight'] = min_child_weight

      #Run CV
      cv_results = xgb.cv(params,
                    dtrain,
                    num_boost_round,
                    nfold=5,
                    early_stopping_rounds=10,
                    metrics="auc", 
                    maximize=True,
                    as_pandas=True,
                    seed=123)

      mean_auc = cv_results['test-auc-mean'].max()
      boost_rounds = cv_results['test-auc-mean'].argmax()
      print("AUC {} for {} rounds".format(mean_auc, boost_rounds))

И некоторый вывод:

CV with max_depth=16, min_child_weight=3
AUC 0.9779078 for 24 rounds
CV with max_depth=18, min_child_weight=3
AUC 0.9856856 for 24 rounds
CV with max_depth=20, min_child_weight=3
AUC 0.9898591999999999 for 24 rounds
CV with max_depth=22, min_child_weight=3
AUC 0.991723 for 24 rounds

Используя метод поезда XGBoost с поездом / тестом 80% / 20%, я получаю AUC 0,86, что кажется правильным для этой проблемы. Так что я не уверен, что не так. Я чувствую, что упускаю что-то очень простое. Правильна ли моя команда xgb.cv? Есть какой-нибудь парам, который выглядит не так?

...