Featured image of post 机器学习笔记(2):模型评估与选择

机器学习笔记(2):模型评估与选择

机器学习基本知识,关于如何评估模型的优劣和如何选择合适的模型

  时隔一周多,终于有时间继续学机器学习了。今天学习的内容是模型评估与选择。


经验误差与过拟合

  错误率(error rate) 一般指分类错误的样本数占样本总数的比例,精度(accuracy) 则为分类正确的样本数占样本总数的比例。一般把学习器的实际预测输出与样本的真实输出之间的差异称为误差(error),在训练集上的误差称为训练误差(training error)经验误差(empirical error),在新样本上的误差称为 泛化误差(generalization error) ,我们在训练模型的过程中,显然希望得到泛化误差较小的学习器,但是例如一个分类错误率为零,分类精度为100%的模型,并不是我们想要的模型,因为它很有可能发生了过拟合的现象。

  我们实际希望的,是在新样本上能表现得很好的学习器,因此应该从训练样本中尽可能学出适用于所有潜在样本的“普遍规律”。然而,学习得太好也有可能不是好事,过拟合(overfitting) 是指学习器可能把训练样本自身的一些特点当做了所有潜在样本都会具有的一般性质,从而导致泛化性能下降的现象;与其相对的是欠拟合(underfitting) ,指对训练样本的一般性质尚未学好。

  有很多因素可能导致过拟合,我们必须认识到,过拟合是无法彻底避免的,我们能做的只有“缓解”,或者说减小其风险。

评估方法

  通常,我们使用一个“测试集(testing set)”来测试学习器对新样本的判别能力,然后以测试机上的“测试误差(testing error)”作为泛化误差的近似。一般假设测试样本也是从样本真实分布中独立同分布采样而得。显然,训练集和测试集应该尽可能互斥。

  假设我们有一个包含$m$个样例的数据集$D = \{(\mathbf{x}_1, y_1),(\mathbf{x}_2, y_2), \dots, (\mathbf{x}_m, y_m) \}$ ,要把它划分成训练集和测试集,有以下几种常见方法:

留出法

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

  需要注意的是,训练/测试集的划分要尽可能的保持数据的一致性,避免因为数据划分过程引入额外的偏差。我们在高中阶段就学过的“分层抽样”其实就是类似的想法。

  由于存在多种划分方式把初始数据集 $D$ 划分为测试集和训练集,不同的划分方式可能导致不同的结果,因此单次使用留出法可能不够可靠稳定,一般会采取若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。

  此外,训练集和测试集的划分比例也是一个重要影响因素,这个问题没有完美的解决方案,常见做法是将大约 $2/3$ ~ $4/5$ 的样本用于训练,剩余样本用于测试。

交叉验证法

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

  显然,交叉验证法评估结果的稳定性和保真性很大程度上取决于 $k$ 的取值,因此交叉验证法也被称为**$k$ 折交叉验证($k$ -fold cross validation)** 。$k$ 最常用的取值是$10$ ,此时称为$10$ 折交叉验证,其他常用的取值有$5$ 、$20$ 等。

  与留出法相似,将数据集 $D$ 划分为 $k$ 个子集也存在多种划分方式,因此通常要随机使用不同划分重复 $p$ 次,最终的评估结果是这 $p$ 次 $k$ 折交叉验证结果的均值,常见的有 $10$次$10$折交叉验证。

  假设数据集 $D$ 中包含 $m$ 个样本,若令 $k=m$ ,则得到了交叉验证的一个特例:留一法(Leave-One-Out,简称LOO) 。显然留一法不受随机样本划分方式的影响,训练集与初始数据集相比只少了一个样本,这就使得绝大多数情况下,留一法中被实际评估的模型与期望评估的用 $D$ 训练的模型很相似。因此,留一法的评估结果往往被认为比较准确。

  留一法的缺陷在于,当数据集比较大时,训练 $m$ 个模型的开销可能是难以承受的,因此对于具体情况要具体讨论。

自助法

  为了解决留出法和交叉验证法将原始数据集划分而造成训练集数据少于原始数据,以及留一法计算开销较大的问题, 自助法(bootstrapping) 可以较好地减少训练样本规模不同造成的影响,同时还能比较高效地进行试验评估。

  自助法以自助采样法(bootstrap sampling) 为基础。给定一个包含 $m$ 个样本的数据集 $D$ ,我们对它进行采样产生数据集 $D^ \prime$ :每次随机从 $D$ 中挑选一个样本,将其拷贝放入 $D^ \prime$ ,然后再将该样本放回初始数据集 $D$ 中,也就是有放回随机抽样。重复 $m$ 次后,就得到了一个包含 $m$ 个数据的数据集 $D^ \prime$ 。显然 $D$ 中有些数据会在 $D^ \prime$ 中重复出现,有些则不会出现。根据概率论相关知识,样本在 $m$ 次采样中始终不被采到的概率是 $(1- \frac{1}{m})^m$ ,取极限可得

$$ \lim_{m \rightarrow \infty} \left(1 - \frac{1}{m}\right)^m = \frac{1}{e} \approx 0.368 $$

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

  需要注意的是,自助法采集的样本改变了初始数据集的分布,会引入估计偏差。

性能度量

  性能度量(performance measure)* 即衡量模型泛化能力的评价标准。在回归任务中常用的性能度量是均方误差(mean squared error)

$$ E(f;D) = \frac{1}{m} \sum_{i = 1}^m (f(\mathbf{x}_i) - y_i)^2 $$

更一般地,对于数据分布 $\cal D$ 和概率密度函数 $p(\cdot)$ ,均方误差可描述为

$$ E(f;\cal D) = \int_{\mathbf{x} \sim {\cal D}} (f(\mathbf{x}) - y)^2 p(\mathbf{x}) {\rm d}x $$

错误率与精度

  这是分类任务中最常用的两种性能度量。对样例集 $D$ ,分类错误率定义为

$$ E(f;D) = \frac{1}{m} \sum_{i = 1}^m {\Bbb I}(f(\mathbf{x}) \neq y_i) $$

  精度则定义为

$$ \begin{align*} acc(f;D) &= \frac{1}{m} \sum_{i=1}^m {\Bbb I}(f(\mathbf{x}) = y_i) \\ &= 1 - E(f;D) \end{align*} $$

  对于数据分布 $\cal D$ 和概率密度函数 $p(\cdot)$ ,错误率和精度可分别描述为

$$ \begin{align*} E(f;\cal D) &= \int_{\mathbf{x} \sim \cal D} {\Bbb I}(f(\mathbf{x}) \neq y)p(\mathbf{x}){\rm d}\mathbf{x}, \\\\ acc(f;D) &= \int_{\mathbf{x} \sim \cal D} {\Bbb I}(f(\mathbf{x}) = y)p(\mathbf{x}){\rm d}\mathbf{x} \\ &= 1 - E(f;D) \end{align*} $$

查准、查全率与F1

  对于某些任务来说,错误率和精度不足以满足评估模型的需求,就可以引入 查准率(precision)查全率(recall)

  将样例和预测结果的组合划分为真正例(true positive),假正例(false positive),真反例(true negative),假反例(false negative),分别用缩写 $TP$ 、$FP$ 、$TN$ 、$FN$ 来表示,则 $TP+FP+TN+FN=$ 样例总数。查准率指被预测为正例的样例中有多大比例是真正例,查全率指所有正例中有多大比例被预测为正例。

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

$$ \begin{align*} P = \frac{TP}{TP + FP}\\\\ R = \frac{TP}{TP + FN} \end{align*} $$

  一般来说,查准率和查全率是一对矛盾的度量。要想查得准,就要谨慎考虑每个样例,只选取最有把握的,这样就会遗漏许多正例,造成查全率下降;反之要想查得全,就要放低标准多考虑样例。就会把一些反例也放进来,造成查准率下降。

  根据学习器的预测结果对样例进行排序,排在前面的是“最可能”是正例的样本,按此顺序逐个 把样本作为正例 进行预测,每次可以计算出当前的查全率、查准率,以查准率为纵轴,查全率为横轴作图,就可以得到查准率-查全率曲线,简称 “P-R曲线” ,显示该曲线的图称为 P-R图

img
P-R曲线示意图

  查准率与查全率不能兼得,有时会选择一个 平衡点(Break-Even point,简称BEP) ,即"查准率=查全率"时的取值,作为综合考虑查准率、查全率的性能度量。

  更常用的是 $F1$ 度量:

$$ F1 = \frac{2 \times P \times R}{P+R} = \frac{2 \times TP}{样例总数+TP-TN}\\\\ 即 \quad \frac{1}{F1} = \frac{1}{2} \cdot \left(\frac{1}{P} + \frac{1}{R} \right) \ ,查准率与查全率的调和平均 $$

  为了能针对不同的目标调整查准率与查全率的重要程度,可以使用 $F1$ 度量的一般形式—— $F_\beta$ :

$$ F_\beta = \frac{(1+{\beta}^2) \times P \times R}{(\beta^2 \times P) + R} $$

实际上是加权调和平均。其中 $\beta > 0$ 度量了查全率对查准率的相对重要性。$\beta > 1$ 时查全率有更大影响,反之查准率有更大影响。

  对于有多个二分类混淆矩阵,即多种样例和预测结果和组合方式,可以先在每个混淆矩阵上分别计算出查准率和查全率,再计算平均值,从而得到 宏查准率(macro-P)宏查全率(macro-R) ,以及相应的 宏 $F1$ (macro-F1)

$$ macro \text{-} P = \frac{1}{n} \sum_{i = 1}^n P_i \ ,\\\\ macro\text{-}R = \frac{1}{n} \sum_{i = 1}^n R_i \ , \\\\ macro\text{-}F1 = \frac{2 \times macro\text{-}P \times macro\text{-}R}{macro\text{-}P + macro\text{-}R} $$

  也可以先得到 $TP、FP、TN、FN$ 的平均值,分别记为 $\overline {TP}、\overline {FP}、\overline {TN}、\overline {FN}$ ,再基于这些平均值计算出 微查准率(micro-P)微查全率(micro-R) ,以及相应的 微 $F1$ (micro-F1)

$$ \begin{align*} micro \text{-} P &= \frac{\overline {TP}}{\overline {TP} + \overline {FP}} ,\\\\ micro\text{-}R &= \frac{\overline {TP}}{\overline {TP} + \overline {FN}} \ , \\\\ micro\text{-}F1 &= \frac{2 \times micro\text{-}P \times micro\text{-}R}{micro\text{-}P + micro\text{-}R} \end{align*} $$

ROC与AUC

  一些学习器在分类任务的原理是为每个测试样本产生一个实值或概率预测,然后将这个值与一个分类阈值进行比较,若大于分类阈值则归为正例,反之则为反例。

  ROC全称是 受试者工作特征(Receiver Operating Characteristic) 曲线。与 $P \text{-} R$ 曲线相似,我们根据学习器的预测结果对样例进行排序,按顺序逐个把样本作为正例进行预测,每次计算出 真正例率(True Positive Rate,简称TPR)假正例率(False Positive Rate,简称FPR)

$$ \begin{align*} TRP = \frac{TP}{TP+FN} \ ,\\\\ FPR = \frac{FP}{TN + FP} \ . \end{align*} $$

可以看出真正例率的含义是所有正例中有多少比例被预测为正例,假正例率的含义是所有反例中有多少比例被预测为正例。

  以 $TPR$ 为纵轴, $FPR$ 为横轴作图,就得到了 $ROC$ 曲线,显示 $ROC$ 的图就称为 $ROC$ 图。

ROC曲线与AUC示意图

  现实任务中通常是利用有限测试样例来绘制 ROC 图,此时能够获得有限个 (真正例率, 假正例率) 坐标,因此一般只能绘制出图(b) 所示的近似 ROC 曲线。绘图过程如下:给定 $m^+$ 个正例和 $m^-$ 个反例,根据学习器预测结果对样例进行排序,然后把类别阈值设为最大,即把所有样例预测为反例,此时真正例率和假正例率均为 $0$,在坐标 $(0,0)$ 处标记一个点,然后,将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。设前一个标记点坐标为 $(x, y)$,当前若为真正例,则对应标记点的坐标为 $(x, y+\frac{1}{m^+})$,当前若为假正例,则对应标记点的坐标为 $(x + \frac{1}{m^-}, y)$,然后用线段连接相邻点即得。

  以上是西瓜书中绘制 $ROC$ 曲线的方法,在此补充一种情况,即设前一个标记点坐标为 $(x, y)$ ,在将分类阈值再一次下调时,可以得到两个预测值相同且分别属于正例和反例的样例,此时对应标记点的坐标应为 $(x + \frac{1}{m^-}, y+\frac{1}{m^+})$ 。

  在进行性能的比较和度量时,显然在假正例率相同时,真正例率越高,学习器性能越好,所以若一个学习器的 $ROC$ 曲线被另一个学习器的 $ROC$ 曲线“包住”,就说明后者的性能优于前者。当两者的 $ROC$ 曲线有交叉时,较为合理的判据是比较 $ROC$ 曲线下的面积,可以理解为"真正例率的总和",即 AUC(Area Under ROC Curve)

$$ AUC = \frac{1}{2} \sum_{i=1}^{m-1} (x_{i+1} - x_i) \cdot (y_i + y_{i+1}) $$

  “形式化地看,AUC考虑的是样本预测的排序质量,因此它与排序误差有紧密联系。”这句话的意思是,AUC并不直接衡量模型预测结果的绝对准确性,而是关注模型在对样本进行排序时的质量,也就是模型能多好地将正例排在反例之前。

  给定 $m^+$ 个正例和 $m^-$ 个反例,令 $D^+$ 和 $D^-$ 分别表示正、反例集合,则排序损失(loss) 定义为

$$ {\mathscr l}_{rank} = \frac{1}{m^+ m^-} \sum_{\mathbf{x}^+ \in D^+}\sum_{\mathbf{x}^- \in D^-} \left(\Bbb I (f(\mathbf{x}^+) < f(\mathbf{x}^-)) + \frac{1}{2} \Bbb I(f(\mathbf{x}^+) = f(\mathbf{x}^-)) \right) $$

即考虑每一对正、反例,若正例的预测值小于反例,则记一个“罚分”,若相等,则记 $0.5$ 个“罚分”。

  从概率论角度考虑,该式可以理解为任意从 $D^+$ 和 $D^-$ 中分别抽取一个元素,一共有 ${m^+ m^-}$ 种组合,将正例的预测值小于反例的情况算作 $1$ 种,等于反例的情况算作 $0.5$ 种,那么 ${\mathscr l}_{rank}$ 就是学习器对样例排序错误的组合数的比例。

  从另一种角度, ${\mathscr l}_{rank}$ 对应的是 $ROC$ 曲线上方的面积,即,将上式变形为:

$$ \begin{align*} {\mathscr l}_{rank} &= \sum_{\mathbf{x}^+ \in D^+ } \frac{1}{2} \cdot \frac{1}{m^+} \cdot \left[\frac{2}{m^-} \sum_{\mathbf{x}^+ \in D^-} \Bbb I (f(\mathbf{x}^+) < f(\mathbf{x}^-)) + \frac{1}{m^-} \sum_{\mathbf{x}^- \in D^-} \Bbb I(f(\mathbf{x}^+) = f(\mathbf{x}^-)) \right] \\\\ &= \sum_{\mathbf{x}^+ \in D^+ } \left[\frac{1}{m^+} \left(\frac{1}{m^-} \sum_{\mathbf{x}^+ \in D^-} \Bbb I (f(\mathbf{x}^+) < f(\mathbf{x}^-))\right) + \frac{1}{2} \cdot \frac{1}{m^+} \left( \frac{1}{m^-} \sum_{\mathbf{x}^- \in D^-} \Bbb I(f(\mathbf{x}^+) = f(\mathbf{x}^-)) \right) \right] \end{align*} $$

其中第一步变形是笔者摘自于一本公式详解书上的内容,将最外部的求和符号提出来,右边的内容可看做梯形的面积公式,即“(上底+下底)$\times$高$\div$ $2$ ”,但笔者觉得不够直观,不容易理解,于是将其进一步变形,得到第二个式子。

  首先我们要理解,在 $ROC$ 曲线中,横轴向右延伸代表反例被判断为正例,纵轴向上延伸代表正例被判断为正例。根据定义可以得知 $\frac{1}{m^+}$ 和 $\frac{1}{m^-}$ 分别为真正例率和假正例率的步长,我们可以先将真正例率(纵轴)固定,结合上面的 $AUC$ 示意图讨论中括号中的内容,第一个式子表示的是将反例判断为正例的数量乘假正例率的步长再乘真正例率的步长,将 $\frac{1}{m^+}$ 的长度看做底边, $\frac{1}{m^-}$ 乘假正例的数量也就是横轴延伸的长度,可以看做长边,那么该式表示的就是矩形的面积;而第二个式子,对于 $f(\mathbf{x}^+) = f(\mathbf{x}^-)$ 的情况,曲线是向右上方延伸的,因此涉及到的图形是一个三角形,同理可根据三角形计算公式来计算面积。再将每个步长对应的面积加起来,就得到了 $ROC$ 曲线上方的面积,因此有

$$ AUC = 1 - \mathscr l_{rank} $$

代价敏感错误率与代价曲线

  在实际训练模型的过程中,我们希望对于不同的错误有不同的代价,从而训练出更有针对性的模型。以二分类任务为例,我们可以设定一个 代价矩阵(cost matrix) ,其中 $cost_{ij}$ 表示将第 $i$ 类样本预测为第 $j$ 类样本的代价。

真实类别 预测类别
第0类 第1类
第0类 0 cost01
第1类 cost10 0

  此时可得到 代价敏感(cost-sensitive)错误率

$$ E(f;D;cost) = \frac{1}{m} \left(\sum_{\mathbf{x}_i \in D^+} \Bbb I (f(\mathbf{x}_i) \neq y_i) \times cost_{01} + \sum_{\mathbf{x}_i \in D^-} \Bbb I (f(\mathbf{x}_i) \neq y_i) \times cost_{10}\right) $$

  在非均等代价下,代价曲线(cost curve) 可以反映出学习器的期望总体代价。代价曲线图的横轴是取值为 $[0, 1]$的正例概率代价

$$ P(+)cost = \frac{p \times cost_{01}}{p \times cost_{01} + (1-p) \times cost_{10}} $$

其中 $p$ 是样例为正例的概率;纵轴是取值为$[0, 1]$的归一化概率代价

$$ cost_{norm} = \frac{FNR \times p \times cost_{01} + FPR \times (1-p) \times cost_{10}}{p \times cost_{01} + (1-p) \times cost_{10}} $$

  可以看出, $P(+)cost$ 实际上是正例在样例集中的加权占比, $cost_{norm}$ 的分子实质上就是代价敏感错误率的变形,将其除以能取到的最大值,从而实现归一化的效果。

  代价曲线的绘制过程是将 $ROC$ 曲线上的点的坐标 $(FPR, TPR)$ 转换为代价平面上的线段。在数学上可以看做把 $P(+)cost$ 置 $0$ ,即 $cost_{01} = 0$ ,此时 $cost_{norm} = FPR$ ,再把 $P(+)cost$ 置 $1$ ,即 $cost_{10} = 0$ ,此时 $cost_{norm} = FNR$ ,由两点可得到一条直线,而 $FNR$ 的值可通过 $TPR$ 计算出来。这样可以得到多条直线,取每条直线的下半部分,围成的面积即为在所有条件下学习器的期望总体代价。

  需要注意的是, $P(+)cost$ 的值实际上是不变的,即对于每个样例集,在代价曲线的横轴上只能找到一个对应的点。这个点通常可以用来查找使归一化代价 $cost_{norm}$ 最小的分类阈值。

代价曲线与期望总体评价
代价曲线与期望总体评价

比较检验

  从统计学的角度,测得的学习器的性能度量的值在本质上仍是一个随机变量,因此不能简单地通过比大小的方式比较学习器之间的性能,需要以更置信的方法来进行判定。

  统计假设检验(hypothesis test) 是用来评估关于总体参数(如均值、方差等)假设是否成立的一种统计方法。通过假设检验,研究人员可以基于样本数据做出关于总体的推断,从而决定是否拒绝某个假设。

假设检验

  假设 是对学习器泛化错误率分布的某种判断或猜想,如 $\epsilon = \epsilon_0$ ( $\epsilon$ 为错误率)。我们可以通过测试得到的错误率 $\hat \epsilon$ 估算出泛化错误率的分布。

  测试错误率 $\hat \epsilon$ 意味着在 $m$ 个测试样本中有 $\hat \epsilon \times m$ 个被误分类。假设测试样本是从样本总体分布中独立采样而得,且泛化错误率为 $\epsilon$ 的学习器将其中 $m^\prime$ 个样本误分类,由概率论知识容易得到剩余样本全部分类正确的概率是 $\begin{pmatrix} m \\ m^\prime \end{pmatrix} \epsilon^{m^\prime} (1-\epsilon) ^ {m - m^\prime}$ ,由此可得到将 $\hat \epsilon \times m$ 个样本误分类的概率,即在包含了 $m$ 个样本的测试集上,泛化错误率为 $\epsilon$ 的学习器被测得测试错误率为 $\hat \epsilon$ 的概率:

$$ P(\hat \epsilon; \epsilon) = \begin{pmatrix} m \\ \hat \epsilon \times m \end{pmatrix} \epsilon^{\hat \epsilon \times m} (1-\epsilon) ^ {m - \hat \epsilon \times m} $$

对 $\epsilon$ 求偏导并令其等于零,可得当 $\epsilon = \hat \epsilon$ 时 $P(\hat \epsilon; \epsilon)$ 取得最大值,这是很显然的,因为我们假设测试样本是从样本总体分布中独立采样而得,那么测试集和总样本具有相同的分布。实际上这个假设并不能保证,所以我们需要使用 二项检验(binomial test) 来对 $\epsilon \leq \hat \epsilon$ (即泛化误差错误率是否不大于 $\hat \epsilon$ )这样的假设进行检验。

  考虑假设 $\epsilon \leq \hat \epsilon$ ,则在 $1-\alpha$ 的概率内所能观测到的最大错误率为:

$$ \overline \epsilon = min \ \epsilon \quad s.t. \quad \sum_{i = \epsilon \times m + 1}^m \begin{pmatrix} m \\ i \end{pmatrix} \epsilon_0^i (1 - \epsilon_0)^{m-i} < \alpha $$

这里 $1-\alpha$ 反映了结论的“置信度”。此时若测试错误率 $\hat \epsilon$ 小于临界值 $\overline \epsilon$ ,则可以得出结论:在 $\alpha$ 的显著度下。假设 $\epsilon \leq \hat \epsilon$ 不能被拒绝,即能以 $1-\alpha$ 的置信度认为学习器的泛化错误率不大于 $\epsilon_0$ ;否则该假设可被拒绝。

  此外,根据训练方法的不同,也可以选用不同的检验方法,如 t 检验交叉验证 t 检验McNemar 检验Friedman 检验与 Nemenyi 后续检验 等等。

偏差与方差

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

  对测试样本 $\mathbf{x}$ ,令 $y_D$ 为 $\mathbf{x}$ 在数据集中的标记,$y$ 为 $\mathbf{x}$ 的真实标记,$f(\mathbf{x}; D)$ 为训练集 $D$ 上学得模型 $f$ 在 $\mathbf{x}$ 上的预测输出。以回归任务为例,学习算法的期望预测为

$$ \overline f(\mathbf{x}) = \Bbb E_D[f(\mathbf{x};D)] $$

使用样本数相同的不同训练集产生的方差为

$$ var(\mathbf{x}) = \Bbb E_D[(f(\mathbf{x};D) - \overline f(\mathbf{x}))^2] $$

噪声为

$$ \varepsilon^2 = \Bbb E_D[(y_D - y)^2] $$

期望输出与真实标记的差别称为偏差(bias),

$$ bias^2(\mathbf{x}) = (\overline f(\mathbf{x}) - y)^2 $$

假设噪声期望为零,即 $\Bbb E_D[y_D - y] = 0$ ,通过一系列变形,可以对算法的期望泛化误差进行分解

$$ \begin{align*} E(f;D) &= \Bbb E_D[(f(\mathbf{x};D) - y_D)^2] \\\\ &= \Bbb E_D[(f(\mathbf{x};D) - \overline f(\mathbf{x}) + \overline f(\mathbf{x}) - y_D)^2] \\\\ &= \Bbb E_D[(f(\mathbf{x};D) - \overline f(\mathbf{x}))^2] + \Bbb E_D[(\overline f(\mathbf{x}) - y_D)^2] \\\\ &= \Bbb E_D[(f(\mathbf{x};D) - \overline f(\mathbf{x}))^2] + \Bbb E_D[(\overline f(\mathbf{x})-y + y - y_D)^2] \\\\ &= \Bbb E_D[(f(\mathbf{x};D) - \overline f(\mathbf{x}))^2] + \Bbb E_D[(\overline f(\mathbf{x}) - y)^2] + \Bbb E_D[(y - y_D)^2] + 2\Bbb E_D[(\overline f(\mathbf{x}) - y)(y - y_D)] \\\\ &= \Bbb E_D[(f(\mathbf{x};D) - \overline f(\mathbf{x}))^2] + \Bbb E_D[(\overline f(\mathbf{x}) - y)^2] + \Bbb E_D[(y - y_D)^2] \end{align*} $$

于是,有

$$ E(f;D) = bias^2(\mathbf{x}) + var(\mathbf{x}) + \varepsilon ^2 $$

也就是说,泛化误差可分解为偏差、方差与噪声之和。

  偏差 度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;方差 度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;噪声 则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

  一般来说,偏差与方差是有冲突的,即偏差-方差窘境。当训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时偏差主导了泛化错误率;随着训练程度加深,训练数据发生的扰动渐渐能被学习到,方差逐渐主导了泛化错误率;当训练程度过于充足,训练数据自身的、非全局性的特性被学习器学到了,就会发生过拟合的现象。


结语

  本章又是一些概念性的知识,介绍了怎样来评判、度量一个模型的性能,实际上是在模型产出之后的下游工作。笔者在学习过程中感觉先去学习具体模型,再来学习模型的评估是一个更好的学习路线,不过先学习本章也可以在后续学习中对模型有更深刻的理解,全靠个人选择了。此外,在比较检验部分涉及了一些统计假设检验的知识,笔者的概率论与数理统计还在学习中,这部分可能需要后面回过头再来看看。


📷本文中涉及图片均引用自《机器学习》[周志华.清华大学出版社],仅做学习分享之用。

Licensed under CC BY-NC-SA 4.0
Powered by Hugo with Stack
使用 Hugo 构建
主题 StackJimmy 设计, 由 秦时月 修改