模型评估与模型选择

评估方法与性能度量

Posted by Xiaosheng on March 15, 2017

本文着重于介绍对机器学习模型的评估方法,特别是对分类问题性能的评价。文本面向有一定机器学习理论基础的读者,对专业术语不会做过多的解释,如果你阅读起来感到困惑,建议先阅读一下《机器学习概述》以及《机器学习构成三要素》

1 经验误差与过拟合

我们把学习器的实际预测输出与样本的真实输出之间的差异称为误差(error),学习器在训练集上的误差称为训练误差(training error)经验误差(empirical error),在新样本上的误差称为泛化误差(generalization error)。机器学习的目的是使学习器不仅对已知数据而且对未知数据都能有很好的预测能力,即我们希望得到泛化误差小的学习器。但是由于我们事先不知道新样本是什么样,所以实际能做的是努力使经验误差最小化。

我们通常将学习器对未知数据的预测能力称为泛化能力。

然而,如果过于追求使经验误差最小化,又会导致学习器把训练样本学得“太好”(例如对所有训练样本都分类正确,分类准确率为百分之百)。这时,很可能已经把训练样本自身的一些特点当做了所有潜在样本都具有的一般性质,这样就会导致泛化性能下降,这种现象称为过拟合(overfitting)。过拟合的表现就是,学习器对已知数据预测很好,但对未知数据预测很差。

与过拟合相对的是欠拟合(underfitting),这是指对训练样本的一般性质尚未学好。欠拟合比较容易克服,例如在决策树学习中扩展分支、在神经网络学习中增加训练轮数等。而过拟合则很麻烦,是机器学习的关键障碍。各类学习算法都必然带有一些针对过拟合的措施,但过拟合是无法彻底避免的,我们所能做的只是减小其风险。

现实任务中,往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型。因为我们无法直接获得泛化误差,而训练误差又由于过拟合现象的存在而不适合作为标准,那么如何进行模型的评估与选择呢?

2 评估方法

通常,我们可以通过实验测试来对学习器的泛化误差进行评估并进而做出选择。为此,需使用一个测试集(testing set)来测试学习器对新样本的判别能力,然后以测试集上的测试误差(testing error)作为泛化误差的近似。通常,我们假设测试样本也是从样本真实分布中独立同分布采样而来。但需要注意,测试集应该尽可能与训练集互斥,即测试样本尽量不在训练集中出现、未在训练过程中使用过。

显然,若测试样本被用作训练了,则得到的将是过于“乐观”的估计结果。

可是,我们只有一个包含 $m$ 个样例的数据集 $D={(\boldsymbol{x}_1,y_1),(\boldsymbol{x}_2,y_2),\cdots,(\boldsymbol{x}_m,y_m)}$,既要训练又要测试,怎样才能做到呢?答案是:通过对 $D$ 进行适当的处理,从中产生出训练集 $S$ 和测试集 $T$。下面介绍几种常见的做法。

2.1 留出法

留出法(hold-out)直接将数据集 $D$ 划分为两个互斥的集合,其中一个集合作为训练集 $S$,另一个作为测试集 $T$,即 $D=S \cup T$,$S \cap T = \varnothing$。在 $S$ 上训练出模型后,用 $T$ 来评估其测试误差,作为对泛化误差的估计。

以二分类任务为例,假定 $D$ 包含 $1000$ 个样本,将其划分为包含 $700$ 样本的 $S$,和包含 $300$ 样本的 $T$。用 $S$ 进行训练后,如果模型在 $T$ 上有 $90$ 个样本分类错误,那么其准确率为 $(210/300) \times 100 \%=70\%$,相应的,错误率为 $(90/300) \times 100 \%=30\%$。

我们把测试样本中被正确分类的比例称为准确率(accuracy),即如果在 $n​$ 个测试样本中有 $a​$ 个样本分类正确,则准确率 $E=a/n​$,相应的,$1-a/n​$ 称为错误率(error rate)

需要注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要保持样本的类别比例相似。如果从采样(sampling)的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为分层采样(stratified sampling)

例如通过对 $D$ 进行分层采样而获得含 $70\%$ 样本的训练集 $S$ 和含 $30\%$ 样本的测试集 $T$。若 $D$ 包含 $500$ 个正例、$500$ 个反例,则分层采样得到的 $S$ 应包含 $350$ 个正例、$350$ 个反例,而 $T$ 应该包含 $150$ 个正例和 $150$ 个反例。若 $S$、$T$ 中样本类别比例差别很大,则误差估计将由于训练/测试数据分布的差异而产生偏差。

另一个问题是,即便给定训练/测试集的样本比例后,对数据集的不同划分将导致不同的训练/测试集,相应的,模型评估的结果也会有差别。因此,单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。常见做法是将大约 $2/3\sim4/5$ 的样本用于训练,剩余样本用于测试。

2.2 交叉验证法

交叉验证法(cross validation)先将数据集 $D$ 划分为 $k$ 个大小相似的互斥子集,即 $D=D_1 \cup D_2 \cup\cdots\cup D_k$,$D_i \cap D_j=\varnothing(i \neq j)$。每个子集 $D_i$ 都尽可能保持数据分布的一致性,即从 $D$ 中通过分层采样得到。然后,每次用 $k-1$ 个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得 $k$ 组训练/测试集,从而可进行 $k$ 次训练和测试,最终返回的是这 $k$ 个测试结果的均值。

交叉验证法评估结果的稳定性和保真性在很大程度上取决于 $k$ 的取值,为了强调这一点,通常把交叉验证法称为k折交叉验证(k-fold cross validation)。k 最常用的取值是 10,此时称为 10 折交叉验证。

与留出法相似,把数据集 $D$ 划分为 $k$ 个子集同样存在多种划分方式。为减小因样本划分不同而引入的差别,k 折交叉验证通常要随机使用不同的划分重复 $p$ 次,最终的评估结果是这 $p$ 次 k 折交叉验证结果的均值,例如常见的有“10 次 10 折交叉验证”。

假定数据集 $D$ 包含 $m$ 个样本,若令 $k=m$,则得到了交叉验证法的一个特例:留一法(Leave-One-Out)。显然,留一法不受随机样本划分方式的影响,因为只有一种划分方式。而且留一法的训练集只比数据集少了一个样本,因而被实际评估的模型与期望评估的用 $D$ 训练出的模型很相似,因而留一法的评估结果往往被认为比较准确。但是当数据集比较大时,训练 $m$ 个模型的计算开销可能是难以忍受的。

2.3 自助法

留出法和交叉验证法由于保留了一部分样本用于测试,因而实际评估的模型所使用的训练集比 $D$ 小,这必然会引入一些因训练样本规模不同而导致的估计偏差。留一法受训练样本规模变化的影响较小,但计算复杂度又太高了。

自助法(bootstrapping)是一个比较好的解决方案,它直接以自助采样法(boostrap sampling)为基础。给定包含 $m$ 个样本的数据集 $D$,我们对它进行采样产生数据集 $D’$:每次随机从 $D$ 中挑选一个样本,将其拷贝放入 $D’$,然后再将该样本放回初始数据集 $D$ 中,使得该样本在下次采样时仍可能被采到;这个过程重复执行 $m$ 次之后,我们就得到了包含 $m$ 个样本的数据集 $D’$,这就是自助采样的结果。

显然,$D$ 中有一部分样本会在 $D’$ 中多次出现,而另一部分样本不出现。可以做一个简单的估计,样本在 $m$ 次采样中始终不被采到的概率是 $(1-\frac{1}{m})^m$,取极限得到:

即通过自助采样,初始数据集 $D$ 中约有 $36.8\%$ 的样本未出现在采样数据集 $D’$ 中。于是我们可以把 $D’$ 用作训练集,把 $D-D’$ 用作测试集;这样,实际评估的模型与期望评估的模型都使用 $m$ 个训练样本,而我们仍有数据总量的约 $1/3$ 的没在训练集中出现的样本用于测试。这样的测试结果,也称为包外估计(out-of-bag estimate)

自助法在数据集较小、难以有效划分训练/测试集时很有用;然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差,因此,在初始数据量足够时,留出法和交叉验证更常用一些。

2.4 调参与最终模型

大多数学习算法都有些参数(parameter)需要设定,参数配置不同,学得模型的性能往往有显著差别。因此,在进行模型评估与选择时,除了要对适用学习算法进行选择,还需对算法参数进行设定,这就是通常所说的“参数调节”或简称调参(parameter tuning)

学习算法的很多参数是在实数范围内取值,因此,对每种参数配置都训练出模型来是不可行的。现实中常用的做法,是对每个参数选定一个范围和变化步长,例如在 $[0,0.2]$ 范围内以 $0.05$ 为步长,则实际要评估的候选参数值有 $5$ 个。显然,这样选定的参数值往往不是“最佳”值,但这是在计算开销和性能估计之间进行折中的结果。事实上,即便在进行这样的折中后,调参往往仍很困难。

给定包含 $m$ 个样本的数据集 $D$,在模型评估与选择过程中由于需要流出一部分数据进行评估测试,事实上我们只使用了一部分数据训练模型。因此,在模型选择完成之后,学习算法和参数配置已选定,此时应该用数据集 $D$ 重新训练模型。

3 性能度量

对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量(performance measure)

性能度量反映了任务需求,对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果。

在预测任务中,给定测试样例集 $T={(\boldsymbol{x}_1,y_1),(\boldsymbol{x}_2,y_2),\cdots,(\boldsymbol{x}_n,y_n)}$,其中 $y_i$ 是示例 $\boldsymbol{x}_i$ 的真实标记。要评估学习器预测结果 $f(\boldsymbol{x})$ 与真实标记 $y$ 进行比较。

回归任务最常用的性能度量是均方误差(mean squared error)

更一般的,对于数据分布 $\mathbb{T}$ 和概率密度函数 $p(\cdot)$,均方误差可描述为:

下面我们介绍一下分类任务中常用的性能度量。

3.1 错误率与准确率

准确率与错误率是分类任务中最常见的两种性能度量,既适用于二分类任务,也适用于多分类任务。准确率(accuracy)是测试样本中被正确分类的比例,错误率(error rate)则是测试样本中被错误分类的比例。对测试样例集 $T={(\boldsymbol{x}_1,y_1),(\boldsymbol{x}_2,y_2),\cdots,(\boldsymbol{x}_n,y_n)}$,分类准确率定义为:

错误率则定义为:

其中,函数 $\mathbb{I}(\cdot)$ 为示性函数(indicator function),当对参数表达式为真时,取值为 1,否则为 0。

可将测试集上的准确率作为任意实例 $x \in X$ 被正确分类的概率的估计。更精确地说,测试集准确率所估计的是如下概率:$P_{X}(f(x)=y)$。由此可见,测试集对实例空间具有足够的代表性十分重要。我们通常假设实例的出现由实例空间上的未知概率分布决定,而测试集 $T$ 则是依据该分布生成的。

更一般的,对于数据分布 $\mathbb{T}$ 和概率密度函数 $p(\cdot)$,准确率与错误率可分别描述为:

3.2 查准率、查全率与 F1

准确率和错误率虽然常用,但是并不能满足所有任务需求。例如在信息检索中,我们经常会关心“检索出的信息中有多少比例是用户感兴趣的”、“用户感兴趣的信息中有多少被检索出来了”。这时,准确率和错误率就不够用了,而查准率(precision)查全率(recall)则更为适用于此类需求的性能度量。

对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(true positive)、假正例(false positive)、真反例(true negative)和假反例(false negative)四种情形。令 $TP$、$FP$、$TN$、$FN$ 分别表示其对应的样例数,则显然有 $TP+FP+TN+FN=样例总数$。分类结果的混淆矩阵(confusion matrix)如下表所示:

  预测为正例 预测为反例
实际为正例 $TP$(真正例) $FN$(假反例)
实际为反例 $FP$(假正例) $TN$(真反例)

查准率 $P$ 和查全率 $R$ 分别定义为:

可见,查准率是预测为正例的样本中实际正例所占的比例,即考察分类器分得准不准;查全率是实际为正例的样本中被正确预测为正例的样本所占的比例,即考察分类器分得全不全。

查准率与查全率是一对矛盾的度量。一般查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。只有在一些简单任务中,才可能是查全率和查准率都很高。

实际中,更常用的是 $F1$ 度量:

在一些应用中,对查准率和查全率的重视程度有所不同。例如在商品推荐系统中,为了尽可能少打扰用户,更希望推荐内容是用户感兴趣的,此时查准率更重要;而在逃犯信息检索系统中,更希望尽可能少漏掉逃犯,此时查全率更重要。$F1$ 度量的一般形式——$F_\beta$,能让我们表达出对查准率/查全率的不同偏好,它定义为:

其中 $\beta>0$ 度量了查全率对查准率的相对重要性。$\beta = 1$ 时退化为标准的 $F1$;$\beta > 1$ 时查全率有更大影响;$\beta < 1$ 时查准率有更大影响。

有时候我们有多个二分类混淆矩阵,例如进行多次训练/测试,每次得到一个混淆矩阵;或是在多个数据集上进行训练/测试,希望估计算法的“全局”性能;甚或是执行多分类任务,每两两类别的组合都对应一个混淆矩阵;……总之,我们希望在 $n$ 个二分类混淆矩阵上综合考察查准率和查全率。

一种直接的做法是先在各混淆矩阵上分别计算出查准率和查全率,记为 $(P_1,R_1),(P_2,R_2),\cdots,(P_n,R_n)$,再计算平均值,这样就得到宏查准率(macro-P)宏查全率(macro-R)和相应的宏F1(macro-F1)

还可先将个混淆矩阵的对应元素进行平均,得到 $TP$、$FP$、$TN$、$FN$ 的平均值,分别记为 $\overline{TP}$、$\overline{FP}$、$\overline{TN}$、$\overline{FN}$ 的平均值,再基于这些平均值计算出微查准率(micro-P)微查全率(micro-R)微F1(micro-F1)

4 偏差与方差

4.1 偏差-方差分解

对学习算法除了通过实验估计其泛化性能,我们往往还希望了解它“为什么”具有这样的性能。偏差-方差分解(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具,它试图对学习算法的期望泛化错误率进行拆解。

算法在不同训练集上学得的结果很可能不同,即便这些训练集是来自同一个分布。对测试样本 $\boldsymbol{x}$,令 $y_D$ 为 $\boldsymbol{x}$ 在数据集中的标记,$y$ 为 $\boldsymbol{x}$ 的真实标记(有可能出现噪声使得 $y_D\ne y$。),$f(\boldsymbol{x};D)$ 为训练集 $D$ 上学得模型 $f$ 在 $\boldsymbol{x}$ 上的预测输出。以回归任务为例,学习算法的期望预测为: 使用样本数相同的不同训练集产生的方差为: 噪声为:

期望输出与真实标记的差别称为偏差(bias),即 为便于讨论,假定噪声期望为零,即 $\mathbb{E}_D[y_D-y]=0$。通过简单的多项式展开合并,可对算法的期望泛化误差进行分解: 由 $\bar{f}(\boldsymbol{x})=\mathbb{E}_D[f(\boldsymbol{x};D)]$,最后一项为 $0$,所以: 由于假定噪声期望为 $0$,因此最后一项为 $0$,所以: 也就是说,泛化误差可以分解为偏差、方差与噪声之和。

4.2 偏差-方差分解的含义

回顾偏差、方差、噪声的含义:

  • 偏差 $bias^2(\boldsymbol{x})=\big(\bar{f}(\boldsymbol{x})-y\big)^2$ 度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
  • 方差 $var(\boldsymbol{x})=\mathbb{E}_D\big[\big(f(\boldsymbol{x};D)-\bar{f}(\boldsymbol{x})\big)^2\big]$ 度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。
  • 噪声 $\varepsilon^2=\mathbb{E}_D\big[(y_D-y)^2\big]$ 则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

偏差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。给定学习任务,为了取得好的泛化性能,则需要使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。

4.3 偏差-方差窘境

一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variance dilemma),如下图所示:

1

给定学习任务,假定我们能控制学习算法的训练程度。

  • 在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时偏差主导了泛化错误率。
  • 随着训练程度的加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐主导了泛化错误率。
  • 在训练程度充足后,学习器的拟合能力已非常强,训练数据发生的轻微扰动都会导致学习器发生显著变化,若训练数据自身的、非全局的特性被学习器学到了,则将发生过拟合。

很多学习算法都可以控制训练程度,例如决策树可以控制层数,神经网络可以控制训练轮数,集成学习可以控制基学习器个数。

参考

周志华《机器学习》
Peter Flach《Machine Learning》
李航《统计学习方法》