误差与拟合
1、误差(Error)
误差这个词我们经常会遇到,在机器学习中,要评价一个预测算法的优劣,标准无非就是比较预测结果和真实结果的差别,差别越小,这个算法性能就越好,误差就是最简单直观的衡量标准。
误差反映的是代表模型的预测能力,表征模型的好坏。
2、训练误差、泛化误差、测试误差
我们已经事先分出两个数据集,训练集和测试集,彼此相互独立。。
用训练集数据训练后得到的误差叫做“训练误差”,又名”经验误差”。
我们把模型在新样本上的误差叫做”泛化误差”(又名“期望误差”,是用来衡量一个学习机器推广未知数据的能力,即根据从样本数据中学习到的规则能够应用到新数据的能力。), 用测试集数据检验后得到的误差叫做“测试误差”。 评估一个好的模型显然是泛化误差最小(我们最终是希望泛化误差最小化)但是我们显然不可能事先知道新样本是什么,所以在评估过程中使用一个独立于训练集的测试集作为代替,使用测试集上的测试误差作为泛化误差的近似。将已经训练好的模型在遇见新的样本时的表现称作”泛化性能”。
在机器学习中泛化误差常用的计算方法是:用在训练集上的误差平均值-在测试集上的误差平均值。
3、欠拟合和过拟合
学习器把训练样本自身的而一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降,这种现象在机器学习中称为过拟合(过配)。
相对的是欠拟合(欠配)。这是指训练样本的一般性质尚未学好。
误差与风险
1、风险
机器学习本质上是一种对问题真实模型的逼近,这种近似模型也叫做一个假设。因为真实模型肯定是无法得到的,那我们的假设肯定与真实情况之间存在误差,这种误差的积累也叫做风险。
2、经验风险
在我们选择了一个假设(或者获得一个分类器)后,为了得到真实误差的逼近,我们用分类器在样本数据(训练数据)上的分类结果与样本本身真实结果之间的差值来表示。这个差值叫做经验风险。
以前机器学习中经常通过经验风险的最小化作为目标,但是后来发现很多分类函数在样本集合上能够很轻易的获得100%的正确率,但是在对真实数据的分类却很糟。也表明了这种分类函数推广能力(泛化能力)差。导致这种现象的原因是:经验风险并不能够真正的逼近真实风险,因为样本集合的数目相对于真实世界要分类的数据来说就是九牛一毛。
经验风险变现为欠拟合。
3、置信风险
代表我们可以在多大程度上信任分类器在未知数据上的分类结果(不可以精确计算)。表现为过拟合。
(1)样本数量
“随着样本量的增加,训练误差接近泛化误差的概率随之增大”。
样本数量越大表明我们的学习结果正确的可能性越大,此时置信风险越小。
(2)VC维
它反映函数集的学习能力。VC维越大则模型或函数越复杂,学习能力就越强。举个例子,如果人类的智商水平可以用大脑的脑细胞数来衡量,那么机器的智商水平就可以用VC维比喻来衡量,即超高智商的人工智能,需要超高维度的机器学习模型来实现。
分类函数的VC维越大,推广能力越差, 置信风险越大。
也就是说“如果需要确保训练误差和泛化误差的差值在一个给定的范围内,需要的样本数量和假设集的VC维大小呈线性负相关。”
4、真实风险
真实的风险由两部分组成:经验风险与置信风险。
真实风险 = 结构化风险 ≤ 经验风险 + 置信风险。
现在统计学习的目标就从经验风险最小化变为经验风险与置信风险之和最小化。
误差与损失函数
在机器学习中,所有的机器学习算法都或多或少的依赖于对目标函数最大化或者最小化的过程,我们常常把最小化的函数称为损失函数,它主要用于衡量机器学习模型的预测能力。在寻找最小值的过程中,我们最常用的方法是梯度下降法。
损失函数的作用和误差一样是用来衡量模型模型预测的好坏。它是一个非负实值函数,通常使用L(Y, f(x))来表示,用于估量预测值f(x)与真实值Y的不一致程度,损失函数越小,模型的鲁棒性就越好。
虽然损失函数可以让我们看到模型的优劣,并且为我们提供了优化的方向,但是我们必须知道没有任何一种损失函数适用于所有的模型。
回归损失函数
(1)均方误差MSE——L2损失
均方误差(MSE)是回归损失函数中最常用的误差函数,它基于最小二乘法,它是预测值与目标值之间差值的平方和,其缺点是对于异常点会施以较大的惩罚,因而不够鲁棒性。
下图是均方根误差值的曲线分布,其中最小值为预测值为目标值的位置。我们可以看到随着误差的增加损失函数增加的更为迅猛。
(2)平均绝对误差MAE——L1损失
平均绝对误差(MAE)是另一种常用的回归损失函数,它是目标值与预测值之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向(注:平均偏差误差MBE则是考虑的方向的误差,是残差的和),范围是0到∞
平均绝对误差和均方误差(L1&L2)比较:
异常值较多时候—》选择MAE更好
当训练数据中含有较多的异常值时,平均绝对误差(MAE)更为有效。当我们对所有观测值进行处理时,如果利用MSE进行优化则我们会得到所有观测的均值,而使用MAE则能得到所有观测的中值。与均值相比,中值对于异常值的鲁棒性更好,这就意味着平均绝对误差对于异常值有着比均方误差更好的鲁棒性。
需要更精确的结果—》选择MSE更好
MSE在极值点却有着良好的特性,及时在固定学习率下也能收敛。MSE的梯度随着损失函数的减小而减小,这一特性使得它在最后的训练过程中能得到更精确的结果。
总结:L1损失对于异常值更鲁棒,但它的导数不连续使得寻找最优解的过程低效;L2损失对于异常值敏感,但在优化过程中更为稳定和准确。
(3)平滑平均绝对误差——Huber损失(折页函数)
Huber损失相比于平方损失来说对于异常值不敏感,但它同样保持了可微的特性。它基于绝对误差但在误差很小的时候变成了平方误差。我们可以使用超参数δ来调节这一误差的阈值。当δ趋向于0时它就退化成了MAE,而当δ趋向于无穷时则退化为了MSE,其表达式如下,是一个连续可微的分段函数:
对于Huber损失来说,δ的选择十分重要,它决定了模型处理异常值的行为。当残差大于δ时使用L1损失,很小时则使用更为合适的L2损失来进行优化。
Huber损失函数克服了MAE和MSE的缺点,不仅可以保持损失函数具有连续的导数,同时可以利用MSE梯度随误差减小的特性来得到更精确的最小值,也对异常值具有更好的鲁棒性。
而Huber损失函数的良好表现得益于精心训练的超参数δ。
# 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)
(4)分位数损失——Quantile损失
在大多数真实世界的预测问题中,我们常常希望看到我们预测结果的不确定性。通过预测出一个取值区间而不是一个个具体的取值点对于具体业务流程中的决策至关重要。
Quantile Loss实际上是MAE的扩展形式(当分位数是第50个百分位时,Quantile Loss退化为MAE)
分位数损失函数在我们需要预测结果的取值区间时是一个特别有用的工具。通常情况下我们利用最小二乘回归来预测取值区间主要基于这样的假设:取值残差的方差是常数。但很多时候对于线性模型是不满足的。这时候就需要分位数损失函数和分位数回归来拯救回归模型了。它对于预测的区间十分敏感,即使在非均匀分布的残差下也能保持良好的性能。下面让我们用两个例子看看分位数损失在异方差数据下的回归表现。
左:线性关系b / w X1和Y.具有恒定的残差方差。右:线性关系b / w X2和Y,但Y的方差随着X2增加。
上图是两种不同的数据分布,其中左图是残差的方差为常数的情况,而右图则是残差的方差变化的情况。我们利用正常的最小二乘对上述两种情况进行了估计,其中橙色线为建模的结果。但是我们却无法得到取值的区间范围,这时候就需要分位数损失函数来提供。
上图中上下两条虚线基于0.05和0.95的分位数损失得到的取值区间,从图中可以清晰地看到建模后预测值得取值范围。
分位数回归的目标在于估计给定预测值的条件分位数。实际上分位数回归就是平均绝对误差的一种拓展。分位数值得选择在于我们是否希望让正的或者负的误差发挥更大的价值。损失函数会基于分位数γ对过拟合和欠拟合的施加不同的惩罚。例如选取γ为0.25时意味着将要惩罚更多的过拟合而尽量保持稍小于中值的预测值。
γ的取值通常在0-1之间,图中描述了不同分位数下的损失函数情况,明显可以看到对于正负误差不平衡的状态。
我们可以利用分位数损失函数来计算出神经网络或者树状模型的区间。下图是计算出基于梯度提升树回归器的取值区间:
使用分位数损失的预测区间(梯度提升回归器)
90%的预测值起上下边界分别是用γ值为0.95和0.05计算得到的。
(5)双曲余弦对数损失函数——Log-Cosh损失
Log-Cosh损失函数是一种比L2更为平滑的损失函数,利用双曲余弦(计算双曲余弦的对数)来计算预测误差:
它的优点在于对于很小的误差来说log(cosh(x))与(x**2)/2很相近,而对于很大的误差则与abs(x)-log2很相近。这意味着log cosh损失函数可以在拥有MSE优点的同时也不会受到异常值的太多影响。它拥有Huber的所有优点,并且在每一个点都是二次可导的。二次可导在很多机器学习模型中是十分必要的,例如使用牛顿法的XGBoost优化模型(Hessian矩阵)。
但是Log-cosh损失并不是完美无缺的,它还是会在很大误差的情况下梯度和hessian变成了常数。
# log cosh loss
def logcosh(true, pred):
loss = np.log(np.cosh(pred - true))
return np.sum(loss)
将几种回归损失函数都放到一个图中的结果:
均方误差(MSE)、平均绝对误差(MAE)、Quantile Loss、Huber损失-----线性回归
双曲余弦对数损失函数-----XGBoost(eXtreme Gradient Boosting)
分类损失函数
(1)0-1损失函数
0-1损失是指,预测值和目标值不相等为1,否则为0。
感知机就是用的这种损失函数。但是由于相等这个条件太过严格,因此我们可以放宽条件,即满足|Y-f(X)|<T 时认为相等。
(2)对数损失函数——log损失
log损失函数的标准形式:
P(Y|X)通俗的解释就是:在当前模型的基础上,对于样本X,其预测值为Y,也就是预测正确的概率。由于概率之间的同时满足需要使用乘法,为了将其转化为加法,我们将其取对数。最后由于是损失函数,所以预测正确的概率越高,其损失值应该是越小,因此再加个负号取个反。
(3)指数损失函数——Adaboost损失
学过Adaboost算法的人都知道,它是前向分步加法算法的特例,是一个加和模型,损失函数就是指数函数。
指数损失函数的标准形式:
然而其和平方损失一样,对异常点敏感,鲁棒性不强。
(4)Hinge损失函数——SVM损失
Hinge loss用于最大间隔(maximum-margin)分类,其中最有代表性的就是支持向量机SVM。
Hinge函数的标准形式:
可以看出,当|y|>=1时,L(y)=0。
Hinge loss使得yf(x)>1的样本损失皆为0,由此带来了稀疏解,使得svm仅通过少量的支持向量就能确定最终超平面。
(5)改进平滑绝对误差——modified Huber loss
modified huber loss结合了hinge loss和logistic loss的优点,既能在yf(x)>1时产生稀疏解提高训练效率,又能进行概率估计。另外其对于(yf(x)<−1)样本的惩罚以线性增加,这意味着受异常点的干扰较少,较有鲁棒性。
(6)交叉熵损失——cross-entropy loss
我们遇到了某种规律,概率和误差函数之间肯定有一定的联系,这种联系叫做交叉熵。
交叉熵的公式定义如下
交叉熵可以告诉我们两个向量是相似还是不同。
如果是多类别分类的交叉熵是怎么样的呢?
import numpy as np
# Write a function that takes as input two lists Y, P,
# and returns the float corresponding to their cross-entropy.
def cross_entropy(Y, P):
Y = np.float_(Y)
P = np.float_(P)
return -np.sum(Y * np.log(P) + (1 - Y) * np.log(1 - P))
将上面几种分类损失函数都放到一个图中的结果:
从上图可以看出上面介绍的这些损失函数都可以看作是0-1损失的单调连续近似函数,而因为这些损失函数通常是凸的连续函数,因此常用来代替0-1损失进行优化。它们的相同点是都随着margin→−∞而加大惩罚;不同点在于,logistic loss和hinge loss都是线性增长,而exponential loss是以指数增长。
值得注意的是上图中modified huber loss的走向和exponential loss差不多,并不能看出其robust的属性。其实这和算法时间复杂度一样,成倍放大了之后才能体现出巨大差异
对数损失函数-----逻辑回归
指数损失函数-----Adaboost
Hinge损失函数------SVM
交叉熵损失-----神经网络
网友评论