迴歸問題預測中的殘差
• 預測殘差:真實值和預測值之間的差異: 𝑟 = 𝑦 − 𝑦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損失函數對噪聲點比較敏感