深度学习模型的MAPE比较高,怎么办?

模型的预测结果RMSE与Score function都还不错,但是模型的MAPE值很高,是什么原因呢,应该如何解决
关注者
6
被浏览
54,731

2 个回答

MAPE受异常值(尤其是label,分母为0的时候)影响很大。

所以一般加一个mask,把label中为0的给mask了,然后再计算MAPE:

real_y_true_mask = (1 - (real_y_true == 0))
mape = MAPE(real_y_true, real_y_pred, real_y_true_mask))

def MAPE(labels, predicts, mask):
    """
        Mean absolute percentage. Assumes ``y >= 0``.
        Defined as ``(y - y_pred).abs() / y.abs()``
    """
    loss = np.abs(predicts - labels) / (np.abs(labels) + 1)
    loss *= mask
    non_zero_len = mask.sum()
    return np.sum(loss)/non_zero_len

这涉及到MAPE的具体实现。

首先:什么是MAPE?

直观理解为误差占真实值的比。

那问题出在哪?

这个等式除了一个分母,但是分母不一定绝对不等于0,

当分母yi = 0或接近零的时候,MAPE会变成无穷大甚至NAN(not a number)

解决:

keras.backend.set_epsilon(1)

def mape(y_true, y_pred):
    diff = K.abs((y_true - y_pred) / K.clip(K.abs(y_true),
                                        K.epsilon(),
                                        None))
    return  K.mean(diff, axis=-1)