幾種MAPE的實現方式

方法一 (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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章