多元回归的损失函数,其中输出之间的关系很重要

数据挖掘 Python 喀拉斯 张量流 回归 损失函数
2021-09-24 16:18:29

我正在尝试使用具有多个输出的 Keras(Tensorflow 后端)构建顺序模型。我的目标是一个整体的比例,所以每个观察都是一个像 [0.5, 0.25, 0.15, 0.1] 这样的数组。每个观测值数组的总和等于 1。

当我训练模型时,最小化均方误差,我得到了好的结果。但是查看验证结果,很明显,均方误差可能不是解决我的问题的最佳损失函数。对我来说重要的是 y_true 和 y_pred 中的序列高度相关。

例如,假设我有一个观察值 [10%, 20%, 30%, 40%]。以下每一项都是对这一观察结果的潜在预测:

  1. [20%、30%、20%、30%]
  2. [20%、10%、40%、30%]
  3. [00%、30%、20%、50%]
  4. [00%、10%、40%、50%]
import numpy as np
from sklearn.metrics import mean_squared_error

y_true   = np.array([[0.1, 0.2, 0.3, 0.4]])
y_pred_0 = np.array([[0.2, 0.3, 0.2, 0.3]])
y_pred_1 = np.array([[0.2, 0.1, 0.4 ,0.3]])
y_pred_2 = np.array([[0.0, 0.3, 0.2, 0.5]])
y_pred_3 = np.array([[0.0, 0.1, 0.4, 0.5]])

preds = [y_pred_0, y_pred_1, y_pred_2, y_pred_3]

for i, pred in enumerate(preds):
    corr = np.corrcoef(y_true, pred)[0,1]
    mse = mean_squared_error(y_true, pred)
    print(f'y_pred_{i}: corr={corr:.2f}, mse={mse:.2f}')

给我们:

y_pred_0: corr=0.45, mse=0.01
y_pred_1: corr=0.60, mse=0.01
y_pred_2: corr=0.87, mse=0.01
y_pred_3: corr=0.98, mse=0.01

因此,虽然这四个预测中的每一个都具有相同的误差,但第四个对我来说是最可取的,因为预测数组中的序列与观察序列最相关。

我发现其他人使用修改后的相关系数函数作为损失函数。但是,如果我优化相关系数,则示例观察的最佳预测可能是 [0%, 1%, 2%, 3%],因为这两个序列完全相关。这不起作用,因为平均误差太大。

所以我需要针对高相关性小错误进行优化。我无法找到解决此类问题的任何地方。有没有办法可以针对这两个目标进行优化?特别是在 Keras 框架中?

2个回答

MSE 使用欧式距离函数。您可以简单地使用 Pearson 相关系数作为相似性度量,因此定义一个新的距离函数,该函数在系数增加时减小 (exp(ρ) 例如)。

另一种可能性是使用Wasserstein 距离(或 Wasserstein 度量,或推土机距离)。请参阅 Wikipedia 上的定义,尤其是这个不太复杂的定义。
该指标旨在计算分布(连续)或直方图(分箱/离散)之间的距离。它与相关性无关,而是与绘制为直方图时的向量形状有关。这不是你要求的,但它可能是你真正想要的。

自定义自己的损失函数

例如:

import keras.backend as K def customLoss(y_true,y_pred): corr = np.corrcoef(y_true, pred)[0,1] mse = mean_squared_error(y_true, pred) return (mse+corr)

而不仅仅是简单

model.compile(loss=customLoss, optimizer = .....)

您可以添加一些权重,惩罚等...