-->

机器学习40讲_08_07_模型的验证方法

你好,我是王天一。

今天我和你分享的主题是机器学习当中模型的验证方法。

模型本身还有它背后学习方法的泛化性能,也就是模型对未知数据的预测能力是机器学习的核心问题。

可是在一个问题的学习当中呢,往往会出现不同类型的模型,在训练集上具有类似的性能,也就是具有类似的训练误差。

这个时候呢我们就需要模型验证来对这些备选做出一个选择。

由于模型的泛化,性能和它的复杂度是直接挂钩的,所以模型验证的任务呢就是确定模型的复杂度,从而避免过拟合的发生。

原则上说,模型验证应该使用专门的这个验证数据器。

可是当数据集的容量较小,不足以划分成三个部分的时候呢,也可以将验证集和测试集合二为一,共同的来完成。

对于模型的选择,还有评价。

在估计泛化性能的时候,最重要的一个依据就是模型在训练数据集上的精度。

这也是我们唯一能够获取到的一个指标。

定性而论呢,模型在训练集上的精度呢不能太低。

由于模型的拟合和评价,都是在相同的训练集上完成。

所以说用训练误差去估计测试误差得到的肯定是个过于乐观的结果。

如果说在训练集上都达不到较高的精度的话,那这个模型的假设本身很可能就存在问题,这是造成较大偏差的原因。

那么这样的模型呢,你就很难指望它去在真实的数据上能够有良好的表现。

可是另一方面,模型在训练集上的正确率呢,也不是说滴滴益善,因为过低的正确率往往就是过拟合的征兆。

训练数据集当中,它的数据量肯定是有限。

那么这些数据呢共同构成了高维空间当中的一个点击。

只要我使用的模型,它的参数足够多,形式足够复杂的话,我终归可以构造出经过所有数据点这样的一个曲线或者曲面。

这说明什么呢?在训练数据集上我可以达到百分之百的正确率。

显然这样的模型呢对于训练数据,它的拟合能力就过于强大了,也就不可能具备良好的泛化性了。

点击文稿呢你可以看到过拟合的一个图示。

在图中,黑点代表的离散数据可以看成是一组满足线性关系的原始数据和噪声的叠加。

受到噪声的影响呢,即便是生成数据的这个真实的直线,也不可能对数据进行一个完全的拟合,总归存在着一定的残留误差。

如果要将这个材料误差降低为零的话,获得百分之百的正确率。

这时的拟合结果是什么呢?就是一条龙飞凤舞的一个曲线,也就是个多项式的模型。

虽然说这个多项式模型它完美的经过了所有的数据点,但是它所代表的这个数据的生成方式啊,你看显然和黑色的直线并不接近。

这个时候呢过高的训练集正确率就会和模型优良的泛化性能背道而驰。

既然训练误差太高不行,太低了也不行,那究竟到什么程度,这算合适呢?关于训练误差和泛化误差的关系,统计学习记录这本教材从理论上给出了一些解释,这些解释呢比较晦涩啊,并不那么直观。

在这里呢我尝试着加以一个解读。

这部分分析的出发点是误差的分解理论啊,误差可以分成噪声偏差。

还有方差三部分啊,这个我们之前也提到过当模型的训练过程结束之后,在训练集上我就可以计算出拟合出来的模型f啊,它的训练误差。

这个训练误差呢可以用这个零一的损失函数,也可以用均方误差来表示。

反过来在测试集上,我可以计算出来模型的这个泛化误差。

一般来说呀,训练数据是已知的,那么这个测试数据呢是未知的,两者之间并不会存在交集。

所以说这个泛化误差也经常会被称为叫样本外的误差。

这是统计学习基础里给出来的名称、训练误差和样本外误差啊,这两个概念很好理解。

但是随后呢作者们又引入了一个新的概念,叫做样本内误差。

这个概念的核心是什么呢?它的核心在于说刻画噪声的影响。

训练集里的数据,它既包含着由潜在的概率分布所决定的这个确定的部分,也包含着受到噪声的干扰所产生的这个随机的部分。

在训练的过程当中呢,这个模型app的拟合会不可避免的把噪声的一些随机特性也纳入到建模的范畴之中。

这样的话,如果说考虑噪声影响,那么即使当训练数据的自变量不变的时候,它的因变量也会受到噪声的影响而发生变化,这什么意思呢?假设在训练数据集当中啊,我的输入是x一、x二、x三,那么得到的结果是一个y.但是如果我按照这个数据的生成机制啊,我用同样的x一、x二、x三再生成一个新的页变量的话,这时候的y呢就可能不是原来的y了,而变成y零啊。

那么下一次呢x一、x二、x三又会生成y一又会生成y二啊,每一次的结果都是不一样。

那么这个不一样呢,就来源于噪声的影响。

从这个角度来理解的话,训练数据集它其实是什么呢?是一个样本啊,采样出来的样本,它所对应的总体是它的自变量固定不变的数。

因变量所有可能的取值。

那么这个所有的可能的取值也是无穷多的。

利用这个样本,也就是训练数据集了。

训练出来的模型f在样本上的表现和在总体上的表现之间的差值,就是所谓的样本内的误差。

这个概念呢不是很直观啊,你可以再花点时间啊,再去把它理解透彻。

当然看到这儿啊,你可能就发现这个样本内误差呢纯粹是统计学家想象出来的概念。

但好在经过一番处理之后啊,对于测试误差的估计可以转化成对于样本内误差的估计。

这就让这个概念呢终于找到了它能够发光发热的场景,不是没用的概念。

进一步简化的话,由于训练误差是已知的,所以说对样本内误差的估计又可以转化成为对于它和训练误差之间的这个差值的估计。

那么这个差值呢在统计学习基术当中被称为乐观度,这又是一个新的概念。

对于线性模型这一类特殊形式的模型呢,乐观度是可以用解析式的方式来表示的,它直接取决于模型当中参数的数目。

所以根据这个赤值信息量准则啊,缩写叫AIC或者是贝叶斯信息量准则,缩写叫BIC,就可以用来指导模型的选择。

说白了啊,在上面的这一套这个误差那个误差的理论框架之下,模型的选择实际上就是计算有效参数的一个数目。

上面这个理论呢虽然严谨啊,但是也太过复杂。

在工程上处理误差的时候呢,根本不需要这喋喋不休的这个推导,直接用数据来模拟,那就什么都出来。

所以说更通用的这个验证方法啊是直接估计样板外误差,也就是直接估计测试误差。

估计的手段是什么呢?是数据的重采样。

这样做可以充分利用有限的数据来估算模型的泛化性能,也是实际应用当中惯常的一个技巧模型。

在验证集中的性能,它是模型选择,还有评估的依据。

所以说,无论使用什么样的重采样策略验证集,都需要满足一个最基本的要求,那就是不能和训练集存在交集。

为什么呢?因为模型本身它就是在训练集上面拟合出来的。

如果再用相同的数据去验证啊,去计算这个泛化误差的话,这种既当运动员又当裁判员的做法就缺乏说服力。

所以在对数据进行划分的时候,最基本的原则就是保证训练集、验证集,还有测试集。

三者两两互不相交,井水不犯河水。

除了互不相交之外,另一个需要注意的问题就是,这三个集合当中,样例的分布应该具有一致性。

也就是说三个集合里正利和负立的这个比例应该大概齐差不多啊,大差不差。

避免在数据集之间呢出现这种类别的不平衡。

如果说训练集和验证集或者说测试集它们的样例分布相差较大的话,那么这种分布上的差异或者说类别上的不均衡啊,将不可避免的给性能的估计带来偏差,从而呢对最终的模型选择造成影响。

这种分布的差异具体是什么含义呢?可以举一个例子,当老师的都知道啊,一次考试中的学生成绩应该是近似满足这个正态分布。

所以在评估教学效果的时候啊,在学期中间我评估教学效果的时候,学生样本的这个构成就至关重要。

如果我都选择成绩好的学生去做调研的话,这样的学生你让他在自习室自学,这个效果可能比他来上课还要更好,所以说他们的成绩啊就会比较高。

反过来,如果说选择的都是成绩较差的学生的话,那么即使老师再苦口婆心的掰开揉碎的去说啊,很大可能上还是会白费功夫。

这种情况下呢评估出来的教学效果就会比较差。

但是这两种情况,它的共同特点就是什么都不能真实的反映教学质量。

只有当学生样本的构成也是两头尖中间宽这种纺锤的形状的时候呢,我这个评估出来的效果才能够忠实于真实的情况。

这个时候呢你做出来的评估才是有参考价值。

想要充分利用有限的数据的话,那必须在训练集和验证集的这个划分方式啊,或者说验证数据的这个抽取方式上做一些文档。

最简单直接的方法就是随机采样出来一部分数据,我给它作为训练集,再采样出另一部分啊作为验证器。

这种方法呢就是流出法。

当然了,如果机器学习的过程不使用验证步骤,那么这种划分方式就相当于拿出大部分的数据来做训练,剩下的全部的给它留做测试。

这呢也是留出这个名称的含义。

流出法的一个问题是什么呢?它所流出的用来进行模型验证或者测试的这个数据啊是固定不变的。

即使是在满足这个分布一致性的条件之下,训练集和验证集。

它的划分方式呢也并不是唯一的你。

把所有ID为基数的这个数据作为训练集和把所有IDVL五数的这个数据作为训练集,那么进行训练和评估的结果肯定是不一样。

所以说通过流出法计算出来的这个泛化误差呢,本质上它也是个随机变量。

单次流出得到的估计结果就相当于对这个随机变量进行一次采样。

那么这一次的采样结果呢,肯定没有办法体现出随机变量的分布特性。

正因为如此,在使用流出法的时候呢,一般会采用多次随机划分的方式。

我把原始的数据集给它划分成不同的这个训练验证集的组合。

再在这些不同的组合之上来评估模型性能,评估出来的性能呢再给它取平均值。

这样的话呢就能得到关于泛化误差更加精确的一个估计。

把流出法的思想稍微做一个推广,就可以得到常用的这个k折交叉验证。

K轴交叉验证。

它将原始的数据集随机的划分成为k个相同大小的子集,并且进行k轮的验证。

在每一轮的验证当中呢,我都会选择一个子集作为验证集。

那么剩下的所有k减一个子集都用作训练集。

由于每一个轮次当中选择的验证集都不一样,所以每一轮当中得到的结果呢也是不同的这k个结果的均值,就是对泛化性能最终的一个估计值。

点击文稿,你可以看到k折交叉验证它的一个示意图。

在k轴交叉验证当中,k值的这个选取会直接决定估计结果的精确程度较小的k值呢意味着更少的数据被用于训练模型,这将会导致每一轮估计得到的结果会更加集中,但是都会偏离真正的泛化误差。

也就是说方差较小而偏差较大。

随着k的不断增加呢,越来越多的数据会被应用在模型的拟合之上。

这时计算出来的泛化误差也就会越来越接近真实值。

但是由于训练数据它的相似度越来越高,训练出来的模型呢也就会越来越像。

这导致什么呢?在不同的验证集上,可能会出现较大的方差。

K轴交叉验证的一个特例是k等于原始数据集的容量。

N这时候每一轮当中只有一个样本被用作测试,而不同轮次中呢训练数据集几乎是完全一致的。

这个特例呢被称为刘一法流一法,它得到的是关于真实的泛化误差近似无篇的一个估计。

它的结果呢可以看成是比较准确,但他的缺点在于需要训练的模型的数目啊,也就是训练的轮次啊和原始数据集样本的容量是相等的这意味着如果原始数据集当中有一千个数据,我就要训练一千个模型。

一万个数据就训练一万个模型。

当数据量比较大的时候,使用流一法无疑会带来庞大的一个计算开销。

除了k折交叉验证之外,另一种模型的验证方法呢是自助采样。

在学习概率论的时候,你肯定计算过这样的问题啊,一个袋子里红球有多少多少个,白球有多少多少个,从中抽出一个球,查看颜色之后放回或者不放回袋子里,再抽一个球出来。

新抽出这个球是红球或者是白球的概率是多少?那么很显然前面提到的这个k轴交叉验证呢,执行的就是典型的一个不放回的冲塞压。

在同一轮次的验证当中,一个样本要么出现在训练集里,要么出现在验证集里。

两者呢必居其一。

相比之下的话,自助采样执行的就是有放回的重采样。

如果通过自助采样来生成训练集的话,那么它就需要每次都随机的从原始数据集里抽取出一个样本,并且拷贝到训练集当中。

抽完之后呢,哎我把这个样本放回到原始的数据集,再来重复以上的这个随机抽取的步骤。

这种泛回虫采样的方式呢,它会导致某些数据可能在同一轮的验证当中,多次出现在训练集当中。

而另外一些数据呢,则可能从头到尾都没有参与到模型的训练里。

这样的话,在每一轮的自助采样当中,没有被采到的样本,就会作为测试数据来进行使用。

那么点击文稿呢,你也可以看到自助采样的一个示意图。

最后要说明的一点是,模型验证,它是模型原型设计的最后的一步完善。

一旦完成了验证过程,那这个模型就不能再做调整。

这就像我对于陶土捏出来的模型,做出最后的一个修饰和定型。

至于说这个定型之后啊,入窑烧制的效果如何,那就完全靠天吃饭出来的成品品相不佳的话,就只能狠心摔碎。

同样的道理,即使验证之后的模型在测试集上的表现再差啊,也只能打掉牙,往肚子一按啊,不能对它进行调整。

如果要进行调整的话,那就得重打鼓并开脏重起炉灶。

今天呢我和你分享了模型验证的实践思路,还有具体的方法,包括着以下的四个要点。

第一,模型验证的作用是选择最佳模型,并且确定它的性能。

第二,对于数据的重载样,可以实现对样本外误差,也就是泛化误差的估计。

第三,k折交叉验证是无范回的重采样方法。

第四,自助采样是有范回的重采样方法。

在机器学习当中呢,参数和超参数是两个不同的概念,想必你也有所了解。

模型的参数呢是对模型的内部描述,超参数呢则是对模型的外部描述。

对于多项式模型,FX等于a零加上a一x一加上a二的x平方,加上a三的x立方。

啊。

这样的一个模型来说,所有的AI都是需要拟合的参数。

而多项式的最高次数n它就是一个超参数。

模型的验证呢实际上就是通过调整模型的超参数来控制模型复杂度,从而呢找到一种预测能力最强的这个模型的参数。

那么关于参数和超参数之间的关系,你可以查阅相关的文件,并且在这里分享你的见解。