机器学习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损失函数对噪声点比较敏感
在这里插入图片描述

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