Метрики для eval_set в CatBoost
есть 2 сета:
S: https://yadi.sk/d/SwrEb2n4C-_H0A
D: https://yadi.sk/d/-YqN7qXgeK1EAQ
Задача мультиклассификации (несколько классов в таргете), таргет не сбалансирован (есть 1 основной класс и далее несколько менее крупных классов), обучаю на CatBoost GPU
Проблема - перебирая различные метрики ['MultiClass', 'TotalF1', 'MCC', 'Accuracy',
'HingeLoss','HammingLoss', 'ZeroOneLoss', 'Kappa', 'WKappa'] для остановки на eval_set, на сете S всё работает нормально: метрики считаются корректно, можно посмотреть значения и график ошибки на сете для остановки cb_model.evals_result_ и cb_model.fit(train, eval_set=test, verbose_eval=0, plot=True)
Однако на сете D, ничего кроме ['MultiClass', 'HingeLoss'] не показывает результатов, ошибка равна 0 с самого старта.
Прикладываю код
import pandas as pd
import numpy as np
from catboost import CatBoostRegressor, CatBoostClassifier, Pool
X_1 = pd.read_csv('../X_S')
x_train, x_test, y_train, y_test = train_test_split(X_1.loc[:, X_1.columns.drop('target')],
X_1.loc[:, 'target'],
test_size=0.1)
train = Pool(x_train, y_train)
test = Pool(x_test, y_test)
metrics = ['MultiClass', 'TotalF1', 'MCC', 'Accuracy', 'HingeLoss',
'HammingLoss', 'ZeroOneLoss', 'Kappa', 'WKappa']
for metric in metrics:
model_params = {
'depth': 7,
'learning_rate': 0.03,
'l2_leaf_reg': 3,
'min_data_in_leaf': 50,
'od_wait': 500,
'random_strength': 1,
'iterations': 1000,
'task_type': 'GPU',
'devices': '0:1',
'od_type': 'Iter',
'loss_function': 'MultiClass',
'eval_metric': metric,
'has_time': False,
}
cb_model = CatBoostClassifier(**model_params)
cb_model.fit(train, eval_set=test, verbose_eval=0, plot=True)
Почему другие метрики не работают?
Пробовал разные разбиения на train_test_split, менять параметры модели. Думал, может сама специфика расчёта метрики влияет: на данных метриках мы смотрим на TP, FP, etc и проводим разлинчые математические операции с ними: суммируем, находим разность, отношение и т.д. и получается, что если мы немного улучшили предсказание вероятности класса ('MultiClass'), но сам класс так и остался в TP, FP, etc, то и метрика на остановке меняться не будет. Тогда всё равно не ясно, почему в первом случае все работает или это такая специфика остальных датасетов?
Идея в том, что у меня несколько таргетов {S, D, M, N..}, вот на одном S - всё работает, а других, которых еще 5 штук, аналогичная ситуация как и на D