Я использую CatBoostRegressor для контролируемой задачи обучения, и я хотел бы использовать пользовательскую целевую функцию, но я не знаю, как реализовать ее способом, полностью совместимым с CatBoost и оптимизированным для вычислительной эффективности.
Я столкнулся с компромиссом между выбором RMSE (среднеквадратичная ошибка) и MAE (средняя абсолютная ошибка), поэтому я определил пользовательскую целевую функцию, пытаясь взять лучшее из обоих миров.
RMSE имеет тенденцию производить "несмещенные" оценки, потому что минимизация RMSE для набора чисел приводит к нахождению его среднего значения.С другой стороны, он имеет тенденцию штрафовать небольшое количество больших ошибок более тяжело, чем большое количество мелких ошибок.Вот пример с двумя точками данных: если ошибки [5, 5], то RMSE равно 7,07, а если ошибки [0, 10], RMSE равно 10.
MAE имеет преимуществоравное наказание за небольшое количество больших ошибок и большое количество мелких ошибок (в приведенном выше примере как [5, 5], так и [0, 10] имеют MAE = 5).С другой стороны, он имеет тенденцию давать смещенные оценки, потому что минимизация MAE по набору чисел приводит к нахождению его медианы, которая может значительно отличаться от среднего значения, если есть выбросы.
Я бы хотелОпределите функцию стоимости, которая использует лучшее из обоих миров:
1) Моя функция стоимости должна в равной степени оштрафовать небольшое количество больших ошибок и большое количество мелких ошибок, точно так же, как MAE
2) Моя функция стоимости должна иметь тенденцию давать объективные оценки: минимизация моей функции стоимости по набору чисел должна привести к нахождению ее среднего значения, так же как RMSE
Идея состоит в том, чтобы взять MAE и наказать смещение.Вот код Python для функций стоимости:
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error
# Root mean squared error (RMSE)
def rmse(y_true, y_pred):
return np.sqrt(mean_squared_error(y_true, y_pred))
# Mean absolute error (MAE)
def mae(y_true, y_pred):
return mean_absolute_error(y_true, y_pred)
# Custom loss function: mean absolute error + bias
def my_error_function(y_true, y_pred):
return np.mean(np.abs(y_true - y_pred)) + np.abs(np.mean(y_true - y_pred))
RMSE и MAE уже реализованы в CatBoost (https://tech.yandex.com/catboost/doc/dg/concepts/loss-functions-regression-docpage/). Я нашел здесь руководство по реализации пользовательской функции потерь https://github.com/catboost/tutorials/blob/master/custom_loss/custom_metric_tutorial.md, но я не смог изменить функцию стоимости в соответствии с моей формулой, потому что она должна быть написана на c ++ (https://github.com/catboost/catboost/issues/521). Я был бы очень признателен за вашу помощь.