林轩田《机器学习基石》(十五)—— Validation

上一次讲到为了避免overfitting,一个方法是regularization。在之前的E_{in}上加上一个regularizer,生成E_{out},将其最小化,这样可以有效减少模型的复杂度。今天我们要讲的是Validation,验证的方法,帮助我们作出正确的模型选择。

一、模型选择问题

模型的算法有:PLA, pocket, 线性回归, logistic回归等。

在算法中我们还可以决定一些东西:

最大迭代步数T:100; 1000; 10000等

学习率\eta:1; 0:01; 0:0001等

特征变换\Phi:线性, 二次, 10次多项式, 10次Legendre多项式等

正则项\Omega (w):L2 regularizer, L1 regularizer, 对称 regularizer等

正则项系数\lambda:0, 0.01, 1 等

上面都是可以供选择的,不同的选择可以组合,有不同的机器学习效果。我们的目标就是找到最合适的选择搭配。所以如何选择上面的元素就称为模型选择问题。

已知:M个模型,对应H_1,H_2,...,H_M个hypothesis,以及A_1,A_2,...,A_M算法。

目标:我们要挑选出一个H_{m*},使得g_{m*}=A_{m*}(D)是最好的,它有最低的E_{out}(g_{m*})

未知:但是我们不知道E_{out}和P(x) & P(yjx),我们手上只有资料

这是机器学习中一个很重要的实际问题。

所以怎么选择?

可以用眼睛选吗?答:不可以,12课时候讲到,首先因为一些高维问题没办法视觉化,而且用人脑思考的那一部分的vc维很大。

那么我们又想到现在资料是已知的,那能否选一个使得E_{in}最小的模型:

但是如果考虑特征转换,那么用高阶的特征转换一定好于低阶的。或者在这个之下,不加regularization一定比加上要好。会有一些问题发生。这样可能会陷入过拟合。

如果我们假设今天有两个模型(比作两个班的学生):

如果算法A_1是在第一个班里选出最好(E_{in})的学生(H_1)。

如果算法A_2是在第一个班里选出最好(E_{in})的学生(H_2)。

之后再比较A_1A_2,那实际的g_{m*}是在H_1\cup H_2中选的。hypothesis变大了,这样会造成我们付出额外的模型复杂度。今天需要付出两个hypothesis set的vc维d_{VC}(H_1\cup H_2),它进行模型选择也要进行学习。结果泛化性能也不好。

所以使用E_{in}来选择模型的方法行不通,那现在又提出我们能不能找一些测试的资料,用测试资料模仿未来可能在未知资料的测试,看一看哪一个模型效果好。

用这样的方式可以得到的保证,由于模型选择是有限的M个,所以:

所以问题变成了如何找到测试资料?要知道真实的测试资料是那些未知的资料。

我们再进一步的比较上面两种情形,一种是用手上的资料做E_{in},一种是用测试的资料做E_{test}

  • 前者拿得到资料,后者拿不到资料;
  • E_{in}很危险,因为资料也参与决定了g的选择,很容易过拟合。E_{test}用了新的测试资料,可以干净地知道g真实水平。

于是我们取一个折中的办法:我们在我们手上的资料,留一些作为验证的资料(另外留出来),这样既拿得到,在模型选择时候又没参与g的选择,没有被污染过。这种方法称为:legal cheating。

二、验证集

刚才我们说我们希望把我们手中的资料留一部分出来,这一小部分称为验证资料,大小记作K,在这部分上面的err记作E_{val}。我们希望E_{val}E_{out}有联系,那么首先我们应该有:

  • 随机平均地从D中抽取k个资料作为验证集D_{val},且
  • 其余部分N-K笔叫做训练资料D_{train}D_{train}送到算法A里去选择hypothesis,得到的g可能与之前用整个D找到的g不一样(因为用的资料少了),所以此处我们记作g^{-}.

按照上面的流程,我们结合前几节课,可以得到vc bound为:

现在比以前的改进在于:原来D要负责g的选择还要计算E_{in},造成污染(通俗点就是有用它去对模型改正和纠错,又用它去度量最后的错误)。

所以,最终的模型选择问题变为(vc bound同上):

E_{out}的关系如下所示:

这和我们想象中的不一样,我们认为用了越多的资料某种程度应该表现更好,E_{out}更小才对,为什么D_{train}比D少,D_{train}上表现却好?在实际情况下,我们一把采用以下流程:

D先分为D_{train}D_{val}D_{train}通过模型得到许多g^{-}g^{-}_1,g^{-}_2,...g^{-}_M,从而在验证集上计算出相应的E_{test}E_{1},E_{2},...,E_{M},然后得到最好的H_{m*}E_{m*},然后再在全部的资料D上训练得到g_{m*},于是从直觉上我们给出:

下面我们举个例子来解释这种模型选择的方法的优越性,假设有两个模型:一个是5阶多项式H_{\Phi _5},一个是10阶多项式H_{\Phi _{10}}。通过不使用验证集和使用验证集两种方法对模型选择结果进行比较,分析结果如下:

如果全部用手上的资料D计算E_{in}做选择,那每次肯定都会选H_{\Phi _{10}},那么得到的是上面黑色的直线in-sample。如果我今天开天眼知道了未知样本,那么我们可以用真实的E_{test}选,得到的是上面虚线optimal(实际上没办法作出这事)。如果像上述流程图一样(没有M个了,现在我们还可以看流程图,但是H只有两个),最后还要再用全部资料D再做训练得到g_{m*},那么得到的是上面蓝色线validation:g_{m*}(即选择是g_{5}还是g_{10})。如果最后不用全部资料D再做一次,那么得到的是上面红色线validation:g^{-}_{m*}(即选择是g^{-}_{5}还是g^{-}_{10})。从图像上看,蓝色的线比较好。

可以发现,有时候红色的线比黑色实线的效果还差,这是因为这是因为随着K的增大,D_{train}变小,参与训练的资料少了,g^{-}_{m*}的泛化能力可能不太好了。之前的分析:

当K值很大时,E_{val}\approx E_{out},但是g_{m}^-g_{m}相差很大;当K值很小是,g_{m}^-\approx g_{m}^,但是E_{val}E_{out}可能相差很大。K通常设置为原来资料的五分之一。

三、留一交叉验证

我们首先令K很小,K=1,这样我们有g_{m}^-\approx g_{m}^,但是E_{val}E_{out}可能相差很大。我们能否克服这个问题?当K=1,代表我们选择一笔资料来做验证是,所以它在单一笔资料上的错误为:

一个e_n当然无法准确衡量E_{out}(比如在二元分类问题中非0即1),也就无法告诉我们E_{out}有多好。

但是我们可以用很多个e_n(一共有n笔资料,所以可以算n个e_n)做平均E_{loocv},那么它大概可以告诉我们E_{out}是什么样了。

上面叫做交叉留一验证(为什么是交叉,因为有时候这个资料做训练,有时候做验证)。

今天我们希望的事情是:

下面用一个例子图解留一法的过程:

我们留了一个点当做验证集,所以对于其他两个点,我们希望找到一条直线可以作为目标函数f,那么显然是两点确定一条直线,黑色直线就是我们找到的g,留出来的那个点到直线的距离就是e_n,这三个点分别轮流留出一次。算出e_1,e_2,e_3的平均值就是我们要找的E_{loocv}

现在我们希望目标函数f是常数,所以留出一个点当做验证集后,对于其他两个点最好的值是两个点中间的位置,黑色直线就是我们找到的g。如图,留出来的那个点到直线的距离就是e_n,这三个点分别轮流留出一次。算出e_1,e_2,e_3的平均值就是我们要找的E_{loocv}

如何做模型的选择呢?(即对于上面的资料,两个g哪个更好呢?)

我们比较E_{loocv},选择E_{loocv}小的对应的模型。

从理论上分析(能否告诉我们E_{out}有多好):

事件一:留一方法:有一个算法A,手里有1000笔资料,每次留一个,算1000个e,然后做平均算出E_{loocv}

事件二:把算法A拿来,给它999笔资料,算它的E_{out}

我们希望事件一和事件二是一样的。

由于N-1近似为N,E_{out}(N-1)的平均值也近似等于E_{out}(N)的平均值,具体过程如下:

第一行:定义,以及期望和sum是线性的,所以可以做交换。

第二行:将期望拆为D_{train}(简写为D_{n})与留下来的那笔资料。

第三行:部分,给定了一个g_{n}^-,在各种资料上求期望,根据定义E_{out}(g_{n}^-) 

最后一行:D_{n}有N-1笔,以及常数取平均还是常数。

所以E_{loocv}(H,A)的期望与E_{out}(g^-)的期望是几乎一样的。

从图中我们看出,随着特征数量的增加,E_{in}不断减小,E_{out}先减小再增大,虽然E_{in}是不断减小的,与E_{out}之间的差距越来越大,发生了过拟合,泛化能力太差。因此,好的特征数量在中间位置。看出黑色的线和红色的线比较接近,避开了过拟合的问题。

四、V-折交叉验证

留一方法可能会产生的问题:

1.如果现在有1000个点,我就要算1000次的e_n,然后再做平均。每次送99个点进去,然后做1000次这样很花时间。除非一些比较特殊的情况,比如线性回归有闭式解,可以一下子就计算出结果,这样可能使得上面的“重复”不会太耗费时间。但是其他模型就不如这么好了。

2.稳定性问题,我们在一个点上做测试,比如对于二元分类问题,他的err是0或者1,在这些0,1的值求和做平均,但是非0即1这样的差距波动太大了,导致稳定性不太好,我们并不希望说这样的波动导致刚好落入一个很好的点,产生一个好的结果。我们希望从本身上来说它就是稳定的。

因此,在实际问题中,留一法不太适合使用。

为了解决上面这两个问题:计算量与稳定性。

可以看到Leave-One-Out是将N个数据分成N份,每份里有一个,这样的切分太细了,我们现在希望不那么细:比如1000个资料切了十份,其中9份训练,1份验证。并且切分的这10个轮流作为验证集然后求平均。这样看起来用10份的力气,做了和1000份差不多的事情。这种做法叫做:V-折交叉验证。(分成几份就是几折,比如这里V=10)

以经验来看,V通常选择10(也可以选其他的)。

所以模型选择可以变为:

如何选择要使用的验证工具:

  • 通常交叉验证比单一验证稳定,但要付出额外的时间。
  • 通常不用留一法,只需要用5-折或者10-折验证就可以表现得不错。

验证vs训练:

  • 训练是在所有的hypothesis里做选择;
  • 验证像是复赛,进一步选择;
  • 测试只是评估,并没有做选择

验证比测试还是总会存在一点污染的。所以测试的表现才是最终目的,我们只是用验证去近似测试的表现。

 

总结:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值