最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 机器学习大牛最常用的回归损失函数以及计算预测区间

    大数据文摘出品

    合辑:杏子、睡不着的鸢尾花、乔尼凯、钱天培

    “损失函数”是机器学习优化的重要组成部分。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介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论