回归问题预测中的残差
• 预测残差:真实值和预测值之间的差异: 𝑟 = 𝑦 − 𝑦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损失函数对噪声点比较敏感