从机器学习到深度学习:基于scikit-learn与TensorFlow的高效开发实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 评估理论

笔者在1.2节中指出,在机器学习项目开发流程中需要尝试多种算法与参数,并在比较后选择最优模型部署,所以如何评估模型的优劣成为一个必要的步骤。本节介绍评估的常用术语和方法。

1.4.1 划分数据集

任何机器学习算法都是基于对已有数据集或环境的信息挖掘,要求将从现有数据学习得到的模型能够适配于未来的新数据。

1.训练集(Training set)与测试集(Test set)

很自然的,在评估模型能力的时候需要采用与模型训练时不同的数据集,因此在训练模型之前需要将已有训练集与测试集划分成如图1-13所示的两部分。

图1-13 训练集与测试集的划分

顾名思义,图中的训练集用于在训练模型时使用,测试集用于评估模型准确率。一般训练集与测试集一旦划分就无须再变动,因为只有稳定的测试集才能用来衡量不同模型的准确率。一旦重新划分两个集合,那么需要重新训练所有模型并在新的测试集上进行评估。

2.随机采样(Random Sampling)

一般来说两个集合的划分需加入随机因子,使得每个数据项有相等的机会被分到任一集合中。如不加入随机因子,可能出现类似这样的问题:数据整体是一年的按时间排序的皮大衣销售数据。如果不用随机采样策略,划分后训练集中只包括春、夏两季的用户数据,而测试集中是秋、冬季的数据。此时用春、夏季数据训练的模型明显无法很好地预测秋、冬季销售情况。

同理,如果医疗诊断系统中训练集与测试集有不同的病人年龄层分布,那也无法训练出适配所有年龄层次人的诊断模型。

3.分层采样(Stratified Sampling)

划分数据集时的另一个常见陷阱是每种标签的数据没有均匀地被划分到训练集与测试集中。比如在医疗诊断系统中,如果将健康人群都分到了训练集,而有病况的人群都被分到了测试集,那么训练出的模型肯定会漏诊,即将有病况的人预测为健康人。

所谓的分层采样就是一种在划分训练/测试集时保持标签数据比例的采样规则,如图1-14所示。

图1-14 分层采样

图中圆形、三角形、菱形分别代表三种数据标签,分层采样的要求是将所有类型的标签等比例划分到不同数据集中。

4.验证集(Validation set)

验证集是在某个模型的学习过程中用来调试超参数的数据集。因为大多数算法有可配超参数(如神经网络层数、EM类算法的最大迭代数等),所以验证集在机器学习领域也很常见,其作用如图1-15所示。

图1-15 验证集的作用

图1-15中将图1-13的训练集又拆分成两部分,成为训练集和验证集。验证集的作用是,在调试算法参数的不断“训练-验证”迭代中验证参数的性能,以达到选择正确超参数的目的。因为验证集只在备选算法学习时内部使用,因此可以对每个备选算法选取各自独立的验证集。

如有足够多的已有数据,划分三个子集的整体数量保持如下不等式关系可以提高模型的泛化能力:

训练集数量 < 验证集数量 < 测试集数量

也就是说当从小数据集训练出的模型能够适配比其大的数据集时,才能更有把握地相信其学习到了一个普遍适用的知识。

1.4.2 交叉验证

在“训练-验证”迭代中,与使用固定的验证集相对的另外一个重要方法是交叉验证(Cross-Validation)。它是一种将数据集划分成若干子集,然后互作训练和验证的方法,其过程如图1-16所示。

图1-16 交叉验证过程

图中首先将训练整体划分为样本数量相等的n个子集;进行n次迭代,每次迭代取一个子集作为验证集,其他子集作为训练集,在迭代内计算验证结果;最后综合所有迭代的验证结果作为整体的模型正确率。在实践中有以下几点值得注意。

◎ 子集的划分数量n可以自行定义,就是所谓的n-fold交叉验证。

◎ 在数据量足够的情况下,n-fold一般取值为10。但如果模型训练时间过长则只能降低该值,比如降到5左右。

◎ 随机采样与分层采样原则在划分子集时仍然需要遵守。

◎ 同一个算法在不同n-fold上表现可能不一样,所以在比较不同算法的交叉验证结论时需要用相同的n-fold配置。

◎ 交叉验证的概念同样适用于模型测试。此时直接将所有数据样本作为整体划分子集,而不是图1-16中的训练样本整体。

1.4.3 评估指标

上一节的图1-16在做交叉验证结论时使用的是整体分类正确率(Accuracy,也称准确率),但其实有时需要特别关注某个标签的分类结果。此外,连续值标签无法用准确率的方式评估。本小节讨论适用于这些目标的评估指标。

1.整体准确率指标的缺陷

准确率的定义是:被正确预测标签的样本百分比。初看时这个指标非常公正,但在很多场合其实无法真实体现分类模型的能力。设想一个用于在体检中诊断肺气肿的分类器,大多数的健康人是无此疾病的(假设此病的发病率是5%)。此时如果一个分类器的准确率是95%,那么它的疾病诊断能力如何呢?

答案很可能是:这个模型没有任何分类能力!

原因是:如果这个分类器简单地将所有病人都诊断为“健康”,由于发病总体本身只占5%,那么一个什么都不做的分类器都可以达到95%的准确率,如图1-17所示。

图1-17 什么都不做的分类器可以达到很高的准确率

本例中如果单独考虑肺气肿病例的分类,那么显然该标签的准确率为零。因此,当不同标签的样本在数据集中分布不均匀时,需要独立考察模型对每个标签的分类能力。

2.二值混淆矩阵

二值混淆矩阵(Positive/Negative Confusion Matrix)是独立考察模型对某个标签分类能力的工具,在其中引入了四个进一步考察分类器的术语,如图1-18所示。

图1-18 二值混淆矩阵引入的考察分类器的术语

它是一个2×2矩阵,用来表示某个标签在验证/测试集中的真实数量与预测数量的关系。图中的 Positive指被考察标签,Negative指除了被考察标签之外的其他标签。以肺气肿诊断举例,矩阵中的四个元素如下。

◎ TP:被考察标签被成功预测的数量,即肺气肿病人被正确查出的数量。

◎ FP:非被考察标签被预测为被考察标签的数量,即健康人被误诊为肺气肿病人的数量。

◎ FN:被考察标签未命中的数量,即肺气肿病人被误诊为健康人的数量。

◎ TN:非被考察标签被预测为非被考察标签的数量,即健康人被诊断为健康人的数量。

显然,四种情况中 TP和 TN是分类器成功预测的情况,FP和 FN是分类器预测失败的情况,其中FP是漏报,FN是误报。对于只有两种标签的数据整体,准确率可用这四个元素来定义:

说明:只需将矩阵的纵/横坐标的取值定义为多个可用标签,混淆矩阵就可以被用来解释所有标签的被分类能力。

3.精确率、召回率、调和均值

已经解释过准确率不足以反映分类模型的实际效果,所以在混淆矩阵的基础上又定义了另外几个分类评估指标,常用的有如下几个。

◎ 精确率:Precision=TP /(TP+FP)

◎ 召回率:Recall=TP /(TP+FN)

◎ 调和均值:Harmonic Mean=2TP /(2TP+FP+FN)

精确率是被预测为正例的样本中正确的比率,比如所有被诊断为肺气肿的病人中真的患有肺气肿的病人比例;召回率是正例样本中被成功检测出的比率,比如患有肺气肿的人中被正确识别出的比率;调和均值可以看成对前两者的综合。

因此,一般情况下调和均值可以直接考察模型对单个标签的分类能力。

4.连续值指标

由于连续值标签的数量不可枚举,所以无法用之前介绍的几个指标进行考量。此时可以采用源自统计学的两个回归误差指标,如下所示。

◎ 平均绝对差:,是所有被测样本的真实值与预测值的绝对差均值。

◎ 平均方差:,即所有被测样本的真实值与预测值的平方差均值。

以上两个公式中,y是样本真实标签值,是预测值,N是验证/测试样本总数。

1.4.4 拟合不足与过度拟合

训练出的模型无法反映客观事实的两类最常见的错误是所谓的拟合不足(Underfitting)与过度拟合(Overfitting)。这两个术语均来自于统计学,分别指模型无法匹配训练数据(拟合不足)、模型匹配训练数据过度导致无法匹配测试数据(过度拟合)。图1-19以回归模型做了举例说明。

图1-19 拟合不足与过度拟合

如图1-19所示是三个对相同散点集拟合的线性回归模型。该组散点取自三角函数sin()的一个区间,并加入了一些随机干扰噪声。对这组散点理想的拟合就是还原sin曲线。

左侧子图是拟合不足,它将这组散点拟合成了直线,也就是其预测所有点都在该条直线上,在这种情况下即使在训练集上均方差等评估指标也会得到非常差的结果。

右侧子图是过度拟合,该图形几乎拟合了所有训练集数据点,但正因如此,它也不是一个正常的sin曲线拟合,对新数据尤其是位于边界附近的预测会产生比中图差得多的效果。

对于这两类错误只能通过调节算法超参数来解决,从某种程度上讲,任何机器学习算法都是围绕着如何避免这两类问题的出现而展开的。

思考:生活中有哪些拟合不足与过度拟合的例子呢?