Я пытаюсь использовать перекрестную проверку 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? Есть какой-нибудь парам, который выглядит не так?