假设我为一些偏斜的数据分布执行DNN回归任务。现在我使用平均绝对误差作为损失函数。
机器学习中的所有典型方法都是最大限度地减少平均损失,但对于不合适的倾斜而言。从实际角度来看,最好将中值损失降至最低。我认为一种方法是用一些系数惩罚大损失。然后平均值将接近中位数。但是如何计算未知分布类型的系数?还有其他方法吗?你有什么建议吗? (我正在使用tensorflow / keras)
答案 0 :(得分:1)
只需使用keras中的平均绝对误差损失函数,而不是均方。 平均绝对值几乎等于中位数,无论如何对异常值或偏斜数据更加稳健。你应该看看所有可能的keras损失:
显然,你也可以创建自己的。 但是对于大多数数据集来说,它只是凭经验证明均方可以让你获得更好的准确性。所以我建议至少尝试两种方法,然后才能确定平均值。答案 1 :(得分:0)
定制损失(/目标)功能很难。 Keras理论上允许你这样做,尽管他们似乎已经删除了在2.0版本中专门描述它的文档。
您可以查看他们的docs on loss functions想法,然后转到source code,了解您应该实施哪种API。
但是,有很多人issues提出了这方面遇到问题的人,以及他们删除了相关文档的事实并不令人鼓舞。
请记住,你必须使用Keras自己的后端来计算你的损失函数。如果你让它运作起来,请写一篇博文,或者在这里更新答案,因为这是其他很多人一直在努力奋斗的事情!
答案 2 :(得分:0)
如果您有偏斜的错误分布,您可以使用 tfp.stats.percentile
作为您的 Keras 损失函数,例如:
def loss_fn(y_true, y_pred):
return tfp.stats.percentile(tf.abs(y_true - y_pred), q=50)
model.compile(loss=loss_fn)
它提供了渐变,因此可以与 Keras 配合使用,但速度不如 MAE / MSE。
https://www.tensorflow.org/probability/api_docs/python/tfp/stats/percentile