大数据文摘出品
合辑:杏子、睡不着的鸢尾花、乔尼凯、钱天培
“损失函数”是机器学习优化的重要组成部分。L1、L2 损失函数相信大多数人都很熟悉。那么你知道计算预测区间常用的 Huber loss、Log-Cosh loss 和 quantile loss 吗?这些是机器学习中最常用的回归损失函数 Daniel!
机器学习中的所有算法都需要最大化或最小化一个函数,称为“目标函数”。其中,我们一般将一类被最小化的函数称为“损失函数”。它可以根据预测结果来衡量模型的预测能力。
在实际应用中,损失函数的选择会受到很多因素的制约,比如是否存在异常值、机器学习算法的选择、梯度下降的时间复杂度、推导的难度、预测值的置信度等,等等。因此,没有一种损失函数适用于所有类型的数据。本文将介绍不同种类的损失函数及其作用。
损失函数大致可以分为两类:分类问题的损失函数和回归问题的损失函数。在这篇文章中,我将重点关注回归损失。
本文中出现的代码和图表正确存储在这里:
分类和回归问题的损失函数比较
均方误差
均方误差 (MSE) 是最常用的回归损失函数。计算方法是求预测值与真实值距离的平方和。公式如图所示。
下图是 MSE 函数的图像,其中目标值为 100,预测值范围为 -10000 到 10000,Y 轴表示的 MSE 值范围为 0 到正无穷,在预测值为 100。
MSE 损失(Y 轴)- 预测值(X 轴)
平均绝对值误差(也称为 L1 损失)
平均绝对误差 (MAE) 是回归模型中使用的另一种损失函数。MAE是目标值与预测值之差的绝对值之和。它只测量预测值误差的平均模长度,与方向无关,取值范围也是从0到正无穷(如果考虑方向,就是残差/误差之和-均值偏差(MBE) )。
MAE损失(Y轴)-预测值(X轴)
MSE(L2 损失)与 MAE(L1 损失)的比较
简而言之,MSE 易于计算,但 MAE 对异常值具有更好的鲁棒性。下面将介绍两者差异的原因。
在训练机器学习模型时,我们的目标是找到损失函数达到最小值的点。当预测值等于真实值时,这两个函数都被最小化。
下面是这两个损失函数的python代码。您可以编写自己的函数或使用 sklearn 的内置函数。
# true: Array of true target variable# pred: 预测数组def mse(true, pred):return np.sum((true – pred)**2)def mae(true, pred):return np.sum(np.abs (true – pred))# 也可用于 sklearnfrom sklearn.metrics import mean_squared_errorfrom sklearn.metrics import mean_absolute_error
现在让我们观察两个例子中 MAE 和 RMSE(即 MSE 的平方根,与 MAE 处于同一数量级)的计算结果。在第一个例子中,预测值非常接近真实值,误差的方差很小。在第二个例子中,误差非常大,因为存在异常值。
左:误差比较接近 右:一个误差比其他误差大很多
从图中可以学到什么?损失函数应该如何选择?
MSE 平方误差(让 e = 真值 – 预测值),所以如果 e > 1,MSE 将进一步增加误差。如果数据中有异常值,e的值会很大神经网络 损失函数种类,e会比|e|大很多。
因此,使用 MSE 的模型比使用 MAE 计算损失的模型赋予异常值更多的权重。在第二个例子中,使用 RMSE 计算损失的模型在减少异常值误差的方向上进行更新,代价是牺牲其他样本的误差。但是,这会降低模型的整体性能。
如果训练数据被异常值污染(例如,训练数据中有很多假阴性和阳性标签,但测试集中没有),MAE 损失会更好。
直观上可以这样理解:如果我们最小化MSE,只给所有样本点一个预测值,那么这个值一定是所有目标值的平均值。但是如果是最小化MAE,那么这个值就是所有样本点的目标值的中位数。众所周知,中位数对异常值比均值更稳健,因此 MAE 对异常值也比 MSE 更稳定。
但是,MAE 有一个严重的问题(尤其是对于神经网络):更新的梯度总是相同的,即即使对于小的损失值,梯度也很大。这不利于模型学习。为了解决这个缺陷,我们可以使用不同的学习率,当损失接近最小值时降低学习率。
而 MSE 在这种情况下表现得非常好,即使在固定学习率的情况下也能有效收敛。MSE损失的梯度随着损失的增加而增加,随着损失接近0而减少。这使得使用MSE模型的结果在训练结束时更加准确。
根据不同情况选择损失函数
如果异常值代表业务中重要且需要检测的异常,则应使用 MSE 损失函数。相反,如果仅将异常值视为损坏数据,则应使用 MAE 损失函数。
建议您阅读这篇文章,它比较了使用 L1、L2 损失的回归模型在有或没有异常值的情况下的性能。
文章网址:
这里 L1 loss 和 L2 loss 只是 MAE 和 MSE 的别称。
总而言之,L1损失函数在处理异常值时比较稳定,但是它的导数是不连续的,所以求解效率较低。L2损失函数对异常值更敏感,但通过使其导数为零,可以获得更稳定的闭合解。
两者的问题在于,在某些情况下,上述两个损失函数都不够用。例如,如果数据中 90% 的样本对应于目标值 150,则剩余的 10% 介于 0 和 30 之间。那么使用 MAE 作为损失函数的模型可能会忽略 10% 的异常值并预测所有的 150样品。
这是因为模型按中位数进行预测。使用 MSE 的模型将给出 0 到 30 之间的许多预测,因为该模型将偏向异常值。在许多业务场景中,上述两种结果都是不可取的。
在这些情况下应该怎么做?最简单的方法是转换目标变量。另一种方式是改变一个损失函数,这就引出了下面要讨论的第三个损失函数,即Huber损失函数。
Huber 损失,平滑平均绝对误差
Huber 损失对数据中的异常值的敏感性低于平方误差损失。在0处也是可微分的。本质上,Huber loss是一个绝对误差,但是当误差很小的时候,就变成了平方误差。误差下降多长时间变为二次误差由超参数delta(delta)控制。Huber loss在[0-δ,0+δ]之间时,相当于MSE,当[-∞,δ]和[δ,+∞]时为MAE。
Huber 损失(Y 轴)与预测值(X 轴)。真值为0
超参数 delta 的选择在这里非常重要,因为这决定了您对异常值的定义。当残差大于 delta 时,应该使用 L1(对较大的异常值不太敏感)来最小化,如果残差小于超参数,则应该使用 L2 来最小化。
为什么使用 Huber 损失函数?
使用 MAE 训练神经网络的最大问题之一是恒定的大梯度,这可能导致在使用梯度下降接近结束时错过最小点。而对于 MSE,梯度随着损失的减小而减小,从而使结果更加准确。
在这种情况下,Huber 损失非常有用。由于梯度减小,它将接近最小值。它比 MSE 对异常值更稳健。因此,Huber 损失结合了 MSE 和 MAE 的优点。然而,Huber loss 的问题在于我们可能需要不断地调整超参数 delta。
Log-Cosh 损失
Log-cosh 是另一种用于回归问题的损失函数,比 L2 更平滑。它被计算为预测误差的双曲余弦的对数。
对数损失(Y 轴)与预测值(X 轴)。真值为0
优点:log(cosh(x)) 对于小 x 大约等于 (x^2)/2,对于大 x 大约等于 abs(x)-log(2))。这意味着 ‘logcosh’与均方误差基本相似,但不易受到异常值的影响。它具有 Huber loss 的所有优点,但与 Huber loss 不同的是,Log-cosh 二阶处处可微。
为什么需要二阶导数?XGBoost 等许多机器学习模型使用牛顿法来寻找最优点。而牛顿法需要求解二阶导数(Hessian)。因此,对于 XGBoost 等机器学习框架,损失函数的二阶可微性是必要的。
XgBoost 中使用的目标函数。注意对一阶和二阶导数的依赖
但是Log-cosh loss并不完美,它仍然存在一些问题。例如,如果误差很大,一阶梯度和 Hessian 会变成固定值,导致 XGBoost 中缺少分裂点。
Huber 和 Log-cosh 损失函数的 Python 代码:
# huber lossdef huber(true, pred, delta): loss = np.where(np.abs(true-pred)
分位数损失
在大多数现实世界的预测问题中,我们通常希望了解预测中的不确定性。了解预测的范围,而不仅仅是估计点神经网络 损失函数种类,有助于对许多业务问题做出决策。
当我们更关心区间预测而不仅仅是点预测时,分位数损失函数很有用。基于残差 (y-y_hat) 是自变量且方差保持不变的假设,使用最小二乘回归执行区间预测。
一旦违反了这个假设,那么线性回归模型就不再成立。但是我们不能证明使用非线性函数或基于树的模型更好,并放弃线性回归模型作为基线方法。这就是分位数损失和分位数回归派上用场的地方,因为基于分位数损失的回归可以给出合理的预测区间,即使对于具有不同方差或非正态分布的残差也是如此。
让我们看一个下面的实际示例,以更好地了解基于分位数损失的回归如何处理异方差数据。
分位数回归和最小二乘回归
左:b/wX1 和 Y 是线性的。具有恒定的残差。右图:b/wX2 和 Y 是线性的,但 Y 的方差随着 X2 的增加而增加。(异方差)
橙色线代表两种情况下 OLS 的估值
分位数回归。虚线表示基于 0.05 和 0.95 分位数损失函数的回归
附上图中分位数回归的代码:
了解分位数损失函数
如何选择合适的分位数取决于我们对正负误差的重视程度。损失函数通过分位数(γ)对高估和低估给出不同的惩罚。例如,当分位数损失函数 γ=0.25 时,高估的惩罚较大,使得预测值略低于中位数。
γ 是所需的分位数,其值介于 0 和 1 之间。
分位数损失(Y 轴)与预测值(X 轴)。Y的真值为0
此损失函数还可以计算神经网络或基于树的模型中的预测区间。以下是使用 Sklearn 实现梯度提升树回归模型的示例。
使用分位数损失的预测区间(梯度提升回归器)
上图表明:在sklearn库的梯度提升回归中使用quantile loss可以得到90%的预测区间。上限为γ=0.95,下限为γ=0.05。
比较研究
为了展示上述所有损失函数的特点,我们来看一个对比研究。首先,我们构建了一个从 sinc(x) 函数中采样的数据集,并引入了两个伪像:一个高斯噪声分量 εN(0,σ2) 和一个脉冲噪声分量 ξBern(p)。
添加脉冲噪声以说明模型的稳健性。下面是拟合具有不同损失函数的 GBM 回归器的结果。
连续损失函数:(A)MSE损失函数;(B) MAE损失函数;(C) Huber损失函数;(D) 分位数损失函数。将平滑 GBM 拟合到噪声 sinc(x) 数据的示例:(E) 原始 sinc(x) 函数;(F) 平滑 GBM 与 MSE 和 MAE 损失;(G) 用 Huber loss 平滑 GBM 和 δ={4,2,1};(H) 带有分位数损失的平滑 GBM,α={0.5,0.1,0.9}。
模拟比较的一些观察结果:
MAE 损失模型的预测结果受脉冲噪声影响较小,而 MSE 损失函数的预测结果被这种影响略有抵消。Huber损失模型的预测结果对选择的超参数不敏感。分位数损失模型给出了具有合适置信水平的良好估计。
最后,让我们把所有的损失函数放到一张图中,我们就得到了下面这张漂亮的图片!他们之间的区别是不是很明显?
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 欧资源网