MSE與MAE的區別與選擇
1.均方誤差(也稱L2損失)
均方誤差(MSE)是最常用的回歸損失函數,計算方法是求預測值與真實值之間距離的平方和,公式如圖。
2.平均絕對值誤差(也稱L1損失)

平均絕對誤差(MAE)是另一種用於回歸模型的損失函數。MAE是目標值和預測值之差的絕對值之和。其只衡量了預測值誤差的平均模長,而不考慮方向,取值范圍也是從0到正無窮(如果考慮方向,則是殘差/誤差的總和——平均偏差(MBE))。
3.MSE(L2損失)與MAE(L1損失)的比較
簡單來說,MSE計算簡便,但MAE對異常點有更好的魯棒性。下面就來介紹導致二者差異的原因。
訓練一個機器學習模型時,我們的目標就是找到損失函數達到極小值的點。當預測值等於真實值時,這兩種函數都能達到最小。
下面是這兩種損失函數的python代碼。你可以自己編寫函數,也可以使用sklearn內置的函數。
下面讓我們觀察MAE和RMSE(即MSE的平方根,同MAE在同一量級中)在兩個例子中的計算結果。第一個例子中,預測值和真實值很接近,而且誤差的方差也較小。第二個例子中,因為存在一個異常點,而導致誤差非常大。

左圖:誤差比較接近 右圖:有一個誤差遠大於其他誤差
4.從圖中可以知道什么?應當如何選擇損失函數?
MSE對誤差取了平方(令e=真實值-預測值),因此若e>1,則MSE會進一步增大誤差。如果數據中存在異常點,那么e值就會很大,而e則會遠大於|e|。
因此,相對於使用MAE計算損失,使用MSE的模型會賦予異常點更大的權重。在第二個例子中,用RMSE計算損失的模型會以犧牲了其他樣本的誤差為代價,朝着減小異常點誤差的方向更新。然而這就會降低模型的整體性能。
如果訓練數據被異常點所污染,那么MAE損失就更好用(比如,在訓練數據中存在大量錯誤的反例和正例標記,但是在測試集中沒有這個問題)。
直觀上可以這樣理解:如果我們最小化MSE來對所有的樣本點只給出一個預測值,那么這個值一定是所有目標值的平均值。但如果是最小化MAE,那么這個值,則會是所有樣本點目標值的中位數。眾所周知,對異常值而言,中位數比均值更加魯棒,因此MAE對於異常值也比MSE更穩定。
然而MAE存在一個嚴重的問題(特別是對於神經網絡):更新的梯度始終相同,也就是說,即使對於很小的損失值,梯度也很大。這樣不利於模型的學習。為了解決這個缺陷,我們可以使用變化的學習率,在損失接近最小值時降低學習率。
而MSE在這種情況下的表現就很好,即便使用固定的學習率也可以有效收斂。MSE損失的梯度隨損失增大而增大,而損失趨於0時則會減小。這使得在訓練結束時,使用MSE模型的結果會更精確。

5.根據不同情況選擇損失函數
如果異常點代表在商業中很重要的異常情況,並且需要被檢測出來,則應選用MSE損失函數。相反,如果只把異常值當作受損數據,則應選用MAE損失函數。
總而言之,處理異常點時,L1損失函數更穩定,但它的導數不連續,因此求解效率較低。L2損失函數對異常點更敏感,但通過令其導數為0,可以得到更穩定的封閉解。
二者兼有的問題是:在某些情況下,上述兩種損失函數都不能滿足需求。例如,若數據中90%的樣本對應的目標值為150,剩下10%在0到30之間。那么使用MAE作為損失函數的模型可能會忽視10%的異常點,而對所有樣本的預測值都為150。
這是因為模型會按中位數來預測。而使用MSE的模型則會給出很多介於0到30的預測值,因為模型會向異常點偏移。上述兩種結果在許多商業場景中都是不可取的。
這些情況下應該怎么辦呢?最簡單的辦法是對目標變量進行變換。而另一種辦法則是換一個損失函數。如Huber損失,Log-Cosh損失,分位數損失。
也有些時候可以將利用MAE與MSE訓練出的模型進行融合。