Skip to content

[Machine Learning] MAE 指標介紹與程式實作

平均絕對誤差Mean Absolute Error, MAE)是一個非常有名且基礎的評估指標,通常會出現在機器學習入門課的第一堂課、或第 N 堂 —— 這須視乎你的老師怎麼安排教材。不過對我而言,它就像瑪利歐在關卡 1-1 出發後的第一隻蘑菇怪一樣的存在。

顧名思義,平均絕對誤差(MAE)指標就是將每個時間點我們的『預測值』和『實際值』相減取絕對值,然後平均掉。

如果文字說明不夠清楚,公式如下:

其中 n 就是我們計算時間點的總數,也就是預測值的總數,也是實際值的總數。

既然是誤差值,那麼這個分數若是越大則代表我們預測的效果越差。

在機器學習上,MAE 指標是用在迴歸(regression)問題而不是分類(classification)問題,也就是我們模型最終的輸出是一個『數值』而非一個『分類』。

而在指標特性上,MAE 由於是採取絕對值而非平方(可以參考均方誤差(MSE),所以並不會強調較為極端的誤差,但是採平方的 MSE 就會。

但也正因為如此,假設我們今天非常在乎模型的錯誤預測,那麼 MAE 就並不是個適當的指標。就像對待考生一樣,我們變成假設考 59 分不及格的學生跟考 9 分不及格的學生需要接受同樣強度的課後輔導 —— 顯然是沒有這個必要的

大致上,我們還是需要因應不同的任務來選擇 MAE 或是 MSE。


程式實作(Python)

以下程式實作有使用到 numpy 套件。

# coding: utf-8
import numpy as np


def MAE(preds, targets):
    preds = np.array(preds)
    targets = np.array(targets)
    return np.sum(np.abs(preds-targets)) / targets.size


def main():
    preds = [1.1, 3.4, 9.7, 4.5]
    targets = [1.3, 3.7, 8.9, 4.3]
    print("MAE: {:.4}".format(MAE(preds, targets)))


if __name__ == "__main__":
    main()



Output:

MAE: 0.375


(追加) PyTorch 版本

當然,你需要環境中擁有 torch

使用 PyTorch 的情況,可以自己寫也可以使用內建的 L1Loss() 來計算,我個人覺得自己寫跟他人合作時可讀性比較好,僅供參考。

# coding: utf-8
import torch


def MAE(preds, targets):
    preds = torch.tensor(preds)
    targets = torch.tensor(targets)
    return torch.abs(preds-targets).sum() / len(targets)


def MAE_built_in(preds, targets):
    preds = torch.tensor(preds)
    targets = torch.tensor(targets)
    return torch.nn.L1Loss()(preds, targets)


def main():
    preds = [1.1, 3.4, 9.7, 4.5]
    targets = [1.3, 3.7, 8.9, 4.3]
    print("MAE: {:.4}".format(MAE(preds, targets)))
    print("MAE: {:.4}".format(MAE_built_in(preds, targets)))


if __name__ == "__main__":
    main()



Output:

MAE: 0.375
MAE: 0.375

可以看到算出來的分數是相同的。


References


Read More

Leave a Reply