模型的评估与选择
本文是笔者西瓜书第二章的学习笔记,如有谬误,请随时指出。
经验误差与过拟合
首先我们需要明确一些概念:
- 错误率(error rate):$E = a/m$,共$m$个样本,其中$a$个样本分类错误
- 精度(accuracy):$Acc = 1-E$
- 误差(error):代表学习器的实际预测值和样本的真实值之间的差异
- 经验误差(training error):代表学习器在训练过程中的误差,也称训练误差
- 泛化误差(generalization error):在新样本(没见过的样本)上的误差
我们实际上希望得到泛化误差最小化的学习器,但是由于训练集的局限性,我们无法得知那些新样本是什么样的,因此我们只能从已知的训练集中获取足够多的有效信息,即使经验误差降低,从而希望泛化误差降低。
但是实际上使经验误差降低时,泛化误差并不一定降低。当经验误差降低,而泛化误差升高,这就代表过拟合。当经验误差降低,而泛化误差还未降低到极小值点,这就代表欠拟合。
一般情况下,欠拟合比较容易克服,而过拟合一般无法彻底避免,我们能做的只有缓解。如果我们认为最小化经验误差,则代表最小化泛化误差,那么实际上我们就已经在多项式的时间内解决了一个$\text{NP}$难问题,那么就构造的证明了$\text{NP}=\text{P}$。因此只要认为$\text{NP}\neq\text{P}$,过拟合就无法避免。
那么既然不能直接获得泛化误差,并且训练误差由于过拟合的存在不适合作为标准,我们应该如何评估和选择模型呢?
评估方法
一般给定一个数据集,我们需要将其分割为测试集、训练集和验证集三部分:
- 测试集(testing set):给出学习器对新样本的判别能力,用于近似泛化误差。
- 训练集(training set):用于训练模型,降低经验误差。
- 验证集(validation set):用于在调整超参数的过程中,给出模型的性能评估。
一般情况下,测试集和训练集在一开始就会区分开来,之后我们再人工的从训练集中分割出一部分当作验证集。下文给出分割训练集的各种方法。
留出法(hold-out)
将数据集$D$划分为两个互斥的集合$T, V$,其中验证集$V$需要用分层采样的方式采样,目的是尽可能保持数据分布一致。同时单次留出法的估计结果不够稳定,我们需要多次划分,重复评估取平均值。
但是使用留出法会导致用$D$和$T$训练出来的模型存在一定差异,并且$V$越大二者差异越大。
交叉验证法(cross validation)
将数据集$D$分割为$k$个大小相似的互斥子集,并且采用分层抽样,保证数据分布的一致性。每次将$k-1$个子集当作训练集,余下的子集当作验证集,重复k次取平均即可。
当$k=m$时,也就是交叉验证法的每个子集中只有一个样本时,称为:留一法(Leave-One-Out)。容易看出,留一法中评估的模型和用$D$训练出来的模型十分相似,因此可以认为其结果比较准确,但是计算复杂度很高,一般不用。并且也未必比其他方法准确,No Free Lunch(NFL)定理依然适用。
自助法(bootstrapping)
给定包含$m$个样本的数据集$D$,在$D$中有放回的采$m$个样,得到$D’$,将$D’$当作训练集,$D/D’$当作验证集。容易估计出大约有$36.8\%$的样本在验证集中(计算始终不被采样到的概率即可)。
由于自助法改变了数据集的初始分布,这会引入估计偏差。一般在数据量较少的情况下使用。
性能度量
对于回归任务,常用均方误差(mean squared error)度量:
$$
E(f; D) = \frac{1}{m}\sum_{i=1}^m (f(\mathbf{x_i}-y_i))^2, D = \{(\mathbf{x_1}, y_1), \ldots, (\mathbf{x_m}, y_m)\}
$$
如果确定了数据分布$\mathcal{D}$和概率密度$p(\cdot)$,均方误差为:
$$
E(f; \mathcal{D}) = \int_{\mathbf{x}\sim\mathcal{D}}p(\mathbf{x})\cdot (f(\mathbf{x})-y)\text{d}\mathbf{x}
$$
查全率(recall)、查准率(precision)和F1指标
二分类问题的混淆矩阵如下:
|真实情况|预测结果|预测结果|
|—|—|—|
||正例|反例|
|正例|TP|FN|
|反例|FP|TN|
进而可以得出查准率$P$和查全率$R$:
$$
P = \frac{\text{TP}}{\text{TP}+\text{FP}} \\
R = \frac{\text{TP}}{\text{TP}+\text{FN}}
$$
- 查准率:在预测为正例的样本中,真实的正例的占比
- 查全率:在真实为正例的样本中,预测为正例的占比
我们根据学习器的预测结果对样例排序,将学习器认为最有可能是正例的样本排在前面,然后将样本逐个预测为正类,计算当前的查全率和查准率,绘制图像(P-R曲线)。图像的横纵坐标分别是查准率和查全率,当一个学习器P-R曲线围成的面积大于另外一个学习器的P-R曲线围成的面积,说明该学习器性能更好。
但是面积往往不容易估算,我们需要一种更加简单的度量。可以用BEP(Break-Even Point),它是$P=R$时的取值。同时也可以用F1指标:
$$
\frac{1}{F1} = \frac{1}{2}\cdot \left(\frac{1}{P}+\frac{1}{R}\right) = \frac{2\times \text{TP}}{\text{样例总数}+\text{TP}-\text{TN}}
$$
这里运用了调和平均定义,由于调和平均相对于算术平均和几何平均更注重较小值。
对于多分类问题,可以看成是$n$个二分类问题,给出下述定义:
$$
\text{macro-}P = \frac{1}{n}\sum_{i=1}^{n} P_i\\
$$
$$
\text{macro-}R = \frac{1}{n}\sum_{i=1}^{n} R_i\\
$$
$$
\text{macro-}F1 = \frac{1}{2}\cdot \left(\frac{1}{\text{macro-}P}+\frac{1}{\text{macro-}R}\right)
$$
ROC与AUC
首先给出真正例率(True Positive Rate, TPR)和假正例率(False Positive Rate, FPR)的定义:
$$
TPR = \frac{\text{TP}}{\text{TP}+\text{FN}}\qquad
FPR = \frac{\text{FP}}{\text{TN}+\text{FP}}
$$
- 真正例率:在真实的正例中,被预测为正例的样本占比
- 假正例率:在真实的反例中,被预测为正例的样本占比
类似与P-R曲线,依然按相同方式排序后,依次将样本预测为正例,然后绘制ROC曲线,图像的纵轴是TPR,横轴是FPR。依然可以计算ROC的包裹的面积,面积大的性能更好,面积大小就是AUC。
偏差与方差
首先给出该部分的符号定义,$\mathbf{x}$代表测试样本,$y_D$是数据集中$\mathbf{x}$的标记,$y$代表真实标记,$f(\mathbf{x};D)$是在训练集$D$上模型$f$关于$\mathbf{x}$的预测输出。
对于回归问题,学习算法(关于训练集,此时随机变量是训练集$D$)的期望误差为:
$$
\bar{f}(\mathbf{x}) = \mathbb{E}_D[f(\mathbf{x}; D)]
$$
使用样本数相同的不同训练集产生的方差为
$$
var(\mathbf{x}) = \mathbb{E}_D[(f(\mathbf{x};D)-\bar{f}(\mathbf{x}))^2]
$$
噪声为
$$
\epsilon^2 = \mathbb{E}_D[(y_D-y)^2]
$$
期望输出与真实标记之间的偏差(bias)为
$$
bias^2(\mathbf{x}) = (\bar{f}(\mathbf{x})-y)^2
$$
我们假设噪声期望为0,即$\mathbb{E}_D[(y_D-y)]=0$,可以得出算法的期望泛化误差:
$$
E(f; D) = \mathbb{E}_D[(f(\mathbf{x};D)-y_D)^2] = bias^2(\mathbf{x})+var(\mathbf{x})+\epsilon^2
$$
因此泛化误差可以分解为偏差、方差与噪声之和。其中
- 偏差:刻画了学习算法本身的拟合能力
- 方差:刻画了数据扰动造成的学习性能的变化
- 噪声:刻画了任务的难度