机器学习-01模型评估与选择

"关于机器学习的背景知识"

Posted by JosonChan on 2020-10-31

数据集

对于一个需要解决的问题的样本数据,在建立模型的过程中,数据会被划分为以下几个部分:

  • 训练集:用训练集对算法或模型进行训练过程。(高考习题)
  • 验证集:利用验证集进行交叉验证,选择出最好的模型。(高考的模拟卷)
  • 测试集:最后利用测试集对模型进行测试,获取模型运行的无偏估计,检验模型的泛化能力。(高考)
  • 如果不需要用无偏估计来评估模型的性能,则可以不需要测试集。即把验证集当成了测试集来使用。这个时候,需要保证验证集与实际需要使用的数据尽可能类似。

在小数据量的时代,如100、1000、10000的数据量大小,可以将数据集按照以下比例进行划分:

  • 无验证集的情况:70% / 30%;
  • 有验证集的情况:60% / 20% / 20%;

而在如今的大数据时代,对于一个问题,我们拥有的数据集的规模可能是百万级别的,所以验证集和测试集所占的比重会趋向于变得更小。

验证集的目的是为了验证不同的算法哪种更加有效,所以验证集只要足够大到能够验证大约 2-10 种算法哪种更好,而不需要使用 20% 的数据作为验证集。如百万数据中抽取1 万的数据作为验证集就可以了。

测试集的主要目的是评估模型的效果,如在单个分类器中,往往在百万级别的数据中,我们选择其中 1000 条数据足以评估单个模型的效果。

  • 100 万数据量:98% / 1% / 1%;
  • 超百万数据量:99.5% / 0.25% / 0.25%(或者99.5% / 0.4% / 0.1%)

hold-out 划分

hold-out 方法直接将数据集划分为两个互斥的集合。

需要注意的是,划分要尽可能保持数据分布的一致性,避免面因数据划分过程中引入额外的偏差。例如,一个多类别的数据集,我们的划分的时候需要考虑的是训练集、验证集类别之间的比例,保留类别比例的采样凡是是“分层采样”。

在给定了训练/验证集的样本之后,仍然存在多种划分方式对初始的数据集DD 进行分割,在使用留出法,一般要采用若干次随机划分,重复进行实验之后取平均值。

交叉验证划分

交叉验证的基本思想是重复地使用数据;把给定的数据进行切分,将切分的数据集组合为训练集与验证集,在此基础上反复地进行训练、验证以及模型选择。

训练的基本流程:

cross-valid.jpg

以上被称为 k 折交叉验证,通常 k 取得10。如果数据集 DD 中有m个样本,若 k=mk=m,则称为留一法,但是该方法需要训练m个模型,当数据量大的时候不适用。

自助法(bootstrapping)划分

bootstrapping指的是可重复采样,给定包含 m 个样本的数据集 DD ,我们对它进行采样产生数据集 DD' :每次随机从DD 中挑选一个样本,将其拷贝放入 DD',然后再将该样本放回初始数据集DD 中,使得该样本在下次采样中有可能被采样到;重复m次之后,我们就得到了包含m个样本的数据集DD'

显然,DD中有一部分样本会多次出现,而另一部分样本不出现。即通过自助采样,初始数据集DD 中约有36.8%(概率取极限)的样本未出现在采样数据集DD'中,于是我们可以将DD'用作训练集,DDD-D' 用作验证集。这样训练时,就有m个样本,同时仍然有大概三分之一的数据没有出现在训练集中。

自助法可以用在数据量很小、难以有效划分训练/验证集时。当然,自助法会关系爱吧初始数据集的分布,会引入误差。如果数据量足够,还是使用 hold-out和交叉验证比较好。

数据的分布与重叠

理想状态:训练集与验证集与测试集都来自同一个分布,并且各自都不重叠。

  • 训练集与验证集需要同分布的原因:

    把模型的训练当作考试。训练集当作是学生平时的练习以及习题。验证集当作是模拟考。如果学生在模拟考试中考得不好,那么有两个原因。一个是因为考生平时只会背答案,导致考试不会。相当于训练中的过拟合。另一个原因是,考试的题目与考生平时训练的题目完全不同,考生完全没有练习过。

    那么,如果我们训练模型之后,训练集的 loss 下降到我们能够接受的水平,然后验证集表现却不好。那么这个时候就不知道是哪里出了问题,所以训练集与验证集需要同分布。

  • 验证集要和测试集来自于同一个分布(数据来源一致):

    可以使得机器学习算法变得更快并获得更好的效果。因为,验证集 的效果如果好的话,意味着测试集的效果也好。如果训练集与验证集与测试集数据分布不同,我们要尽可能使得验证集与测试集的数据分布一样。训练集与验证/测试集之间的分布不同可以通过训练-验证集(training-dev set) 来确定是数据不匹配问题还是过拟合。

  • 各个数据集都不重叠原因:

    在考试中,考生的理想状态就是平时训练的题目与模拟考以及高考一样。而老师出的模拟考则要尽可能与高考一样。高考出的卷子则要尽可能与模拟考不一样。

    所以说训练集要与验证集不一样才能反映出该考生的水平。测试集也要与训练集和验证集不一样才能反应出模型的性能。

性能度量

错误率与精度

error=sum of error exampletotal exampleerror = \frac {sum \ of \ error \ example } {total \ example}

acc=1erroracc = 1-error

查准率、查全率与F1

对于二分类,可将学习器预测类别的组合划分为TP、FP、TN、FN。

  • 查准率(precision):

P=TPTP+FPP = \frac {TP} {TP+FP}

  • 查全率(recall):

R=TPTP+FNR=\frac {TP} {TP+FN}

假设我们有个西瓜分类问题,把所有的西瓜分为好瓜和坏瓜。查准率指的是在我们认为的好瓜中,真正是好瓜的概率。查全率指的是所有真正的好瓜中有多少被挑选出来了。

precision 与 recall 是一对矛盾的度量。一般来说,precision高的时候,recall低,recall高的时候,precision低。对于查全率来说,我们只要加大挑选的数量,那么所有好瓜就被挑选出来了,但是这样precision会低;同理,我们只挑一些看起来是好瓜的进行评估,则有可能会错过一些不起眼的好瓜。

  • F1 度量(查准率与查全率之间的调和平均数):

F1=2PRP+RF1 = \frac {2PR} {P+R}

调和平均数更加关注较小值,更好反映模型的性能,比如查准率为1,查全率为0的时候,算术平均数为0.5,而F1为0。

在一些应用中,对查准率和查全率的重视程度不同。例如在商品推荐系统中,为了尽可能少打扰用户,更希望推荐内容是真正有效的,那查准率比较重要,而在逃犯信息检索系统中,更希望尽可能少漏掉逃犯,此时查全率更重要。我们可以使用加权的调和F1:

1Fβ=11+β2(1P+β2R)\frac 1 {F_\beta} = \frac {1} {1+\beta^2}(\frac 1 P + \frac {\beta^2} {R})

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

P-R曲线

在很多情况下,我们可以根据学习器的预测结果对样例进行排序,排在前面的是学习器认为“最可能”是正例的样本,排在后面的是学习器认为最不可能是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率。以查准率为纵轴、查全率为横轴作图,则得到 P-R 曲线。

P-R

在比较时,如果一个曲线被另外一条完全包住,则后者的性能比前者好。如果有交叉可以采用其他的,如BEP,F1分数。

BEP指的是查全率与查准率相等时的值。

ROC 与 AUC

与P-R 曲线类似,我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要的值,分别以它们的横、纵坐标作图,就得到了ROC曲线。ROC的纵轴是 True Positive Rate,横轴为 False Positive Rate:

TPR=TPTP+FNTPR = \frac {TP} {TP+FN}

FPR=FPTN+FPFPR = \frac {FP} {TN+FP}

roc

现实中只有有限个样例,所以不可能得到光滑的曲线。现实中,我们根据学习器预测结果对样例进行排序,然后把分类阈值设为最大,即把所有样例预测为反例,此时坐标为(0,0),以此类推得到 ROC 图。

进行学习器的比较,如果曲线完全包住另一个曲线,则前者的性能好过后者。若有交叉,则可以看AUC,AUC是ROC曲线的面积,即所有矩形面积之和。

方差、偏差分解

在机器学习中,我们用训练数据集去训练一个模型,通常的做法是定义一个误差函数,通过将这个误差的最小化过程,来提高模型的性能。然而我们学习一个模型的目的是为了解决训练数据集这个领域中的一般化问题,单纯地将训练数据集的损失最小化,并不能保证在解决更一般的问题时模型仍然是最优,甚至不能保证模型是可用的。这个训练数据集的损失与一般化的数据集的损失之间的差异就叫做泛化误差(generalization error)。

而泛化误差可以分解为偏差(Biase)、方差(Variance)和噪声(Noise)。

如果我们能够获得所有可能的数据集合,并在这个数据集合上将损失最小化,那么学习得到的模型就可以称之为“真实模型”。当然,在现实生活中我们不可能获取并训练所有可能的数据,所以“真实模型”肯定存在,但是无法获得。我们的最终目的是学习一个模型使其更加接近这个真实模型。

BiasVariance 分别从两个方面来描述我们学习到的模型与真实模型之间的差距。

Bias 是用所有可能的训练数据集训练出的所有模型的输出的平均值与真实模型的输出值之间的差异。

  • Bias的含义:偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。

Variance是不同的训练数据集训练出的模型输出值之间的差异。

  • 方差的含义:方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。

Noise 的存在是学习算法所无法解决的问题,数据的质量决定了学习的上限。假设在数据已经给定的情况下,此时上限已定,我们要做的就是尽可能的接近这个上限。

  • 噪声的含义:噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

注意:我们能够用来学习的训练数据集只是全部数据中的一个子集。想象一下,我们现在收集几组不同的数据,因为每一组数据的不同,我们学习到模型的最小损失值也会有所不同,它们与“真实模型”的最小损失也是不一样的。

偏差、方差窘境

一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variance dilemma)。下图给出了一个示意图。给定学习任务,假定我们能控制学习算法的训练程度,则在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时偏差主导了泛化错误率;随着训练程度的加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐主导了泛化错误率;在训练程度充足后,学习器的拟合能力已经非常强,训练数据发生的轻微扰动都会导致学习器发生显著变化,若训练数据自身的、非全局的特性被学习器学到了,则将发生过拟合。

bias-var

偏差、方差与过拟合、欠拟合的关系

一般来说,简单的模型会有一个较大的偏差和较小的方差,复杂的模型偏差较小方差较大。

欠拟合:模型不能适配训练样本,有一个很大的偏差。

举个例子:我们可能有本质上是多项式的连续非线性数据,但模型只能表示线性关系。在此情况下,我们向模型提供多少数据不重要,因为模型根本无法表示数据的基本关系,模型不能适配训练样本,有一个很大的偏差,因此我们需要更复杂的模型。那么,是不是模型越复杂拟合程度越高越好呢?也不是,因为还有方差。

过拟合:模型很好的适配训练样本,但在测试集上表现很糟,有一个很大的方差。

方差就是指模型过于拟合训练数据,以至于没办法把模型的结果泛化。而泛化正是机器学习要解决的问题,如果一个模型只能对一组特定的数据有效,换了数据就无效,我们就说这个模型过拟合。这就是模型很好的适配训练样本,但在测试集上表现很糟,有一个很大的方差。

偏差、方差与模型复杂度的关系

由前面偏差和方差的介绍,我们来总结一下偏差和方差的来源:我们训练的机器学习模型,必不可少地对数据依赖。但是,如果你不清楚数据服从一个什么样的分布,或是没办法拿到所有可能的数据(肯定拿不到所有数据),那么我们训练出来的模型和真实模型之间存在不一致性。这种不一致性表现在两个方面:偏差和方差。

那么,既然偏差和方差是这么来的,而且还是无法避免的,那么我们有什么办法尽量减少它对模型的影响呢?

一个好的办法就是正确选择模型的复杂度。复杂度高的模型通常对训练数据有很好的拟合能力,但是对测试数据就不一定了。而复杂度太低的模型又不能很好的拟合训练数据,更不能很好的拟合测试数据。因此,模型复杂度和模型偏差和方差具有如下图所示关系。

bias-model

深度学习中的偏差与方差

我们可以通过训练集以及验证集的误差来判断这个算法是否存在biasvar 的问题。当然,我们假设最优误差(噪音),然后度量的标准都在这个最优误差之上。

  • 训练集的误差高,验证集与训练集的误差差不多,说明模型欠拟合,属于 high bias
  • 训练集的误差低,验证集的误差比较大,说明模型过拟合,属于 high var
  • 训练集的误差高,验证集的误差比训练集的误差大很多,说明模型很差,属于 high bias & high var
  • 当两者的误差都很低,说明这个模型不错。

如何解决偏差、方差问题?

整体思路:首先,要知道偏差和方差是无法完全避免的,只能尽量减少其影响。

  • 在避免偏差时,需尽量选择正确的模型,一个非线性问题而我们一直用线性模型去解决,那无论如何,高偏差是无法避免的。
  • 有了正确的模型,我们还要慎重选择数据集的大小,通常数据集越大越好,但大到数据集已经对整体所有数据有了一定的代表性后,再多的数据已经不能提升模型了,反而会带来计算量的增加。而训练数据太小一定是不好的,这会带来过拟合,模型复杂度太高,方差很大,不同数据集训练出来的模型变化非常大。
  • 最后,要选择合适的模型复杂度,复杂度高的模型通常对训练数据有很好的拟合能力。

深度学习针对偏差和方差的思路:

偏差: 实际上也可以称为避免欠拟合。

  • 用更多的特征 – 增大输入向量的维度。(增加模型复杂度)
  • 扩大网络规模,如添加隐藏层或者隐藏单元数目
  • 花费更长的时间训练

方差: 避免过拟合

  • 增大数据集合 – 使用更多的数据,减少数据扰动所造成的影响
  • 寻找更合适的网络
  • 正则化方法
  • 交叉验证法

在深度学习的早期阶段,没有太多方法能做到只减少偏差或方差而不影响到另外一方。而在大数据时代,深度学习对监督式学习大有裨益,使得我们不用像以前一样太过关注如何平衡偏差和方差的权衡问题,通过以上方法可以在不增加某一方的前提下减少另一方的值。