深度学习模型的MAPE比较高,怎么办?
关注者
6被浏览
54,7312 个回答
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)