机器学习要做的工作可以这样理解:给定一些数据,在数据上训练模型,得到能解决我们实际问题的模型。在这个过程中,数据的处理,模型的选择,模型的评估都需要花费一些时间来处理。这节内容就是模型的选择与评估。
一、经验误差与过拟合
在训练过程中,学习器的实际预测输出与样本的真实输出之间的差异称为误差。学习器在训练集上的误差称为训练误差或经验误差。在新样本上的误差称为泛化误差。我们希望得到泛化误差小的学习器。然而我们实际能做的是使经验误差最小化。可惜的是经验误差最小时,泛化误差不一定是最好的。我们希望学习器能从训练样本中尽可能学出适用于所有潜在样本的普遍规律。但是有时候学习器的能力过强,将一些样本自身的特点当作了样本的一般性质。导致泛化性能下降,造成过拟合现象。还有时学习器的学习能力不够,学习不到样本的潜在规律,会造成欠拟合现象。也会使泛化性能下降。因此,我们要解决模型存在的欠拟合或者过拟合现象,提高模型的泛化性能。在实际的问题中,我们可以获得多种学习算法,不同的参数会出现不同的模型。因此,模型的选择就是要对候选模型的泛化误差进行评估,然后选择泛化误差最小的模型。
二、评估方法
经验误差由于过拟合问题的存在,不能作为选择模型的标准。又无法直接获得泛化误差。因此,我们通过实验测试来对学习器的泛化误差进行评估,然后做出选择。我们设置一个测试集来测试学习器对新样本的判别性能。在测试集上的误差我们称之为测试误差。使用测试误差来作为泛化误差的近似。我们假设测试数据也是从真实样本中独立同分布采样得到。要求测试集与训练集要互斥。通常我们可以得到一个包含$m$个样本的数据集D,然后对D进行适当的划分,划分为测试集和训练集。
$$D=\left { (x_{1},y_{1}), (x_{2},y_{2}), …,(x_{m},y_{m})\right }$$
方法一:留出法
留出法直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试机T,用数学公式表示为:$D=S\cup T,S\cap T=\varnothing$。在训练集上训练出模型后,在测试集上评估测试误差,作为对泛化误差的估计。例如,包含1000个样本的数据集,S包含700个样本,T包含300个样本。留出法需要注意以下三点:
- 划分数据时,要保证数据的一致性。例如1000个样本中包含500个正例,500个反例。如果按照S:70%,T:30%的比例划分。那么对于正例,应该取350个作为S,150个作为T。反例也是如此。这叫保持样本的列别比例相似。假如S、T中的样本类别比例差别很大,则测试估计将由于训练/测试数据分布的差异而产生偏差。
- 单次使用留出法得到的估计结果往往不够稳定可靠。因此,可以多次划分,重复实验,取平均值做留出法的评估结果。
- 选择训练集与测试集的比例也很重要,一般训练集大约占$\frac{2}{3}\sim \frac{4}{5}$,剩下的样本用作测试集。
方法二:交叉验证法
交叉验证法先将数据集D划分为k个大小相似的互斥子集。即$D=D_{1}\cup D_{2}\cup …\cup D_{k},D_{i}\cap D{j}=\varnothing (i\neq j)$。将前k-1个子集作为训练集,余下的那个子集作为测试集。获得k组训练集/测试集。可以进行k次训练和测试,返回k个测试结果的均值。这种方法一般叫做k折交叉验证法。k值是此方法的关键,一般常用的值为5、10、20等。与留出法相同,k折交叉验证法仍然可以重复多次实验,最后取平均值作为最终的评估结果。
方法三:自助法
自助法是让我们可以使用数据集D来训练模型,然而并不是真正意义上的数据集D,只是训练数据集的规模与数据集D相同。留出法与交叉验证法都保留了一些数据用作测试数据。会引入一些因训练样本规模不同而导致的估计偏差。自助法以自助采样为基础。自助法从包含m个样本的数据集D中采样得到训练数据集$D^{‘}$。每次从数据集D中抽取一个一样,将其放入到$D^{‘}$中,然后再将该样本放回初始数据集D中,使得样本在下次采样时仍然可以被采到。重复执行m次后,得到包含m个样本的数据集$D^{‘}$。D中会有一部分样本多次出现在$D^{‘}$中,有一部分不会出现在其中。我们可以估计样本在m次采样中始终不被采到的概率为$(1-\frac{1}{m})^{m}$,取极限得到$\underset{m\rightarrow \infty }{lim}(1-\frac{1}{m})^{m}=\frac{1}{e}\approx 0.368$,也就是说数据集D中有36.8%的数据未出现在采样数据$D^{‘}$中,因此,数据集$D^{‘}$作为训练集,$D-D^{‘}$作为测试集。自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此,我们常用留出法和交叉验证法。
方法四:调参与最终模型
机器学习算法通常涉及两类参数,一类是算法的参数,也就是超参数,数目在10以内,另一类是模型的参数,参数有很多。因此,调参是一个重要的任务。通常的做法是给定一个参数取值范围,在其中选取几个值测试模型,选取泛化性能最好的。
我们通常把学得模型在实际使用中遇到的数据称为测试集,模型评估与选择中用于评估测试的数据集通常称为验证集。因此,用测试集上的判别效果来估计模型在实际应用中的泛化能力,把训练集划分为训练集和测试集,基于验证集上的性能来进行模型选择和调参。
三、性能度量
为了衡量模型的泛化能力,要有一个评价标准,就是性能度量。当我们使用不同的性能度量来对比不同模型的能力时,往往可以得到不同的评判结果。因此,要根据实际问题的需求,使用正确的性能度量来评判模型。给定数据集$D=\left { (x_{1},y_{1}), (x_{2},y_{2}), …,(x_{m},y_{m})\right }$,评估学习器$f$的性能,就需要将预测结果$f(x)$与真实标记$y$进行比较。
1. 均方误差
均方误差是回归任务常用的性能度量。
$$
E(f;D)=\frac{1}{m}\sum_{i=1}^{m}(f(x_{i})-y_{i})^{2}
$$
2. 错误率与精度
错误率是分类错误的样本数占样本总数的比例,精度是分类正确的样本数占样本总数的比例。
错误率:
$$
E(f;D)=\frac{1}{m}\sum_{i=1}^{m}\mathbb{I}(f(x_{i})\neq y_{i})
$$
精度:
$$
acc(f;D)=\frac{1}{m}\sum_{i=1}^{m}\mathbb{I}(f(x_{i})= y_{i})=1-E(f;D)
$$
3. 查准率、查全率与F1
查准率是在所有预测为正例的结果中,真实为正例的比例。查全率是所有真实为正例的样本中,预测出为正例所占的比例。查准率与查全率是为了应对我们存在不同需求时的性能度量。二分类问题中,将样例根据真实类别与学习器预测类别的组合划分为真正例(TP)、假正例(FP)、真反例(TN)、假反例(FN)四种情况。F1度量是综合考虑了查准率和查全率。
真实情况 | 预测结果 | |
---|---|---|
正例 | 反例 | |
正例 | TP(真正例) | FN(假反例) |
反例 | FP(假正例) | TN(真反例) |
查准率:
$$
P=\frac{TP}{TP+FP}
$$
查全率:
$$
R=\frac{TP}{TP+FN}
$$
F1度量:
$$
F1=\frac{2\times P\times R}{R+P}
$$
4. ROC与AUC
ROC的全称是“受试者工作特征”曲线,ROC曲线的纵轴是“真正例率”(TPR),横轴是“假正例率”(FPR)。
TPR:
$$
TPR=\frac{TP}{TP+FN}
$$
FPR:
$$
FPR=\frac{FP}{FP+TN}
$$
AUC代表的是ROC曲线与坐标轴围成的面积。
5. 代价敏感错误率与代价曲线
在现实的任务中,不同类型的错误所造成的后果不同。为了权衡不同类型错误所造成的不同损失,可以为错误赋予非均等代价。以二分类为例,设定一个代价矩阵,其中$cost_{ij}$表示将第i类样本预测为第j类样本的代价。一般来说,$cost_{ii}=0$.若将第0类判别为第1类所造成的损失更大。则$cost_{01}>cost_{10}$。
真实类别 | 预测类别 | |
---|---|---|
第0类 | 第1类 | |
第0类 | 0 | cost01 |
第1类 | cost10 | 0 |
在非均等代价下,我们希望最小化总体代价。将第0类作为正类,第1类作为反类。令$D^{+}$与$D^{-}$分别代表数据D的正例子集和反例子集。则代价敏感错误率为
$$
E(f;D;cost)=\frac{1}{m}(\sum_{x_{i}\in D^{+}}\mathbb{I}(f(x_{i}\neq y_{i})\times cost_{01}+\sum_{x_{i}\in D^{-}}\mathbb{I}(f(x_{i}\neq y_{i})\times cost_{10})
$$
在非均等代价下,ROC曲线不能直接反应出学习器的期望总体代价,我么可以使用代价曲线。代价曲线的横轴取值为$[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}}
$$
四、比较检验
首先使用某种实验的评估方法测得学习器的某个性能度量结果,然后对这些结果进行比较选择模型。但是,怎么进行比较,在机器学习中的性能比较涉及几个重要因素:
- 我们得到的是在测试集上的性能,我们希望比较的是泛化性能。那测试性能是否可以代表泛化性能。
- 测试性能因测试数据本身的选择有关系,测试集的大小和测试集样例不同,都会影响到测试的性能。
- 机器学习算法本身存在随机性,即使参数相同,结果也不相同。
这些因此,造成了我们比较学习器的性能时,就不能只进行普通的比较。统计假设检验为我们进行学习器的性能比较提供了重要依据。基于假设检验结果我们可推断出,若在测试集上观察到学习器A比B好,则A的泛化性能是否在统计意义上优于B,以及这个结论的把握有多大。简单的说就是如果测试集上的性能A好于B,那么是否就可以说A的泛化性能好于B。对于这个结论有多大的可能认为是正确的。
常用的假设检验方法:
- 假设检验
- t检验
- 交叉验证t检验
常用的性能比较方法:
- McNemar检验
- Friedman检验与Nemenyi后续检验
1. 偏差与方差
我们试图理解学习算法为什么具有这样的性能,偏差-方差分解是解释学习算法泛化性能的一种重要工具。偏差-方差分解试图对学习算法的期望泛化错误率进行拆解。测试样本$x$。$x$在数据集中的标记为$y_{D}$,$x$的真实标记$y$。$f(x;D)$为模型的输出结果。偏差度量了学习算法的期望预测与真实结果的偏离程度,刻画了算法的本身拟合能力。方差度量了同样大小的训练集的变动所导致的学习性能的变化,刻画了数据扰动所造成的影响。噪声表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界。刻画了问题的本身难度。
学习算法的期望预测:$\overline{f}(x)=E_{D}[f(x;D)]$
样本数相同的不同训练集产生的方差:$var(x)=E_{D}[(f(x;D)-\overline{f}(x))^{2}]$
噪声:$\varepsilon^{2}=E_{D}[(y_{D}-y)^{2}]$
偏差:$bias^{2}(x)=(\overline{f}(x)-y)^{2}$
算法的期望泛化误差:
$$
E(f;D)=bias^{2}(x)+var(x)+\varepsilon ^{2}
$$
期望泛化误差可以分解为偏差、方差和噪声之和。因此,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。