機器學習02——迴歸問題中的損失函數 (L2損失L1損失Huber損失函數)

迴歸問題預測中的殘差

• 預測殘差:真實值和預測值之間的差異: 𝑟 = 𝑦 − 𝑦1
• 忽略預測殘差的正負號:殘差的平方:𝑟**2
• 最佳模型:殘差平方和(Residual Sum of Squares, RSS )最小
在這裏插入圖片描述

L2損失函數:

• 在機器學習中,我們用損失函數(loss function)度量樣本真實值與模型預測值之間差異
• 當損失函數取殘差平方時,我們稱之爲L2損失,記爲:
在這裏插入圖片描述
•目標函數:最小訓練集上的損失(經驗風險最小)
在這裏插入圖片描述
• L2損失處處可導,優化計算方便(參見優化計算小節),但對噪聲敏感
在這裏插入圖片描述

L1損失函數:

• 當損失函數取殘差絕對值時,我們稱之爲L1損失,記爲:
在這裏插入圖片描述在這裏插入圖片描述

L1損失函數與L2損失函數作爲損失函數的區別能快速地總結如下:

L2損失函數 L1損失函數
不是非常的魯棒(robust) 魯棒
穩定解 不穩定解
總是一個解 可能多個解

Huber損失:

• L1損失對噪聲不敏感,但在0處不可導,在優化計算不方便
• 綜合L2損失和L1損失的優點,得到Huber損失:
在這裏插入圖片描述

兩種損失函數的計算程序

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import HuberRegressor

y_train = np.array([368, 340, 376, 954,331, 856])  #輸入數據集
X_train = np.array([1.7, 1.5, 1.3, 5, 1.3, 2.2])  #輸出數據集
plt.scatter(X_train, y_train, label= 'Train Samples')  #描繪數據

X_train = X_train.reshape(-1, 1)  #改變輸入數據維度

#L2損失函數
lr = LinearRegression()  #學習預測
lr.fit(X_train, y_train)  #訓練數據

a=range(1,6)    #利用預測出的斜率和截距繪製直線
b=[lr.intercept_+lr.coef_[0]*i for i in a]

plt.plot(a,b, 'r',label= 'Train Samples')

#Huber損失函數
huber = HuberRegressor()
huber.fit(X_train, y_train)

a=range(1,6)    #利用預測出的斜率和截距繪製直線
b=[huber.intercept_+huber.coef_[0]*i for i in a]

plt.plot(a,b, 'b',label= 'Train Samples')

print("L2損失函數:y={:.2f}+{:.2f}*x".format(lr.intercept_,lr.coef_[0]))#打印出截距
print("Huber損失函數:y={:.2f}+{:.2f}*x".format(huber.intercept_,huber.coef_[0]))#打印出截距


plt.show()
L2損失函數:y=171.82+168.78*x
Huber損失函數:y=119.87+167.66*x

程序運行結果

可以很明顯的看出,L2損失函數對噪聲點比較敏感
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章