Как мне заставить CatBoost get_object_importance работать с AUC? - PullRequest
0 голосов
/ 25 августа 2018

Я повторил пример здесь .

Пример пытается улучшить RMSE (ниже-> лучше).

Мое ограниченное понимание - то, что CatBoost попытается минимизировать LogLoss под капотом. В этом примере более низкий LogLoss, кажется, коррелирует с более низким RMSE.

RMSE on validation datset when 0 harmful objects from train are dropped: 0.25915746122622113
RMSE on validation datset when 250 harmful objects from train are dropped: 0.25601149050939825
RMSE on validation datset when 500 harmful objects from train are dropped: 0.25158044983631966
RMSE on validation datset when 750 harmful objects from train are dropped: 0.24570533776587475
RMSE on validation datset when 1000 harmful objects from train are dropped: 0.24171376432589384
RMSE on validation datset when 1250 harmful objects from train are dropped: 0.23716221792112202
RMSE on validation datset when 1500 harmful objects from train are dropped: 0.23352830055657348
RMSE on validation datset when 1750 harmful objects from train are dropped: 0.23035731488436903
RMSE on validation datset when 2000 harmful objects from train are dropped: 0.2275943109556251

Помимо наблюдения RMSE с cb.eval_metrics(validation_pool, ['RMSE'])['RMSE'][-1], в данном примере в действительности не используется RMSE в качестве пользовательской функции потерь.

cb = CatBoost({'iterations': 100, 'verbose': False, 'random_seed': 42})
print(cb.eval_metrics(validation_pool, ['RMSE'])['RMSE'][-1])

В моем случае у меня есть проблема двоичной классификации, и я хочу максимизировать AUC. Я не уверен, должен ли я просто оставить код как есть, и надеюсь, что более низкий logloss коррелирует с более высоким AUC (это не так), или если мне нужно настроить это по-другому, возможно, используя AUC в качестве пользовательской потери / eval_metric функции, а затем переворачивает importance_values_sign с «Положительный» на «Отрицательный».

1 Ответ

0 голосов
/ 27 августа 2018

В случае loss_function='RMSE' CatBoost пытается минимизировать RMSE функцию потери, а не Logloss. RMSE является функцией потери CatBoost по умолчанию.

CatBoost оценивает Logloss по формуле этой страницы. Следовательно, более низкий Logloss соответствует более высокому AUC.

Итак, вам просто нужно заменить

cb = CatBoost({'iterations': 100, 'verbose': False, 'random_seed': 42})

с

cb = CatBoost({'loss_function': 'Logloss', 'iterations': 100, 'verbose': False, 'random_seed': 42})

И наблюдать не за RMSE, а за AUC.

...