暂无说说

几种MAPE的实现方式

算法建模 jiajun 8个月前 (07-12) 350次浏览 0个评论 扫描二维码

方法一 (label 中有 NaN 值)

这种方式是为了防止 label 里面有 NaN 值,但没考虑是否为零值。这里以 pytorch 进行举例。

def masked_mape(preds, labels, null_val=np.nan):
    if np.isnan(null_val):
        mask = ~torch.isnan(labels)
    else:
        mask = (labels!=null_val)
    mask = mask.float()
    mask /=  torch.mean((mask))
    mask = torch.where(torch.isnan(mask), torch.zeros_like(mask), mask)
    loss = torch.abs((preds-labels)/labels)
    loss = loss * mask
    loss = torch.where(torch.isnan(loss), torch.zeros_like(loss), loss)
    return torch.mean(loss)

方法二(label 中有零值)

这种方式考虑了分母是否为零值,默认 label 不为 Nan(提前保证,或者使用 sklearn.utils.validation 里面的 cheak_array()函数来检查)。

def mape_loss_func(preds,labels):
    mask=labels!=0
    return np.fabs((labels[mask]-preds[mask])/labels[mask]).mean()

方法三 (限制过大过小值)

这种方式是推荐的,因为分母太小,会导致 mape 太大,所以,把它限定住,非常合适。如果需要,也可以对预测值进行一定的限制。
(下面的方法以 label 和预测值都在 0-1 之间进行举例)

def mape_loss_func2(preds,labels):
    return np.fabs((label-pred)/np.clip(label,0.1,1)).mean()

 

喜欢 (13)

您必须 登录 才能发表评论!