mse python MSE與MAE的區別與選擇

2021-10-12 11:12:28 字數 1742 閱讀 2960

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訓練出的模型進行融合。

EMA與MA 理解公式演算法 EMA與MA

計算 有一組資料 價為 1,2,3,4,5,6,7,求其ema c,5 解答 對應上面資料,x1,x2,x3,x4,x5分別對應3 4 5 6 7 則ema c,5 5 15 x5 4 15 x4 3 15 x3 2 15 x2 1 15 x1 5 x5 4 x4 3 x3 2 x2 1 x1 15...

CMMI 度量與分析MA 2級

特定目標與特定實踐 sg 1 使度量與分析活動協調一致 sp1.1 建立度量目標 sp1.2 明確說明度量項 sp1.3 明確說明資料收集與儲存的規程 sp1.4明確說明分析規程 sg 2 提供度量結果 sp2.1 獲得度量資料 sp2.2 分析度量資料 sp2.3 儲存資料與結果 sp2.4 溝通...

mybatis group by查詢返回map型別

故事的發生是這樣的.一天 我發現我們的頁面顯示了這樣的匯 計資料,看起來體驗還不錯哦 然後,我發現 是這樣滴 分開每個狀態分別去查詢數量。額e,可是為嘛不使用簡單便捷的 group by 語句呢 我們知道mybatis提供了selectmap的方法,查詢結果為hashmap。查詢的時候,可以配置相應...