首页 > TensorFlow教程 > 机器学习 阅读数:27

模型的评估和选择

在之前学习机器学习的时候,我们接触到一个概念就是模型的评估与选择。当时没有做过多介绍,本节教程就来详细讲解。

1.评估方法

我们肯定希望训练得到的模型在新的数据集上总能表现出很好的性能,因此我们希望模型能够尽可能多地学习到有代表性的样本数据的特征。在机器学习中有两个常见的现象,分别是“过拟合”和“欠拟合”。当模型把训练数据的特征学习得“太好”的时候,往往会出现“过拟合”的现象,与之相对的就是“欠拟合”,即模型没有学习好训练数据的特征。

图 1 所示的是一个简单的例子。
“过拟合”和“欠拟合”示例
图 1:“过拟合”和“欠拟合”示例
(从左至右依次为:理想情况、欠拟合和过拟合)

无论是“过拟合”还是“欠拟合”,都不是我们希望看到的。“欠拟合”通常是由于模型过于简单或者学习不够充分等原因导致的,相对来说比较容易解决。而“过拟合”一般是由于数据中的“噪声”或者模型将训练数据特有的一些特征当成了该类数据都会具有的一般特征而导致的,通常容易出现在训练数据过少、模型过于复杂或者参数过多的情况中。

为了得到一个效果好的模型,通常会选择多种算法,对每种算法都会尝试不同的参数组合,并比较哪一种算法、哪一种参数设置更好,这就是模型的选择,并有一些相应的评价方法和标准来对选择的模型进行评估,即模型的“性能度量”。

在介绍具体的模型评估方法之前,先澄清两个问题:什么是“参数”和“超参数”;怎么划分“训练集”“测试集”和“验证集”。

“参数”即模型需要学习的内容,是模型“内部”的变量,比如模型的权重矩阵和偏置。而“超参数”指在一个模型中可以人为设定和修改的参数,例如神经网络的层数、学习率及隐藏层神经元的个数等。实际操作中,我们除选择具体的模型外(例如,选择 LSTM 还是选择 Bi-LSTM),还要选择模型的“超参数”。

“训练集”“测试集”和“验证集”的划分是模型的选择和训练过程中的一个重要环节。“测试集”很好理解,当我们训练好一个模型之后,要想知道这个模型的泛化能力好不好,可以用模型在“测试集”上的表现来近似评估模型的泛化能力。“

验证集”又是什么呢?举个简单的例子,假设有一个训练集 A 和一个测试集 B,两个数据集没有重叠,用训练集 A 来训练模型,然后用测试集 B 来评估模型的“好坏”。此时可能会出现问题,即由于我们是以模型在测试集 B 上的表现来评价模型的“好坏”的,最后选择的模型可能刚好只能在测试集 B 上的表现比较好。因此,这样的模型是不具有代表性的。

那么如何避免这个问题呢?方法就是再增加一个“验证集”,在选择模型的时候,使用“验证集”来评估模型的“好坏”。对于最终选定和训练好的模型,我们用“测试集”来评估模型的泛化能力。“训练集”“测试集”和“验证集”的数据均不能有重叠,通常三个数据集的划分比例为 8∶1∶1。

虽然在平时表述的时候,我们通常不会严格地区分“测试集”和“验证集”(一般习惯性地都用“测试集”表述),但是为了避免混淆并确保规范,在本教程中统一使用“验证集”。

接下来介绍模型评估的常见方法:留出法、交叉验证法、留一法及自助法。

1) 留出法

留出法(Hold-out)是一种较为简单的方法,它直接将数据集 D 划分为训练集 T 和验证集 V,集合 T 和集合 V 是互斥的,即 D=T∪V,且 T∩V=∅。

需要注意的是,为了确保“训练集”和“验证集”中数据分布的一致性,要使用“分层采样”划分数据集。举个简单的例子,假设数据集中有 100 个样本,其中有 50 个正例和 50 个负例,训练集 T 和验证集 V 的样本数比例为 4:1,即训练集 T 有 80 个样本,验证集 V 有 20 个样本。若使用“分层采样”,则训练集 T 中应该有 40 个正例和 40 个负例,而验证集 V 中应该有 10 个正例和 10 个负例。

由于数据的划分具有随机性,通过一次划分数据集训练后得到的模型,在“验证集”上的表现不一定能体现出模型真正的效果,所以一般会多次划分数据集并训练模型,并取多次实验结果的平均值作为最终模型评估的结果。

留出法还存在一个问题,即“训练集”和“验证集”的比例该如何确定。这个问题在数据样本足够多的时候可以不用考虑,但在数据样本不是特别多的时候就会造成一定困扰,一般的做法是将数据的 (2/3)~(4/5) 作为“验证集”。

2) 交叉验证法

交叉验证法(Cross Validation)将数据集 D 划分为 k 个大小相同但互斥的子集,即 D=D1∪D2∪…∪Dk, Di∩Dj=∅(i≠j))。为了确保数据分布的一致性,这里我们同样使用“分层采样”划分数据集。对于划分得到的 k 个数据集,我们每次使用其中的一个作为“验证集”,剩下的 k-1 个作为“训练集”,将得到的 k 个结果取平均值,作为最终模型评估的结果,我们称这种方法为“k 折交叉验证”。

和留出法一样,为了排除数据集划分的影响,我们对数据集 D 进行 p 次划分,每次划分得到 k 个子集,然后进行 p 次“k 折交叉验证”,并取这 p 次“k 折交叉验证”结果的平均值作为最终的结果。我们称这种方法为“p 次 k 折交叉验证”,常见的有“5 次 10 折交叉验证”或“10 次 10 折交叉验证”。

交叉验证法有一种特殊的情况,假设数据集大小为 m,若使得 k 的值等于 m,则把这种情况称为留一法,因为这时“验证集”中只有一个样本。留一法的优点是不存在数据集划分所产生的影响,但是当数据集较大时,对于样本数量为 m 的数据集,使用留一法就得训练 m 个模型,这会需要很大的计算开销。

3) 自助法

自助法是一种基于自助采样的方法,通过采样从原始数据集中产生一个训练集。假设数据集 D 包含 m 个样本,每次随机且有放回地从数据集D中挑选出一个样本添加到数据集 D' 中,重复进行 m 次后得到一个和原始数据集 D 大小相同的数据集 D'。在数据集 D 中,样本在 m 次采样中均不被抽到的概率为 (1-1/m),取极限可以得到:

求解上述公式可以得到其值为 1/e,约等于 36.8%。因此,在 m 次采样后,数据集 D 中仍然有约 36.8% 的样本没有被抽到,我们可以用这些数据作为验证集,即 T=D',V=D-D'。

自助法比较适用于样本数量较少的情况,因为即使划分了验证集也并没有减少训练集的数量;此外,使用自助法可以从原始数据集中产生出多个互不相同的训练集,这对集成学习很有帮助。自助法也有缺点,因为训练集的产生是随机采样得到的,所以数据样本分布的一致性就被破坏了。

表 1 是对上述模型评估方法的总结。
表 1:模型评估方法
评估方法 集合关系 注意事项 优点和缺点
留出法 (Hold-out) D = T∪V  T∩V = ∅ 要使用“分层采样”,尽可能保持数据分布的一致性;为了保证可靠性,需要重复实验后取平均值作为最终的结果 训练集/验证集的划分不好控制,验证集划分得过小或者过大,都会导致测试结果的有效性得不到保证
交叉验证法 (Cross Validation)
D = D1U-∪Dk  DiUDj=∅(i≠j) 为了排除数据划分引入的误差, 通常使用“P 次 K 折交叉验证” 稳定性和保真性很大程度上取决于 k 的值
留一法 (Leave-One-Out, LOO)
D = D1∪…∪Dk  Di∩Dj=∅(i≠j)   k=|D| 交叉验证法的特例,K 值取总数据集的大小 不受样本划分的影响,但是当数据量较大时,计算量也较大
自助法 (Bootstrapping) |T|=|D|  V=D/T 有放回的重复采样 适合在数据量较少的时候使用;有放回的重复采样破坏了原始数据的分布,会引入估计偏差

2.性能度量

介绍完评估的方法,接下来了解用来衡量机器学习模型泛化能力的评价标准,即模型的性能度量(Performance Measure)。

1) 正确率(Accuracy)和错误率(Error Rate)

正确率与错误率是分类任务中常用的两个评价指标,很好理解。正确率是指分类器预测正确的数据样本数占验证集中样本总数的比例。相应地,错误率是指在验证集上,分类器预测错误的数据样本数占验证集中样本总数的比例。

具体计算方式如下:

正确率=预测正确的样本数/验证集的样本总数
错误率=预测错误的样本数/验证集的样本总数

2) 查准率(Precision)、查全率(Recall)与 F1

虽然正确率和错误率是常用的两个评价指标,但有时可能需要更细致的度量指标。举个例子,假设我们训练好了一个垃圾邮件分类的模型,可将垃圾邮件和正常邮件进行分类,这是一个简单的二分类模型。模型都不会是百分之百准确的,因此就需要有一个考量。

有些用户希望尽可能地排除掉所有的垃圾邮件,哪怕偶尔将一些正常邮件误判为垃圾邮件;还有一些用户可能会有很多重要的邮件,所以他们希望这些重要的邮件都能被正常收到,哪怕收到少数垃圾邮件。

这个时候我们关心的有两点:第一点,在分类得到的“正常邮件”中有多少是真正的正常邮件;第二点,在所有的正常邮件中,有多少被正确地分类了。这个时候,我们就需要有新的度量指标:查准率和查全率(也称为“召回率”)。

以二分类为例,对于分类器的分类结果,需要统计四种数据,如表 2 所示。

表 2:计算查准率和查全率时需要统计的数据
条目 描述
真正例(True Positive) 真实值(actual) = 1,预测值(predicted) = 1
假正例(False Positive) 真实值(actual) = 0,预测值(predicted) = 1
真反例(True Negative) 真实值(actual) = 0,预测值(predicted) = 0
假反例(False Negative) 真实值(actual) = 1,预测值(predicted) = 0

令 TP、FP、TN 和 FN 分别表示上述四种情况所对应的数据样本个数,根据统计的数据,我们可以做出一张表,这张表称为“混淆矩阵(Confusion Matrix)”,如表 3 所示。

表 3:二分类结果的混淆矩阵
预测值|真实值 正例 (Positive) 反例 (Negative)
正例 (Positive) TP (真正例) FN (假反例)
反例 (Negative) FP (假正例) TN (真反例)

查准率与查全率的定义分别如下:

Precision =TP /(TP + FP)
Recall = TP /(TP + FN)


相应地,正确率(Accuracy)和错误率(Error Rate)可以表示为:

Accuracy =(TP+TN) /(TP+FP+TN+FN)
Error Rate =(FP+FN) /( TP+FP+TN+FN)


下面看一个简单的三分类的例子。假设实现猫、狗和兔子的分类,用训练好的模型对验证集(约定验证集中每个类别有 1000 个数据样本)进行判别,得到了如表 4 所示的混淆矩阵。

表 4:三分类结果的混淆矩阵
真实值|预测值 兔子
812 88 100
60 908 32
兔子 132 70 798

对应上面的混淆矩阵,我们可以将其拆成三个二分类的矩阵,以猫为例,如表 5 所示。

表5:对于猫的二分类混淆矩阵
真实值|预测值 狗、兔子
TP = 812 FN = 88+100
狗、兔子 FP = 60+132 TN = (908+32)+(70+798)

根据上述公式可得:

Precision =812 /(812+(60+132))=0.808
Recall = 812 /(812+(88+100))=0.812


在绝大多数情况下,查准率和查全率总是相对立的,当查准率高的时候,查全率往往会偏低,而当查全率高的时候,查准率又会偏低。对于前面提到的垃圾邮件过滤的例子,如果想尽可能地过滤掉垃圾邮件,那就免不了会把一些正常邮件也误判为垃圾邮件;如果想要尽可能地保留所有的正常邮件,那就免不了也会保留一些垃圾邮件。

所以,在通常情况下,我们需要根据自己的实际需要来设定一个合适的阈值,使得查准率和查全率的平衡点能最好地满足需求。

在以正确率和错误率作为模型的评价指标时,可以简单地通过比较两个模型的正确率来判断孰优孰劣。在以查准率和查全率为评价指标时,要如何比较呢?常见的有两种方法:做 P-R 图和计算 F1。本教程选择介绍后者,这是一种更常用、更直接的度量方法,在阿里天池、Kaggle 等比赛中,也经常使用 F1 作为模型的评价指标,它是查准率和查全率的一种加权平均。

F1 度量的计算公式如下:

F1=(2 × Precision × Recall)/(Precision+Recall)=(2×TP)/(验证集的样本总数+TP-TN)


由于在不同情况下对查准率和查全率的侧重不同,所以需要有一个一般形式的 F1 度量,记为 Fβ

Fβ =((1+β2) × Precision × Recall)/((β2 × Precision)+Recall)

在上式中,当 β 的值大于 1 时,代表模型的评价更侧重于查全率,当 0<β<1 时,模型的评价更侧重于查准率,当 β=1 时,Fβ 等价于 F1。