Реализация пользовательской целевой функции для CatBoostRegressor - PullRequest
0 голосов
/ 25 февраля 2019

Я использую 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). Я был бы очень признателен за вашу помощь.

...