Last Updated on 2021-09-06 by Clay
平均絕對誤差(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
- https://www.statisticshowto.com/absolute-error/
- https://www.statology.org/mean-absolute-error-python/