回归模型常见的损失函数
Posted mishidemudong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回归模型常见的损失函数相关的知识,希望对你有一定的参考价值。
注意:如果图片不显示,请建议科学上网或者使用VPN。
机器学习中的所有算法都依赖于最小化或最大化函数,我们将其称为“目标函数”。最小化的函数组称为“损失函数”。损失函数是衡量预测模型在能够预测预期结果方面的表现有多好的指标。寻找最小值的最常用方法是“梯度下降”。想想这个函数的作用,如起伏的山脉和梯度下降就像滑下山到达最低点。
没有一种损失函数适用于所有类型的数据。它取决于许多因素,包括异常值的存在,机器学习算法的选择,梯度下降的时间效率,易于找到衍生物和预测的置信度。
损失函数可大致分为两类:分类和回归损失。在这篇文章中,专注于讨论回归损失函数。
回归损失
均方误差(MSE)(又称二次损失,L2损失)是最常用的回归损失函数。MSE是目标变量和预测值之间的平方距离之和。
M S E = ∑ i = 1 n ( y i − y i p ) 2 n M S E=\\frac{\\sum_{i=1}^{n}\\left(y_{i}-y_{i}^{p}\\right)^{2}}{n} MSE=n∑i=1n(yi−yip)2
下面是MSE函数的图,其中真实目标值为100,预测值范围在-10,000到10,000之间。MSE损失(Y轴)在预测(X轴)= 100时达到其最小值。其范围是0到∞。
MSE损失(Y轴)与预测(X轴)的关系图
平均绝对误差(MAE)(又称L1损失)是用于回归模型的另一种损失函数。MAE是我们的目标和预测变量之间的绝对差异的总和。因此,它在不考虑方向的情况下测量一组预测中的平均误差大小。(如果我们也考虑方向,那将被称为平均偏差误差(MBE),它是残差/误差的总和)。其范围也是0到∞。
M A E = ∑ i = 1 n ∣ y i − y i p ∣ n M A E=\\frac{\\sum_{i=1}^{n}\\left|y_{i}-y_{i}^{p}\\right|}{n} MAE=n∑i=1n∣yi−yip∣
MAE损失(Y轴)与预测(X轴)的关系图
MSE与MAE(L2损失与L1损失)
简而言之, 使用平方误差更容易解决,但使用绝对误差对异常值更为稳健。但是让我们明白为什么!
每当我们训练机器学习模型时,我们的目标是找到最小化损失函数的点。当然,当预测完全等于真实值时,两个函数都达到最小值。
这里是两个python代码的快速回顾。
import numpy as np
#true:真实目标变量的数组
#prep:预测数组
def mse(true,pred):
return np.sum((true - pred)** 2)
def mae(true,pred):
return np.sum(np.abs(true - pred))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
让我们看看MAE和均方根误差的值(RMSE,它只是MSE的平方根,使其与MAE的比例相同)。在第一种情况下,预测接近真实值,并且误差在观察值之间具有小的差异。在第二个,有一个异常值观察,误差很高。
我们从中观察到了什么,它如何帮助我们选择使用哪种损失函数?
由于MSE平方误差(y-y_predicted = e),如果e> 1,则误差(e)的值会增加很多。如果我们的数据中有异常值,则e的值将为高,e²将为>> | E |。这将使具有MSE损失的模型比具有MAE损失的模型对异常值更敏感。在上面的第二种情况中,将调整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损失(又称平滑平均绝对误差)对数据中的异常值的敏感性低于平方误差损失。它在0处也是可微分的。它基本上是绝对误差,当误差很小时变为二次曲线。该误差必须多小才能使其成为二次方取决于可以调整的超参数δ(delta)。当δ0时,**Huber损失接近**MAE,当δ∞(大数)时, Huber损耗接近MSE。
L δ ( y , f ( x ) ) = { 1 2 ( y − f ( x ) ) 2 for ∣ y − f ( x ) ∣ ≤ δ δ ∣ y − f ( x ) ∣ − 1 2 δ 2 otherwise L_{\\delta}(y, f(x))=\\left\\{
12(y−f(x))2δ|y−f(x)|−12δ2amp; for |y−f(x)|≤δamp; otherwise
\\right. Lδ(y,f(x))={21(y−f(x))2δ∣y−f(x)∣−21δ2 for ∣y−f(x)∣≤δ otherwise
Hoss损失(Y轴)与预测(X轴)的关系图。
δ的选择至关重要,因为它决定了你愿意考虑的异常值。大于δ的残差最小化为L1(对大异常值不敏感),而小于δ的残差最小化为“适当”L2。
**为什么要使用Huber Loss?**使用MAE训练神经网络的一个大问题是其持续的大梯度,这可能导致在训练结束时使用梯度下降丢失最小值。对于MSE,随着损失接近其最小值,梯度减小,使其更精确。
在这种情况下,胡贝尔损失确实很有用,因为它在最小值附近弯曲,从而降低了梯度。而且它比MSE更强大。因此,它结合了MSE和MAE的良好特性。然而,Huber损失的问题是我们可能需要训练超参数δ,这是一个迭代过程。
Log-cosh是回归任务中使用的另一个函数,比L2更平滑。Log-cosh是预测误差的双曲余弦的对数。
L ( y , y p ) = ∑ i = 1 n log ( cosh ( y i p − y i ) ) L\\left(y, y^{p}\\right)=\\sum_{i=1}^{n} \\log \\left(\\cosh \\left(y_{i}^{p}-y_{i}\\right)\\right) L(y,yp)=i=1∑nlog(cosh(yip−yi))
Log-cosh Loss(Y轴)与预测(X轴)的关系图。
**优点:**当x值较小 时,log(cosh(x))
约等于(x ** 2) / 2
;当x值较大时,约等于abs(x) - log(2)
。这意味着’logcosh’的作用大部分类似于均方误差,但不会受到偶然误差预测的强烈影响。它具有Huber损失的所有优点,并且它在各处都是可区分的,与Huber损失不同。
**为什么我们需要二阶导数?**像XGBoost这样的许多ML模型实现使用牛顿方法来找到最优,这就是为什么需要二阶导数(Hessian)。对于像XGBoost这样的ML框架,两个可区分的函数更有利。
XgBoost中使用的目标函数。注意对1阶和2阶导数的依赖性
但Log-cosh损失并不完美。对于非常大的脱靶预测是恒定的,它仍然存在梯度和粗麻布的问题,因此导致没有XGBoost的分裂。
Huber和Log-cosh损失函数的Python代码:
# huber loss
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 loss
def logcosh(true, pred):
loss = np.log(np.cosh(pred - true))
return np.sum(loss)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
在大多数现实世界预测问题中,我们通常有兴趣了解预测中的不确定性。了解预测范围而不仅仅是点估计可以显着改善许多业务问题的决策过程。
当我们对预测区间而不是仅预测点预测感兴趣时,分位数损失函数变得有用。来自最小二乘回归的预测区间基于以下假设:残差在独立变量的值上具有恒定的方差。我们认为违反这一假设的线性回归模型。我们也不能仅仅通过使用非线性函数或基于树的模型来更好地建模。这种情况来将不能利用线性回归模型来拟合。这是分位数损失和分位数回归将派上用场了,因为基于分位数损失的回归甚至对于具有非恒定方差或非正态分布的残差提供了合理的预测区间。
让我们看一个工作示例,以更好地理解为什么基于分位数损失的回归在异方差数据中表现良好。
分位数回归与普通最小二乘回归
左:具有恒定的残差方差。右:Y的方差随X2增加。
橙色线表示两种情况的OLS估计值
分位数回归。虚线表示基于回归的0.05和0.95分位数损失函数
了解分位数损失函数
基于分位数的回归旨在估计给定某些预测变量值的响应变量的条件“分位数”。分位数损失实际上只是MAE的延伸(当分位数为50%时,它是MAE)。
我们的想法是根据我们是否希望为正误差或负误差提供更多价值来选择分位数值。损失函数试图基于所选分位数( γ \\gamma γ)的值给予过高估计和低估的不同惩罚。例如, γ \\gamma γ= 0.25的分位数损失函数给予过高估计更多的惩罚,并试图将预测值保持在中位数以下
L γ ( y , y p ) = ∑ i = y i < y i p ( γ − 1 ) . ∣ y i − y i p ∣ + ∑ i = y i ≥ y i p ( γ ) . ∣ y i − y i p ∣ L_{\\gamma}\\left(y, y^{p}\\right)=\\sum_{i=y_{i}<y_{i}^{p}}(\\gamma-1) .\\left|y_{i}-y_{i}^{p}\\right|+\\sum_{i=y_{i} \\geq y_{i}^{p}}(\\gamma) .\\left|y_{i}-y_{i}^{p}\\right| Lγ(y,yp)=i=yi<yip∑(γ−1).∣yi−yip∣+i=yi≥yip∑(γ).∣yi−yip∣
γ \\gamma γ是所需的分位数,其值介于0和1之间。
分位数损失(Y轴)与预测(X轴)的关系图。Y = 0的真值
我们还可以使用此损失函数来计算神经网络或基于树的模型中的预测间隔。下面是梯度提升树回归器的Sklearn实现示例。
使用分位数损失预测区间(梯度增强回归)http://scikit-learn.org/stable/auto_examples/ensemble/plot_gradient_boosting_quantile.html*
上图显示了使用sklearn库的GradientBoostingRegression中可用的分位数损失函数计算的90%预测区间。上限构建为 γ \\gamma γ= 0.95,下限使用 γ \\gamma γ= 0.05。
“ Gradient boosting machines,a tutorial ”中提供了一个很好的比较模拟。为了证明上述所有损失函数的性质,他们模拟了一个采用sinc(x)函数采样的数据集,该函数具有两个人工模拟噪声源:高斯噪声分量ε~ N(0,σ2)和脉冲噪声分量ξ~Bern(p)。添加脉冲噪声项以说明鲁棒性效应。以下是使用不同损失函数拟合GBM回归量的结果。
连续损失函数:(A)MSE损失函数; (B)MAE损失函数; (C)Huber损失函数; (D)分位数损失函数
演示将平滑的GBM拟合到有噪声的sinc(x)数据
(E)原始sinc(x)函数; (F)MSE和MAE损失的光滑GBM; (Huber损失的光滑GBM,δ= {4,2,1}; (H)分位数损失的光滑GBM,α= {0.5,0.1,0.9}。
模拟的一些观察结果:
- 具有MAE损失函数的模型的预测受脉冲噪声的影响较小,而具有MSE损失函数的预测由于引起的偏差而略微偏差。
- 对于具有huber损失函数的模型,预测对于选择的超参数值非常敏感。
- 分位数损失函数可以很好地估计相应的置信水平。
单个图中的所有损失函数。
翻译文献:
https://heartbeat.fritz.ai/5-regression-loss-functions-all-machine-learners-should-know-4fb140e9d4b0
以上是关于回归模型常见的损失函数的主要内容,如果未能解决你的问题,请参考以下文章