使用 SMAPE 作为 LSTM 的损失函数

数据挖掘 喀拉斯 时间序列 lstm rnn 损失函数
2022-02-27 05:35:17

我目前正在研究时间序列预测问题,并正在研究使用 LSTM。

我用来确定预测是否良好的最终准确度指标定义如下:

SMAPE-3=t=1n|yty^t|t=1n(yt+y^t),

其中是实际值,是预测值。所以这个公式将产生之间的分数。然后可以从 1 中减去该分数,以在指定的预测范围内产生预测的百分比准确度yty^t[0,1]

Accuracy=1t=1n|yty^t|t=1n(yt+y^t).

我正在使用 keras,并且已经看到我可以指定自定义损失函数和指标。由于我的预测准确性将使用 sMAPE 3(如上定义)来衡量,因此将其用作我的损失函数对我来说是有意义的。这是因为我的网络成功将通过它使用它的得分来衡量。0分表示100%准确率,1分表示0%准确率。

所以这提出了两个问题,像 smape 这样的度量是否可以用作损失函数,如果可以,为什么/为什么不呢?keras 中的标准损失函数是否被认为更好?也许是因为它们允许更快的收敛?我选择使用 SMAPE3 作为损失函数是否会影响我应该使用哪种优化器?

我问是因为我没有看到很多人使用除 RMSE、MSE 和 MAE 以外的损失函数,这一定是有原因的。

1个回答

我不明白为什么不 - 这是您希望最小化的损失。

我使用以下作为我的损失函数,当 sMAPE 是我的预测准确度指标时,它运行良好。

import tensorflow.keras.backend as K

def smape_loss(y_true, y_pred):
    epsilon = 0.1
    summ = K.maximum(K.abs(y_true) + K.abs(y_pred) + epsilon, 0.5 + epsilon)
    smape = K.abs(y_pred - y_true) / summ * 2.0
    return smape