所有机器学习者都应该知道5个回归损失函数
机器学习中的所有算法都依赖于最小化或最大化函数,我们称之为“目标函数”。最小化的这组函数被称为“损失函数”。损失函数是衡量预测模型在预测预期结果方面的指标。寻找最小功能点的最常用方法是“梯度下降”。想象起伏山脉和梯度下降等损失函数就像滑下山顶到达最低点。
没有一个损失函数适用于所有类型的数据。它取决于许多因素,包括异常值的存在,机器学习算法的选择,梯度下降的时间效率,易于找到导数和预测的置信度。
损失函数可以大致分为两类:分类和回归损失。在这篇文章中,我将重点放在回归损失上。
回归函数预测数量,分类函数预测标签。
均方误差,二次损失,L2损失
均方误差(MSE)是最常用的回归损失函数。MSE是目标变量与预测值之间距离的平方和
下面是一个MSE函数的图,它的真实目标值是100,预测值在-10,000到10,000之间。MSE损失(y轴)在预测(x轴)= 100时达到最小值。范围是0到∞。
平均绝对误差,L1损失
均值绝对误差(MAE)是另一个用于回归模型的损失函数。MAE是我们的目标和预测变量之间的绝对差异的总和。所以它测量了一组预测中误差的平均大小,而不考虑它们的方向。(如果我们也考虑方向,那将被称为平均偏差误差(MBE),它是残差/误差的总和)。∞的范围也是0。
Plot of MAE Loss (Y-axis) vs. Predictions (X-axis)
MSE vs. MAE(L2损失与L1损失)
简而言之, 使用平方误差更容易解决,但使用绝对误差对异常值更加稳健。但让我们明白为什么!
每当我们训练机器学习模型时,我们的目标就是找到最小化损失函数的点。当然,当预测完全等于真实值时,这两个函数都达到最小值。
这里是对Python代码的快速回顾。我们可以编写自己的函数或使用sklearn的内置度量函数:
# true: Array of true target variable
# pred: Array of predictions
def mse(true, pred):
return np.sum((true - pred)**2)
def mae(true, pred):
return np.sum(np.abs(true - pred))
# also available in sklearn
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
让我们来看两个例子的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作为损失。
问题:在某些情况下,两种损失函数都不能提供理想的预测。例如,如果我们的数据中90%的观察值的真实目标值为150,剩下的10%的目标值在0-30之间。然后,一个以MAE为损失的模型可能会预测所有观测值为150,而忽略10%的异常值,因为它将试图接近中值。在同样的情况下,使用MSE的模型会给出许多在0到30之间的预测,因为它会偏向离群值。这两个结果在许多商业案例中都是不可取的。
在这种情况下该怎么办?一个简单的解决方案是转换目标变量。另一种方法是尝试不同的损失函数。这就是我们第三个损失函数Huber背后的动机。
Huber 损失,平滑平均绝对误差
Huber损失对数据异常值的敏感度低于平方误差损失。它在0处也可微分。它基本上是绝对误差,当误差很小时,误差是二次的。误差必须达到二次的程度取决于可以调整的超参数δ(delta)。当δ〜0时 Huber损耗接近MAE,δ〜∞时接近MSE(large numbers.)
Huber损失(Y轴)与预测(X轴)的关系图。真值= 0
delta的选择很关键,因为它决定了你愿意把什么作为一个离群值。大于delta的残差用L1最小化(L1对大的离群值不那么敏感),而小于delta的残差用L2最小化。
为什么使用Huber损失?
使用MAE进行神经网络训练的一个大问题是它的持续的大梯度,这可能导致在训练结束时使用梯度下降法丢失最小值。对于MSE来说,梯度随着损失接近最小值而减小,使其更加精确。
在这种情况下,Huber损失实际上是有帮助的,因为它绕着最小值曲线,该最小值降低了梯度。它对离群值比MSE更健壮。因此,它结合了MSE和MAE的优良特性。然而,Huber损耗的问题是我们可能需要训练超参数delta,这是一个迭代过程。
对数损失
Log-cosh是另一种比L2更平滑的回归任务。Log-cosh是预测误差的双曲余弦的对数。
Log-cosh损失(Y轴)与预测(X轴)的关系图。真值= 0
优点: log(cosh(x))大约等于(x ** 2) / 2小x到abs(x) - log(2)大x。这意味着'logcosh'的作用大部分与均方误差一样,但不会受到偶尔疯狂不正确预测的强烈影响。它具有Huber损失的所有优点,并且在各处都有两倍的差异,而不像Huber损失。
为什么我们需要二阶导数?许多像XGBoost这样的ML模型实现都使用牛顿的方法来找到最优,这就是为什么需要二阶导数(Hessian)。对于像XGBoost这样的ML框架,两次可微函数更有利。
XgBoost中使用的目标函数。注意对一阶和二阶导数的依赖性
但对数损失并不完美。对于非常大的非目标预测是恒定的,它仍然存在梯度和Hessian问题,因此导致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)
分位数的损失
在大多数现实世界的预测问题中,我们经常对预测中的不确定性感兴趣。了解预测的范围,而不是只了解点估计,可以显著改善许多业务问题的决策过程。
当我们有兴趣预测一个区间而不是仅仅是点预测时,分位数损失函数是有用的。最小二乘回归的预测区间基于一个假设,即残差(y - y_hat)在自变量的值上有恒定的方差。我们不能相信违背这个假设的线性回归模型。我们也不能抛弃将线性回归模型拟合为基线的想法,我们可以说,使用非线性函数或基于树的模型对这种情况进行更好的建模。这就是分位数损失和分位数回归的原因,因为基于分位数损失的回归提供了合理的预测区间,甚至对于非恒定方差或非正态分布的残差也是如此。
让我们看一个工作示例,以更好地理解为什么基于分位数损失的回归在异方差数据中表现良好。
分位数回归与普通最小二乘回归
左:线性关系b / w X1和Y.具有恒定的残差方差。右:线性关系b / w X2和Y,但Y的方差随着X2增加。(异)
橙线表示两种情况下的OLS估计值
分位数回归。虚线表示基于回归的0.05和0.95分位数损失函数
了解分位数损失函数
基于分位数的回归旨在估计给定预测变量的某些值的响应变量的条件“分位数”。分位数损失实际上只是MAE的扩展(当分位数是第50百分位时,它是MAE)。
我们的想法是根据我们是否想给正面错误或负面错误提供更多价值来选择分位数值。损失函数试图根据所选分位数(γ)的值对高估和低估给予不同的处罚。例如,γ= 0.25的分位数损失函数为高估提供了更多的惩罚,并试图使预测值略低于中值
γ是所需的分位数,其值介于0和1之间
分位数损失(Y轴)与预测(X轴)的关系图。Y = 0的真值
我们也可以使用这个损失函数来计算神经网络或基于树的模型中的预测间隔。以下是梯度提升树回归器的Sklearn实现示例
使用分位数损失的预测区间
上图显示使用sklearn库的GradientBoostingRegression中可用的分位数损失函数计算的90%预测区间。上限为γ= 0.95,下限为γ= 0.05。
所有的损失函数在单个图中