我正在尝试使用具有多个输出的 Keras(Tensorflow 后端)构建顺序模型。我的目标是一个整体的比例,所以每个观察都是一个像 [0.5, 0.25, 0.15, 0.1] 这样的数组。每个观测值数组的总和等于 1。
当我训练模型时,最小化均方误差,我得到了好的结果。但是查看验证结果,很明显,均方误差可能不是解决我的问题的最佳损失函数。对我来说重要的是 y_true 和 y_pred 中的序列高度相关。
例如,假设我有一个观察值 [10%, 20%, 30%, 40%]。以下每一项都是对这一观察结果的潜在预测:
- [20%、30%、20%、30%]
- [20%、10%、40%、30%]
- [00%、30%、20%、50%]
- [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 框架中?