1

我正在将 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)。我将衷心感谢您的帮助。

4

0 回答 0