模型评估与模型选择
模型评估与模型选择
模型评估与模型选择
模型评估
对模型的泛化性能进行评估,需要有对应的评价标准,即:性能度量。我们通过模型在未知数据上的性能度量指标来判断模型的泛化能力大小。
性能度量反映了任务需求,在对比不同模型的能力时,使用不同的度量指标往往会导致不同的评判结果,这意味着模型的好坏是相对的。
回归任务的评估指标
回归任务中常用的评估指标有:平均绝对误差(Mean Absolute Error,简称 MAE)、均方误差(Mean Square Error,简称 MSE)、均方根误差(Root Mean Square Error,简称 RMSE),他们的取值范围都是零到正无穷,表达式如下:
公式中的m是样本数量,f(xi)是样本预测值,yi是样本标记值。
分类任务的评估指标
准确率是指模型在给定数据集上正确分类的样本数与总样本数之比,公式如下:
准确率、精确率、召回率、F1值都是基于混淆矩阵进行计算的,下面我们来看一个混淆矩阵的例子:
图中混淆矩阵主对角线上的 3 和 2 表示预测正确的样本数,由此我们可以计算出模型预测的准确率为:(3+2)/11 = 5/11;混淆矩阵中暗蓝色区域的 4 表示有 4 个 B 类样本被预测为了 A 类。
假如我们比较关注 A 类样本,那么就可以通过混淆矩阵来计算模型对 A 类样本预测的精确率、召回率和 F1 值,计算过程如下:
请你根据上面的计算过程结合混淆矩阵思考一下这三个度量指标的含义,思考过后再点击确认查看正确的解释:
对比混淆矩阵和每个指标的计算数值,我们可以得出的结论是:精确率描述模型预测出的 7 个 A 类样本中有多少是预测正确的;召回率描述模型将 5 个 A 类样本预测出来的数量;F1 值是精确率和召回率的调和均值,公式中 P 和 R 分别代表精确率和召回率。
精确率和召回率的分子都是预测正确的样本数,区别在于分母。
下面我们再看一下类别数为 3 时的混淆矩阵示例和相关指标的计算:
在这个例子中,我们比较关心 B 类样本的情况,所以计算了模型对 B 类样本预测的精确率、召回率和 F1 值。
不管二分类还是多分类,我们通常把我们所关心的样本称为正样本,其他样本称为负样本。你也可以理解为和我们的目标相关的就是正样本。比如广告系统的目标是通过算法提升商品的点击率,那么样本标记值为点击的就是正样本。
一般来说,我们所计算的精确率、召回率和 F1 值都是相对于正样本而言的。
上面介绍的准确率、精确率、召回率、F1值等评价指标,主要是看模型在测试集上的表现,因为测试集不参与模型的训练,可以用来估计模型的泛化性能。当然也可以计算训练集上的对应指标,但是没有太大的意义,因为泛化能力是指模型对未知数据的预测能力。
未知数据一般指的是将来某个时间产生的数据,但是当前的时间点我们拿不到未来的数据,所以只能计算模型在测试集上的相关度量指标来估计模型的泛化能力。
过拟合的现象
前面说过,我们要选择泛化能力较强的模型,但是在模型训练中经常会出现过拟合的现象,具体表现为模型对已知数据预测得很好,但是对未知数据的预测效果却很差,下面我们通过多项式回归的一个例子来理解一下过拟合现象:
由模型公式可知:多项式回归模型的输入只有一个特征 x ,M 是多项式的最高次数,不同的取值代表了不同复杂度的多项式回归模型,M取值越小,模型参数越少,复杂度越低。
下面,你可以通过点击Enter直观感受一下当 M 取不同值时模型对数据点的拟合情况:
图中的蓝色圆点是在 sin(2πx) 函数的基础上加了随机噪声生成的训练数据,红色曲线是不同复杂度的多项式回归模型曲线。
当 M=0 或 M=1 时,多项式函数表达能力较差,难以代表 sin(2πx) 函数;当 M=9 时,多项式函数完美拟合训练集中的每个点,但曲线震荡,对于新的满足 sin(2πx) 函数的数据点表达能力差,即出现过拟合现象;当 M=3 时的多项式函数对 sin(2πx) 函数的拟合效果相对较好。
过拟合的原因
产生过拟合的原因有以下几个方面:
(1)训练集数量太少。模型只在少量的数据上进行拟合,学不到数据的一般性规律;
(2)样本里的噪声数据干扰过大,大到模型过分记住了噪声特征,反而忽略了真实的输入与输出间的关系;
(3)训练集和测试集的特征分布不一致;
(4)模型复杂度过高,如上面的多项式回归中 M=9 时就产生了过拟合;
(5)训练迭代的次数过多,导致模型拟合了训练数据中的噪声和没有代表性的特征。
过拟合的解决办法
针对上述原因,解决过拟合的办法有:
(1)增加训练集数量;
(2)重新清洗数据(删除稀疏特征、对噪声数据进行删除或替换);
(3)重新进行数据采样和特征筛选;
(4)正则化;
(5)交叉验证;
(6)在模型收敛之前停止迭代训练;
(7)使用集成学习算法;
(8)若是神经网络模型,可以使用 dropout。
过拟合的解决办法在面试中经常会被问到,建议你先背下来,后面接触到相关知识后再慢慢理解。关于神经网络的更多知识,
模型选择与调参
正则化和交叉验证是常用的两种模型选择方法,交叉验证和网格搜索是确定模型超参数常用到的方法,下面我们逐一进行学习。
正则化
正则化等价于结构风险最小化,结构风险是在经验风险上加上表示模型复杂度的正则化项。在本章的第一节课中,我们已经学习过了经验风险函数的表达式,下面我们再来学习一下正则化项和结构风险函数的表达形式。
正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。我们一般将模型参数向量的范数作为正则化项。
我们先来看一下向量范数的函数表达式:
公式中w的一般性表示是一个向量,本节课我们特指模型的参数向量。该向量的p范数是将向量各元素绝对值的 p 次方求和再开 p 次方根,数学上表示的是将向量映射为标量的一个函数。因此,我们可以通过向量范数来比较两个向量的大小。
机器学习中经常将参数向量的1范数和2范数作为正则化项,对应的正则化叫L1 正则和L2 正则。
前面说过,结构风险是在经验风险上加上表示模型复杂度的正则化项,即:结构风险 = 经验风险+正则化项,所以不同的正则化项构成了不同的结构风险,如下图所示:
图中分别是 L1 正则和 L2 正则对应的结构风险表达式,为了计算的方便和控制正则化强度,正则化项一般设置为参数向量范数的单调递增函数。公式中的λ用来调节经验风险和正则化项之间的关系,第一个公式中的正则项是参数向量的 2 范数平方后再乘以1/2,这么设计是为了求梯度后形式的简洁,方便写梯度下降的代码。
具体来说,上面第一个公式中的正则项对参数向量求梯度就是参数向量本身。正则项只要是参数向量范数的增函数,无论有没有1/2都不影响最优解。
因为结构风险中包含了正则化项,所以最小化结构风险可以对模型复杂度进行限制,从而防止模型复杂度过高导致的过拟合。
经验风险和结构风险都是模型参数的函数,最小化经验风险或结构风险得到对应的模型参数是机器学习的目标,因此经验风险和结构风险就成了这个最小化问题的目标函数。
正则化可以防止过拟合你应该理解了,那为什么说正则化可以进行模型选择呢?
因为相同算法模型的差异主要体现在模型参数上,恰好正则化是对模型参数进行了限制,所以正则化可以进行模型选择。
进行模型选择的另一种方法是交叉验证,在学习交叉验证之前,我们来看一下和它有关的另一种模型选择方法:留出法。
留出法
一般来说,设置不同的超参数时,训练得到的模型是不一样的,不恰当的超参设置有可能会导致模型过拟合。因此,我们需要从已有的训练数据中再划分出一部分数据来进行超参的选择,这部分数据一开始不参与模型的训练过程,仅用来验证模型的泛化性能,我们称之为验证集,如图所示:
举个例子,上节课我们在训练线性回归模型时,要设置迭代次数epoch这个超参数,根据前面过拟合的原因分析可知,迭代次数过多有可能导致模型的过拟合。这时我们就可以通过模型每次迭代后在训练集 D1 和验证集 D2上的性能度量指标画两条学习曲线,通过曲线的变化来判断epoch超过多少会发生过拟合,进而确定epoch的最佳取值,如图所示:
当epoch>15时,验证集 D2 上的预测误差在慢慢变大,而训练集 D1上的误差还在减小,模型在过拟合训练集 D1 的数据。
我们假定在原训练集 D 上也有这种规律,因此将 15 设置为 epoch 的最佳取值,然后在原训练集 D 上重新训练模型。这样一来,通过在验证集上的性能评估和超参选择,可以防止模型在全量训练数据的训练中发生过拟合。
实际上我们是根据 D1 上训练出的模型的泛化性能来估计 D 上训练出的模型的泛化性能,所以训练集和验证集的划分也比较重要,一般是将大约2/3~4/5的样本用于训练,剩余的样本用于模型评估。
需要注意的是:在模型训练时,有时会出现不断增大 epoch 时,验证集上的误差也不会出现反弹的现象。原因可能是验证集数量太少,恰好模型学习到了训练集和验证集的一般性规律,如果扩展到无限的未知数据中,误差的变化就很难说了。
另一个原因是模型本身的复杂度不高,当训练数据比较充足时不容易过拟合。此外,过拟合的原因是多方面的,并不是 epoch 单个因素决定的。一般来说,深度学习模型由于参数量大,模型复杂,在训练数据较少且迭代次数过多时容易发生过拟合。
我们使用验证集进行模型选择和超参的选择(也称为调参),然后在全量的训练数据上进行模型训练,最后在测试集上进行离线评估;也可以一开始不划分测试集,在使用验证集完成模型选择和调参之后,直接用全量的离线数据进行最终的模型训练,然后将模型部署到线上进行测试,如图所示:
上面介绍的从训练数据中留出一部分数据作为验证集用于模型评估和选择的方法叫做留出法,一般在样本数据充足的情况下使用。当数据量不足时,用于模型评估的验证集也会不足,这将导致模型评估结果出现偏差。这时,我们可以使用交叉验证的方法进行模型的选择。
交叉验证
交叉验证的评估结果在很大程度上会受 K 值的影响,为了强调这一点,通常把交叉验证称为K折交叉验证,K 常用的取值有 5 和 10 ,下面是 5 折交叉验证的示意图:
由上图可知,使用 K 折交叉验证进行模型评估和选择可以使用到整个训练集 D 的数据,因而评估结果比留出法更可信一些。与留出法类似,使用交叉验证进行模型选择和调参可以防止在全量数据上训练模型时发生过拟合。
当 K 的取值为样本总数时,称为留一交叉验证,也就是每次验证集的数量都为 1 。
网格搜索
5 折交叉验证要进行 5 次模型训练和验证。假如我们要选择的学习率有 3 个经验取值,分别是 0.1,0.01,0.001,则一共要进行 5x3=15 次模型训练,才能判断出哪个学习率取值比较合适。
一般来说,模型的超参数不止一个,这时就要使用网格搜索来进行交叉验证了。
例如:有两个超参数,分别有3个经验取值,则他们的组合取值有 9 种;不同的超参数组合被放在一个个网格中,我们需要在每种超参数组合下执行一次 K 折交叉验证,如图所示: