我正在使用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)编写。非常感谢您的帮助。