機器學習從業者必知的5種回歸損失函數

2021-02-21 景略集智

機器學習中的所有算法都依靠最小化或最大化函數,我們將其稱為「目標函數」。被最小化的函數就被稱為「損失函數」。損失函數也能衡量預測模型在預測期望結果方面的性能。找到函數的最小值點的最常用方法是「梯度下降」。如果把損失函數比作連綿起伏的山巒,那麼梯度下降就好比愚公一樣盡力削低山脈,讓山達到最低點。

損失函數,並非只有一種。根據不同的因素,包括是否存在異常值,所選機器學習算法,梯度下降的的時效,找到預測的置信度和導數的難易度,我們可以選擇不同的損失函數。本文就帶領大家學習不同的損失函數,以及它們如何在數據科學和機器學習中幫助我們。

損失函數可以大體分為兩種類型:分類損失和回歸損失。

在本文,我們先重點看看回歸損失函數,在後面的文章會繼續分享其它的損失函數類型。

本文所有代碼地址見文末。

回歸函數預測數量,分類函數預測標籤

回歸損失

均方誤差是最常用的回歸損失函數,它是我們的目標變量和預測值的差值平方和。

下圖是均方誤差函數圖,其中目標真值為100,預測值範圍在-10000到10000之間。均方誤差損失(Y軸)在預測值(X軸)=100處達到最小值。範圍為0到∞。

平均絕對誤差(MAE)是另一種用於回歸模型的損失函數。MAE是目標變量和預測變量之間絕對差值之和。因此它衡量的是一組預測值中的平均誤差大小,而不考慮它們的方向(如果我們考慮方向的話,那就是均值誤差(MBE)了,即誤差之和)。範圍為0到∞。

MSE vs MAE (L2損失 vs L1損失)

簡而言之,使用平方誤差更容易解決問題,但使用絕對誤差對於異常值更魯棒。我們來看一下為什麼。

不管我們什麼時候訓練機器學習模型,我們的目標都是想找到一個點將損失函數最小化。當然,當預測值正好等於真值時,這兩個函數都會達到最小值。

我們快速瀏覽一下這兩種函數的Python代碼。我們可以自己寫函數,也可以用sklearn的內助度量函數:

# true: 真目標變量的數組# pred: 預測值的數組def mse(true, pred):    return np.sum((true - pred)**2) def mae(true, pred):  return np.sum(np.abs(true - pred)) # 在 sklearn 中同樣適用 from sklearn.metrics import mean_squared_error from sklearn.metrics import mean_absolute_error

我們來看看兩種情況下MAE和均方根誤差(RMSE,和MAE相同尺度下MSE的平方根)。在第一種情況下,預測值和真值非常接近,誤差在眾多觀測值中變化很小。在第二種情況下,出現了一個異常觀測值,誤差就很高。

左圖中誤差之間很接近;右圖中一個誤差和其它值相差很大

我們從中可以觀察到什麼?這怎樣能幫我們選擇使用哪種損失函數?

因為MSE是誤差的平方值(y — y_predicted = e),那麼誤差(e)的值在e > 1時會增加很多。如果我們的數據中有異常值,e的值會非常高,e²會>> |e|。這會讓存在MSE誤差的模型比存在MAE誤差的模型向異常值賦予更多的權重。在上面第2種情況中,存在RMSE誤差的模型為了能將該單個異常值最小化會犧牲其它常見情況,這降低模型的整體性能。

如果訓練數據被異常值破壞的話(也就是我們在訓練環境中錯誤地接收到巨大的不切實際的正/負值,但在測試環境中卻沒有),MAE會很有用。

我們可以這樣思考:如果我們必須為所有的觀測值賦予一個預測值,以最小化MSE,那麼該預測值應當為所有目標值的平均值。但是如果我們想將MAE最小化,那麼預測值應當為所有觀測值的中間值。我們知道中間值比起平均值,對異常值有更好的魯棒性,這樣就會讓MAE比MSE對異常值更加魯棒。

使用MAE損失(特別是對於神經網絡來說)的一個大問題就是,其梯度始終一樣,這意味著梯度即便是對於很小的損失值來說,也還會非常大。這對於機器學習可不是件好事。為了修正這一點,我們可以使用動態學習率,它會隨著我們越來越接近最小值而逐漸變小。在這種情況下,MSE會表現的很好,即便學習率固定,也會收斂。MSE損失的梯度對於更大的損失值來說非常高,當損失值趨向於0時會逐漸降低,從而讓它在模型訓練收尾時更加準確(見下圖)。

決定使用哪種損失函數

如果異常值表示的反常現象對於業務非常重要,且應當被檢測到,那麼我們就應當使用MSE。另一方面,如果我們認為異常值僅表示損壞數據而已,那麼我們應當選擇MAE作為損失函數。

如果想比較在有或沒有異常值這兩種情況下,使用L1和L2損失函數時回歸模型的性能,建議讀讀這篇不錯的研究(https://rishy.github.io/ml/2015/07/28/l1-vs-l2-loss/)。記住,L1和L2損失分別是MAE和MSE的別名。

L1損失對異常值更魯棒,但它的導數是不連續的,從而讓它無法有效的求解。L2損失對異常值很敏感,但會求出更穩定和更接近的解(通過將導數設為0)。

這兩者存在的問題:可能會出現兩種損失函數都無法給出理想預測值的情況。例如,如果我們的數據中90% 的觀測值的目標真值為150, 剩餘10%的目標值在0-30之間。那麼存在MAE損失的模型可能會預測全部觀測值的目標值為150,而忽略了那10%的異常情況,因為它會試圖趨向於中間值。在同一種情況下,使用MSE損失的模型會給出大量值範圍在0到30之間的預測值,因為它會偏向於異常值。在很多業務情況中,這兩種結果都不夠理想。

那麼在這種情況下該怎麼辦?一個比較容易的修正方法是轉換目標變量。另一種方法是試試不同的損失函數。這就引出了我們要講的下一部分:Huber損失函數。

相比平方誤差損失,Huber損失對於數據中異常值的敏感性要差一些。在值為0時,它也是可微分的。它基本上是絕對值,在誤差很小時會變為平方值。誤差使其平方值的大小如何取決於一個超參數δ,該參數可以調整。當δ~ 0時,Huber損失會趨向於MAE;當δ~ ∞(很大的數字),Huber損失會趨向於MSE。

δ的選擇非常關鍵,因為它決定了你如何看待異常值。殘差大於δ,就用L1(它對很大的異常值敏感性較差)最小化,而殘差小於δ,就用L2「適當地」最小化。

為何使用Huber損失函數?

使用MAE用於訓練神經網絡的一個大問題就是,它的梯度始終很大,這會導致使用梯度下降訓練模型時,在結束時遺漏最小值。對於MSE,梯度會隨著損失值接近其最小值逐漸減少,從而使其更準確。

在這些情況下,Huber損失函數真的會非常有幫助,因為它圍繞的最小值會減小梯度。而且相比MSE,它對異常值更具魯棒性。因此,它同時具備MSE和MAE這兩種損失函數的優點。不過,Huber損失函數也存在一個問題,我們可能需要訓練超參數δ,而且這個過程需要不斷迭代。

Log-Cosh是應用於回歸任務中的另一種損失函數,它比L2損失更平滑。Log-cosh是預測誤差的雙曲餘弦的對數。

優點:

對於較小的X值,log(cosh(x))約等於(x ** 2) / 2;對於較大的X值,則約等於abs(x) - log(2)。這意味著Log-cosh很大程度上工作原理和平均方誤差很像,但偶爾出現錯的離譜的預測時對它影響又不是很大。它具備了Huber損失函數的所有優點,但不像Huber損失,它在所有地方都二次可微。

我們為何需要二階導數?很多機器學習模型,比如XGBoost,使用牛頓法來尋找最好結果,因此需要二階導數(海塞函數)。對於像XGBoost這樣的機器學習框架,二次可微函數更為有利。

XGBoost中的目標函數

但Log-cosh也不是完美無缺。如果始終出現非常大的偏離目標的預測值時,它就會遭受梯度問題,因此會導致XGboost的節點不能充分分裂。

Huber損失函數和Log-cosh損失函數的Python代碼:

# huber 損失def huber(true, pred, delta):    loss = np.where(np.abs(true-pred) < delta , 0.5*((true-pred)**2), delta*np.abs(true - pred) - 0.5*(delta**2))    return np.sum(loss)# log cosh 損失def logcosh(true, pred):    loss = np.log(np.cosh(pred - true))return np.sum(loss)

在大多數現實預測問題中,我們常常很想知道我們的預測值的不確定性。對於很多業務問題而言,相對於知道某個預測點,了解預測值範圍能夠大幅優化決策過程。最小二乘回歸的預測區間基於我們假設殘差值(y — y_hat)在所有獨立變量值上的變化保持一致。

如果我們是想預測某個區間而非某個點,Quantile損失函數會非常有用。違背此假設的回歸模型是不可信的。當然我們也不能認為這種情況下用非線性函數或基於樹的模型能更好的建模,把擬合線性模型作為基準的理念扔在一邊就完了。這時,我們就可以用到Quantile損失和Quantile回歸,因為基於Quantile損失的回歸能夠提供更明智的預測區間,即便是有非常量方差和非正常分布的誤差來說,效果同樣不錯。

我們來看一些案例,更好的理解為何基於Quantile損失的回歸能對異方差問題效果良好。

Quantile回歸 VS 普通最小乘二回歸

圖:左圖為b/w X1和 Y的線性關係,殘差的方差為常量方差;右圖為b/w X2 和 Y 的線性關係,Y的方差增加2倍

橙色直線表示兩種情況的OLS預估Quantile回歸。點狀線分別表示基於0.05和0.95 Quantile損失函數的回歸

以上圖片所示的 Quantile 回歸的代碼地址:

https://github.com/groverpr/Machine-Learning/blob/master/notebooks/09_Quantile_Regression.ipynb

理解 Quantile 損失函數

基於 Quantile 的回歸模型目的是根據預測變量的特定值,預測反應變量的條件分位數。 Quantile 損失實際上就是 MAE 的延伸(當分位數為第50個百分位數時,它就是MAE)。

其理念就是根據我們是否想增加正誤差或負誤差的分量選擇合適的分位數值。損失函數會根據所選分位數(γ)的值,為估計過高或估計不足做出不同的處罰。例如,γ=0.25的Quantile損失函數會向估計過高做出更多的懲罰,將預測值保持在略微低於平均值的狀態。

γ就是所需的分位數,值範圍在0和1之間。

我們也能用該損失函數計算神經網絡或基於樹的模型的預測區間。下面是用Sklearn實現梯度漸進回歸樹模型的示例。

上圖展示了用Sklearn和Quantile損失函數計算出的梯度漸進回歸樹中90%的預測區間。以γ=0.95構建上界,以γ=0.05構建下界。

比較研究

在文章《Gradient Boosting Machines, a Tutorial》(https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3885826/)中,很好的比較了這幾種損失函數。為了展示以上所有損失函數的屬性,文章作者模擬了一個取樣於sinc(x)函數的數據集,以及兩個人工模擬噪聲數據集:高斯噪聲分量ε ~ N(0, σ2),以及脈衝噪聲分量ξ ~ Bern(p)。作者添加了脈衝噪聲項來說明魯棒影響。下圖是用不同損失函數擬合GBM回歸模型的結果。

圖中依次為(A)MSE損失函數 (B)MAE損失函數(C)Huber損失函數(D)Quantile損失函數(E)原始sinc(x) 函數(F)擬合了MSE和MAE損失的平滑GBM(G)擬合了huber損失為 δ = {4, 2, 1}的平滑GBM(H)擬合了Quantile損失為α = {0.5, 0.1, 0.9}的平滑GBM

從以上模擬中我們可以觀察到:

有MAE損失的模型預測值受脈衝噪聲的影響較小,而有MSE損失的模型預測值由於噪聲數據導致的偏差,則出現輕微偏差。

有Huber損失的模型預測值對於所選超參數的值敏感度較小。

Quantile損失在對應置信度水平上做出了很好的預測。

最後我們把以上所有損失函數繪製在一張圖中:

附本文全部代碼地址:

https://nbviewer.jupyter.org/github/groverpr/Machine-Learning/blob/master/notebooks/05_Loss_Functions.ipynb

參考資料:
https://heartbeat.fritz.ai/5-regression-loss-functions-all-machine-learners-should-know-4fb140e9d4b0

限時折扣中:0806期《人工智慧-從零開始到精通》最低58折!↓↓

相關焦點

  • 機器學習中常用的5種回歸損失函數
    那你了解Huber損失、Log-Cosh損失、以及常用於計算預測區間的分位數損失麼?這些可都是機器學習大牛最常用的回歸損失函數哦!機器學習中所有的算法都需要最大化或最小化一個函數,這個函數被稱為「目標函數」。其中,我們一般把最小化的一類函數,稱為「損失函數」。它能根據預測結果,衡量出模型預測能力的好壞。
  • 機器學習初學者都應該知道的5類回歸損失函數
    -4fb140e9d4b0翻譯:石頭機器學習中的所有算法都依賴於最小化或最大化一個函數,我們稱之為「目標函數」。最小化的函數稱為「損失函數」,損失函數衡量的是模型預測預期結果的能力,最常用的最小化損失函數的方法是「梯度下降法」,把損失函數想像成起伏的山脈,梯度下降法就像從山上滑下來到達最低點。沒有一個損失函數適用於所有類型的數據,它取決於許多因素,包括異常值的存在,機器學習算法的選擇,梯度下降法的時間效率和預測的置信度等。本文的目的是了解不同的損失函數以及它們是如何幫助數據科學家。
  • 機器學習大牛最常用的5個回歸損失函數,你知道幾個?
    L1、L2損失函數相信大多數人都早已不陌生。那你了解Huber損失、Log-Cosh損失、以及常用於計算預測區間的分位數損失麼?這些可都是機器學習大牛最常用的回歸損失函數哦!機器學習中所有的算法都需要最大化或最小化一個函數,這個函數被稱為「目標函數」。
  • 機器學習經典損失函數比較
    我們常常將最小化的函數稱為損失函數,它主要用于衡量模型的預測能力。在尋找最小值的過程中,我們最常用的方法是梯度下降法,這種方法很像從山頂下降到山谷最低點的過程。 雖然損失函數描述了模型的優劣為我們提供了優化的方向,但卻不存在一個放之四海皆準的損失函數。損失函數的選取依賴於參數的數量、局外點、機器學習算法、梯度下降的效率、導數求取的難易和預測的置信度等方面。
  • 如何為模型選擇合適的損失函數?所有ML學習者應該知道的5種回歸損失函數
    損失函數的選擇取決於許多因素,包括是否有離群點,機器學習算法的選擇,運行梯度下降的時間效率,是否易於找到函數的導數,以及預測結果的置信度。這篇文章的目的就是希望幫助大家了解不同的損失函數。機器學習中的所有算法都依賴於最小化或最大化某一個函數,我們稱之為「目標函數」。最小化的這組函數被稱為「損失函數」。損失函數是衡量預測模型預測期望結果表現的指標。
  • 機器學習常用損失函數小結
    本文將介紹機器學習、深度學習中分類與回歸常用的幾種損失函數,包括均方差損失 Mean Squared Loss、平均絕對誤差損失 Mean Absolute Error Loss、Huber Loss、分位數損失 Quantile Loss、交叉熵損失函數 Cross Entropy Loss、Hinge 損失 Hinge Loss。
  • 機器學習常用損失函數總覽:基本形式、原理、特點
    本文將介紹機器學習、深度學習中分類與回歸常用的幾種損失函數,包括均方差損失 Mean Squared Loss、平均絕對誤差損失 Mean Absolute Error Loss、Huber Loss、分位數損失 Quantile Loss、交叉熵損失函數 Cross Entropy Loss、Hinge 損失 Hinge Loss。
  • 機器學習常見的損失函數以及何時使用它們
    每一個機器學習工程師都應該知道機器學習中這些常見的損失函數以及何時使用它們。在數學優化和決策理論中,損失函數或成本函數將一個或多個變量的值映射為一個實數,該實數直觀地表示與該事件相關的一些「成本」。損失函數是機器學習算法中的一個重要部分,主要用於進行算法對特徵數據集建模效果的評估,衡量算法的性能。損失函數是每個樣本預測值和真實值的差值,而成本函數是所有損失函數的平均值。但是一般兩者語義沒有明顯的區分。 損失函數直接反映了機器學習模型的預測結果。一般而言,損失函數越低,所建立的模型所提供的結果就越好。
  • 入門| 機器學習中常用的損失函數你知多少?
    選自towards data science作者:Ravindra Parmar機器之心編譯參與:李詩萌、王淑婷本文作者將常用的損失函數分為了兩大類:分類和回歸。然後又分別對這兩類進行了細分和講解,其中回歸中包含了一種不太常見的損失函數:平均偏差誤差,可以用來確定模型中存在正偏差還是負偏差。
  • 機器學習算法中的7個損失函數的詳細指南
    介紹想像一下-你已經在給定的數據集上訓練了機器學習模型,並準備好將它交付給客戶。但是,你如何確定該模型能夠提供最佳結果?是否有指標或技術可以幫助你快速評估數據集上的模型?當然是有的,簡而言之,機器學習中損失函數可以解決以上問題。
  • Python機器學習算法中的7個損失函數的詳細指南
    介紹想像一下-你已經在給定的數據集上訓練了機器學習模型,並準備好將它交付給客戶。但是,你如何確定該模型能夠提供最佳結果?是否有指標或技術可以幫助你快速評估數據集上的模型?當然是有的,簡而言之,機器學習中損失函數可以解決以上問題。
  • ...實現機器學習之邏輯回歸:邏輯回歸介紹、應用場景、原理、損失...
    作者 | 汪雯琦責編 | Carol來源 | CSDN 博客學習目標知道邏輯回歸的損失函數知道邏輯回歸的優化方法知道sigmoid函數知道邏輯回歸的應用場景應用LogisticRegression實現邏輯回歸預測知道精確率、召回率指標的區別知道如何解決樣本不均衡情況下的評估了解
  • 【深度學習】一文讀懂機器學習常用損失函數(Loss Function)
    理解:損失函數旨在表示出logit和label的差異程度,不同的損失函數有不同的表示意義,也就是在最小化損失函數過程中,logit逼近label的方式不同,得到的結果可能也不同。一般情況下,softmax和sigmoid使用交叉熵損失(logloss),hingeloss是SVM推導出的,hingeloss的輸入使用原始logit即可。一、LogLoss對數損失函數(邏輯回歸,交叉熵損失)有些同學可能覺得邏輯回歸的損失函數就是平方損失,其實並不是。
  • 理解損失函數(理論篇)機器學習你會遇到的「坑」
    性能度量與損失函數機器學習的三要素就是事實上,常見的均方誤差:既可以被當作性能度量,同時也是回歸問題的損失函數。但在更多的問題中,我們會發現,我們往往會為了減小模型的錯誤率,並不直接優化錯誤率,而是會優化另一個函數,比如在logistic回歸中,我們會優化對數似然,在SVM中,我們會優化hinge loss,在adaboost中會優化指數損失。
  • 機器學習-損失函數
    整個式子表示的意思是找到使目標函數最小時的θθ值。下面主要列出幾種常見的損失函數。一、log對數損失函數(邏輯回歸)有些人可能覺得邏輯回歸的損失函數就是平方損失,其實並不是。平方損失函數可以通過線性回歸在假設樣本是高斯分布的條件下推導得到,而邏輯回歸得到的並不是平方損失。
  • 機器學習中的 7 大損失函數實戰總結(附 Python 代碼)
    概述介紹想像一下-你已經在給定的數據集上訓練了機器學習模型,並準備好將它交付給客戶。但是,你如何確定該模型能夠提供最佳結果?是否有指標或技術可以幫助你快速評估數據集上的模型?當然是有的,簡而言之,機器學習中損失函數可以解決以上問題。損失函數是我們喜歡使用的機器學習算法的核心。但大多數初學者和愛好者不清楚如何以及在何處使用它們。
  • 如何選擇合適的損失函數,請看......
    損失函數的選擇取決於許多因素,包括是否有離群點,機器學習算法的選擇,運行梯度下降的時間效率,是否易於找到函數的導數,以及預測結果的置信度。這個博客的目的是幫助你了解不同的損失函數。損失函數可以大致分為兩類:分類損失(Classification Loss)和回歸損失(Regression Loss)。下面這篇博文,就將重點介紹5種回歸損失。
  • 機器學習中的目標函數總結
    歐氏距離損失函數定義為是向量二範數的平方,衡量了兩個向量之間的差異。在人工神經網絡發展的早期,這種函數被廣泛使用,但後來對於多分類問題,更多的採用交叉熵損失函數。 對於回歸問題,通常採用歐氏距離作為損失函數。除此之外還可以使用絕對值損失,以及Huber損失。歐氏距離損失定義為它迫使所有訓練樣本的預測值與真實標籤值儘可能接近。
  • python機器學習--線性回歸
    python機器學習--線性回歸線性回歸是最簡單的機器學習模型,其形式簡單,易於實現,同時也是很多機器學習模型的基礎。對於一個給定的訓練集數據,線性回歸的目的就是找到一個與這些數據最吻合的線性函數。在這裡插入圖片描述線性回歸模型通常使用MSE(均方誤差)作為損失函數,假設有m個樣本,均方損失函數為:==(所有實例預測值與實際值誤差平方的均值)==
  • 入門機器學習之線性回歸
    什麼是回歸分析在客觀世界中普通存在著變量之間的關係,變量之間的關係一般來說可以分成確定性關係和不確定關係,確定性關係是說變量之間的關係是可以用函數關係來表示的,另一種不確定性關係即所謂相關關係。假設有一個房屋銷售的數據如下:這個表類似於帝都5環左右的房屋價錢,我們可以做出一個圖,x軸是房屋的面積。y軸是房屋的售價,如下: