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

本文首發自集智專欄git

機器學習中的全部算法都依靠最小化或最大化函數,咱們將其稱爲「目標函數」。被最小化的函數就被稱爲「損失函數」。損失函數也能衡量預測模型在預測指望結果方面的性能。找到函數的最小值點的最經常使用方法是「梯度降低」。若是把損失函數比做綿亙不絕的山巒,那麼梯度降低就比如愚公同樣盡力削低山脈,讓山達到最低點。github

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

損失函數能夠大致分爲兩種類型:分類損失迴歸損失數組

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

本文全部代碼地址見文末網絡

(迴歸函數預測數量,分類函數預測標籤)

迴歸損失

  • 均方偏差(MSE),二次損失,L2損失

均方偏差是最經常使用的迴歸損失函數,它是咱們的目標變量和預測值的差值平方和。 框架

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

  • 平均絕對偏差,L1損失

平均絕對偏差(MAE)是另外一種用於迴歸模型的損失函數。MAE是目標變量和預測變量之間絕對差值之和。所以它衡量的是一組預測值中的平均偏差大小,而不考慮它們的方向(若是咱們考慮方向的話,那就是均值偏差(MBE)了,即偏差之和)。範圍爲0到∞。 機器學習

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

簡而言之,使用平方偏差更容易解決問題,但使用絕對偏差對於異常值更魯棒。咱們來看一下爲何。函數

無論咱們何時訓練機器學習模型,咱們的目標都是想找到一個點將損失函數最小化。固然,當預測值正好等於真值時,這兩個函數都會達到最小值。post

咱們快速瀏覽一下這兩種函數的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損失函數時迴歸模型的性能,建議讀讀這篇不錯的研究。記住,L1和L2損失分別是MAE和MSE的別名

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

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

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

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

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

爲什麼使用Huber損失函數?

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

在這些狀況下,Huber損失函數真的會很是有幫助,由於它圍繞的最小值會減少梯度。並且相比MSE,它對異常值更具魯棒性。所以,它同時具有MSE和MAE這兩種損失函數的優勢。不過,Huber損失函數也存在一個問題,咱們可能須要訓練超參數δ,並且這個過程須要不斷迭代。

  • Log-Cosh損失函數

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

優勢:

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

咱們爲什麼須要二階導數?不少機器學習模型,好比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)
複製代碼
  • Quantile損失函數 在大多數現實預測問題中,咱們經常很想知道咱們的預測值的不肯定性。對於不少業務問題而言,相對於知道某個預測點,瞭解預測值範圍可以大幅優化決策過程。最小二乘迴歸的預測區間基於咱們假設殘差值(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 迴歸的代碼地址: github

理解 Quantile 損失函數

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

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

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

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

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

比較研究

在文章《Gradient Boosting Machines, a Tutorial》中,很好的比較了這幾種損失函數。爲了展現以上全部損失函數的屬性,文章做者模擬了一個取樣於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損失在對應置信度水平上作出了很好的預測。

最後咱們把以上全部損失函數繪製在一張圖中:

本文所有代碼


參考資料:看這裏!

限時折扣中:0806期《人工智能-從零開始到精通》(前25位同窗可領取¥200優惠券)

相關文章
相關標籤/搜索