Как заставить CatBoost get_object_importance работать с AUC?

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

Пример пытается улучшить 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. Я не уверен, следует ли мне просто оставить код как есть, и надеюсь, что более низкие логопотери коррелируют с более высокими AUC (это не так), или, если мне нужно настроить это по-другому, возможно, используя AUC в качестве настраиваемой потери / eval_metric функция, а затем переключение importance_values_sign с «Положительного» на «Отрицательное».


person ADJ    schedule 24.08.2018    source источник
comment
Измерения RMSE и AUC несовместимы; первое применяется только к параметрам регрессии, а второе - только к параметрам классификации.   -  person desertnaut    schedule 25.08.2018


Ответы (1)


В случае 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.

person nikitxskv    schedule 27.08.2018