机器学习笔记-Validation

本系列共四篇,为林轩田机器学习基础篇学习笔记。主要内容可以总结概括为:线性模型通过非线性的变换可以得到非线性的模型,增强了模型对数据的拟合能力,但这样导致了在机器学习领域中一个很常见的问题,过拟合。为了解决这个问题引入了正则化因子(规则化因子)。而为了解决正则化因子的选择,模型的选择以及超参数的选择等问题引入了 validation validation 的相关方法。

上一篇中讲到可以使用 regularization r e g u l a r i z a t i o n 来避免 overfitting o v e r f i t t i n g 的发生。监督机器学习问题可以概括为:在规则化参数的同时最小化误差。最小化误差是为了让我们的模型拟合我们的训练数据,而规则化参数是防止我们的模型过分拟合我们的训练数据。 Regularization Regularization 的具体做法是我们不只是专注在最小化训练误差上,而是在训练误差 Ein E i n 上加上一个正则项用来描述模型的复杂度,将得到的代价函数 augmented error augmented error 一起做最小化。 这样可以有效的减少所使用模型的复杂度。在上篇中讲到在机器学习中有很多选择需要做,这节讲的 validation v a l i d a t i o n 可以帮助我们做出合理的选择。

1 - 模型选择问题

1.1 - 问题提出

即使是面对最简单的二元分类 binary classification binary classification 问题,目前我们能选择的算法也有很多,比如: PLA PLA pocket pocket linear regression linear regression logistic regression logistic regression ;在这些方法里面有很多是迭代的算法,即 iterative algorithm iterative algorithm ,所以很多时候需要决定迭代的次数;这个时候还需要决定步长 η η ,例如当使用 gradient descend g r a d i e n t   d e s c e n d 或者是 stochastic gradient descend stochastic gradient descend ; 还需要决定应该使用什么样的特征转化 Φ Φ :使用原来的特征,使用二次的特征转化,十次的特征转化, ;要不要使用正则项 regularizer regularizer ,如果使用的话,使用哪种类型的正则,以及使用的正则因子的强度是多大 λ λ 。在这么多形形色色的组合当中,应该怎么做出正确的选择就是一个很值得讨论的问题。本篇主要关注的问题是怎么决定使用什么样的模型和怎么选择模型中的超参数

1.2 - 模型选择

假设有 M M 个模型:H1,H2,,HM,相应的算法为: A1,A2,,AM A 1 , A 2 , ⋯ , A M 。我们的目标是要选择一个模型 Hm H m ∗ 使得 gm=Am(D) g m ∗ = A m ∗ ( D ) 有最小的 Eout(gm) E o u t ( g m ∗ ) 。但是, Eout E o u t 是未知的是没有办法计算的。

如何进行模型的选择呢?下面是一些可能的思路:

  • 根据 Ein E i n 来进行模型选择:即计算每一个模型在已知的数据上的 Ein E i n 的大小,选择 Ein E i n 最小的模型作为最终的 gm g m ∗ 。 这样做有什么问题呢?第一个问题是,如果考虑使用特征转化:那么使用 Φ100 Φ 100 的结果总是要好于 Φ10 Φ 10 的结果。另外不加正则项一定会比加上正则项结果要好,因为不加正则化项的时候只考虑最小化 Ein E i n 就好了。也就是说根据 Ein E i n 来进行模型选择的话极有可能过拟合。

  • 另一个思路是,使用另外一些测试资料来测试哪一个模型的表现最好。如果使用这样的方式,根据在机器学习的可行性中提到的 finite bin Hoeffding finite bin Hoeffding 定理可以得到一个很强的保证:
    Eout(gm)Etest(gm)+O(logMNtest) E o u t ( g m ∗ ) ≤ E t e s t ( g m ∗ ) + O ( l o g M N t e s t )
    但是问题是测试资料是不容易得到的。

结合上面两种思路可以得到最好的方式是:在已有的数据上留出一部分数据作为验证集( validation data validation data ), 这部分资料不参与模型的训练,只用来对模型的表现进行测试。

2 - Validation

根据上面的讨论,原始的数据 D D (大小为 N N )现在被划分为两个部分:

  • 训练数据 Dtrain (大小为 N-K N-K )

    • 验证数据 Dval D v a l (大小为 K K )

    • 这里写图片描述

      原来我们喂全部的数据 D D 到算法 A A 中得到一个模型 gm g m , 即 gm=Am(D) g m = A m ( D ) ,现在我们使用 N-K N-K 笔数据 Dtrain D t r a i n 喂到算法中得到 gm g m − , 即 gm=Am(Dtrain) g m − = A m ( D t r a i n ) 。因为得到 gm g m − 比得到 gm g m 少用了 K K 笔资料,所以有一个“”的上标。

      原来的资料 D D 既要用来做模型的训练,又要用来计算 Ein E i n 衡量模型的好坏。现在将 D D 分成两个部分, Dtrain D t r a i n 用来做模型的训练; Dval D v a l 用来计算 Eval E v a l 衡量模型的好坏,这样就避免了过拟合的问题。

      2.1 - 模型选择

      这样我们就可以通过 Eval E v a l 来进行模型的选择:

      • 将数据 Dtrain D t r a i n 喂给算法 A A 得到 g g − ,然后使用 Dval D v a l 来计算 g g − Eval E v a l ,选择使得 Eval E v a l 最小的作为最优的模型 m m ∗
        m=argmin1mM(Eval(Am(Dtrain))) m ∗ = a r g m i n 1 ≤ m ≤ M ⁡ ( E v a l ( A m ( D t r a i n ) ) )
      • 因为通常当训练数据越多的时候, Eout E o u t 会越小。所以当选定了好的算法,通常会将所有的数据喂给最佳的模型以降低模型的 Eout E o u t
        Eout(gm)Eout(gm) E o u t ( g m ∗ ) ≤ E o u t ( g m ∗ − )


      这里写图片描述

      上图给出了做 validation validation 的一般流程:先把资料划分为两个部分: Dtrain D t r a i n Dval D v a l ,在 Dtrain D t r a i n 上尝试各种不同的模型的训练得到 g g − 。然后对各个不同的模型 g g − 计算其在验证集 Dval D v a l Eval E v a l 的大小。这样就可以选出最好的模型,然后将所有的资料 Dtrain D t r a i n 喂给这个模型,得到最后的 g g 。所以我们不是输出g,而是输出 g g 因为g是在最好的模型上,使用了最多的数据得到的结果。

      2.2 - Validation in practice


      这里写图片描述

      从这个图中可以得到的信息是:如果使用 Etest E t e s t 来选择模型,最终得到的模型的 Eout E o u t 最低,如图中的那条虚线;如果使用 Ein E i n 来测试模型,最终得到的模型的 Eout E o u t 最高,如图中绿色那条水平线;蓝色和红色的线分别代表使用 validation set v a l i d a t i o n   s e t 中的 gm g m gm g m − 得到的模型,可以看到的是 Eout(gm)Eout(gm) E o u t ( g m ) ≤ E o u t ( g m − )

      由于蓝色的线位于绿色的线之下,所以使用 Eval E v a l 能比使用 Ein E i n 得到泛化能力更强的模型。可能有一个异常的现象是,在图中为什么有的时候红线位于绿线之上呢?因为横坐标是 validation set v a l i d a t i o n   s e t 的大小。当 validation set v a l i d a t i o n   s e t 很大的时候,可能 train set t r a i n   s e t 中用于训练模型的样本的个数减少了,所以得到了不好的模型。

      这说明其实 validation set v a l i d a t i o n   s e t 的大小对于结果来说是有很大的影响的。我们之前的推论是基于两个约等式:

      Eout(g)Eout(g)Eval(g)(1) (1) E o u t ( g ) ≈ E o u t ( g − ) ≈ E v a l ( g − )

      要想让右边的约等号成立,需要 K K 较大,因为这样 Eval 才能和 Eout E o u t 差不多相等;要想让左边的约等号成立,需要 K K 较小,因为这样g g g − 才是差不多的。

      在实际应用中,通常 validation set v a l i d a t i o n   s e t 的个数为总的训练样本个数的 15 1 5 或者是 110 1 10

      3 - 留一法(Leave-One-Out Cross Validation)

      上一小节中提到, validation set validation set 中样本的大小 K K 的设置是个需要考虑的问题,在这里我们考虑一种极端的情形,我们K设置为 1 1 。在这样的设置下,g g g 非常的接近。于是(1)式中的左边部分很容易满足,但是 (1) ( 1 ) 式的右边部分就很难满足了。我们来看看能不能克服这件事。

      K=1 K = 1 的时候,也就是说此时验证集中只有一笔资料, 假设这一笔资料是 (xn,yn) ( x n , y n ) , 那么验证集可以记为 D(n)val={(xn.yn)} D v a l ( n ) = { ( x n . y n ) } ,在这一笔资料上的 validation error v a l i d a t i o n   e r r o r 记为 E(n)val(gn)=err(gn(xn),yn)=en E v a l ( n ) ( g n − ) = e r r ( g n − ( x n ) , y n ) = e n , 其中 gn g n − 表明使用除去 (xn,yn) ( x n , y n ) 剩余的所有资料训练得到的模型。所以当只有一个样本 (xn,yn) ( x n , y n ) 作为 validation set v a l i d a t i o n   s e t 的时候, validation error v a l i d a t i o n   e r r o r 可以表示为 en e n

      可想而知一个 en e n 是无法衡量 Eout(g) E o u t ( g ) 的好坏的。但是如果有足够多的 en e n 的时候,例如 e1,e2,,eN e 1 , e 2 , ⋯ , e N ,求取他们的取值就可以用来大概估计 Eout(g) E o u t ( g ) 的表现。根据这样的思路定义 leave l e a v e - one o n e - out cross validation o u t   c r o s s   v a l i d a t i o n

      Eloocv(H,A)=1Nn=1Nen=1Nn=1Nerr(gn(xn),yn) E l o o c v ( H , A ) = 1 N ∑ n = 1 N e n = 1 N ∑ n = 1 N e r r ( g n − ( x n ) , y n )

      3.1 - Illustration of Leave-One-Out

      对于一个只有三个样本的回归问题,下图演示使用 leave-one-out cross validation leave-one-out cross validation 进行模型选择的过程。
      假设我们考虑两个模型,一个是线性回归模型,一个是常数模型。
      对于线性回归模型,依次留出一个点,利用剩下的另外两个点使用线性回归进行拟合得到模型(直线),然后利用得到的模型计算在留出的那一个数据上真实值和测量值差值,即图中的虚线所示,最后将三个差值的平方相加即为 Eloocv(linear) E l o o c v ( l i n e a r ) 的值如下:

      Eloocv(linear)=13(e1+e2+e3) E l o o c v ( l i n e a r ) = 1 3 ( e 1 + e 2 + e 3 )


      这里写图片描述

      对于常数模型,即利用两个数据点 y y 值的均值作为最终回归的模型。同样使用上面的方法可以得到Eloocv(constant)的值如下:

      Eloocv(constant)=13(e1+e2+e3) E l o o c v ( c o n s t a n t ) = 1 3 ( e 1 + e 2 + e 3 )


      这里写图片描述

      通过比较可以看出 Eloocv(linear)>Eloocv(constant) E l o o c v ( l i n e a r ) > E l o o c v ( c o n s t a n t ) ,所以对于只有三个样本点的学习问题来说,线性模型可能已经太复杂了, 而使用简单的常数模型就能得到最好的效果。

      3.2 - Theoretical Guarantee of leave-one-out estimation

      我们来看看从理论上可不可以证明 Eloocv(H,A) E l o o c v ( H , A ) 能够代表 Eout(g) E o u t ( g ) 的好坏。经过推导我们可以得出的结论是:大概可以。

      εDEloocv(H,A)=εD1Nn=1Nen=1Nn=1NεDen=1Nn=1NεDn ε(xn,yn)err(gn(xn),yn)=1Nn=1NεDn Eout(gn)=1Nn=1NEout¯¯¯¯¯¯¯¯¯(N1)=Eout¯¯¯¯¯¯¯¯¯(N1)=Eout¯¯¯¯¯¯¯¯¯(g)(1)(2)(3)(4)(5)(6)(7) (1) ε D ⁡ E l o o c v ( H , A ) = ε D ⁡ 1 N ∑ n = 1 N e n (2) = 1 N ∑ n = 1 N ε D ⁡ e n (3) = 1 N ∑ n = 1 N ε D n ⁡   ε ( x n , y n ) ⁡ e r r ( g n − ( x n ) , y n ) (4) = 1 N ∑ n = 1 N ε D n ⁡   E o u t ( g n − ) (5) = 1 N ∑ n = 1 N E o u t ¯ ( N − 1 ) (6) = E o u t ¯ ( N − 1 ) (7) = E o u t ¯ ( g − )

      εDEloocv(H,A) ε D ⁡ E l o o c v ( H , A ) 表明在各种各样不同的 D D 上计算 Eloocv E l o o c v 的期望。 Eout¯¯¯¯¯¯¯¯¯(N1) E o u t ¯ ( N − 1 ) 表明在不同的资料 D D 上使用其中的 N1 N − 1 笔资料得到的 g g − 的期望。

      3.3 - Leave-one-out cross validation in practice

      接下来从一个实际的例子当中看看 Eloocv E l o o c v 的表现。假设我们要解决一个简单熟悉的问题:判别手写数字是否是 1 1 。首先从原始的像素数据进行特征的抽取,利用其对称性像素密度作为两个特征,得到数据的分布如图所示:


      这里写图片描述

      为了得到更好的分类效果,通常我们会利用对称性像素密度来做特征转换,这时就需要决定要使用几次的多项式特征转换或者说使用几个特征。如下图,如果根据Ein来决定,会看到当使用的特征越多的时候, Error E r r o r 越小;如果使用 Eout E o u t 来决定,会看到当使用 10 10 15 15 个特征的时候,有最小的 Error E r r o r 值;使用 Eloocv E l o o c v 得到了和 Eout E o u t 很相近的结果。


      这里写图片描述

      下图分别为在使用 Ein E i n Eloocv E l o o c v 作为依据,选择了最好的特征转换之后算法给出的分类边界。可以看到使用 Eloocv E l o o c v 得到了更加平滑的边界。


      这里写图片描述

      所以我们可以简单的总结说,使用 Eloocv E l o o c v Ein E i n 更有用。

      4 - k-折交叉验证(V-Fold Cross Validation)

      当对一笔有 1000 1000 个样本点的数据计算其 Eloocv E l o o c v 的时候,每一笔要用来计算 en e n ,其余的 999 999 笔要用来训练模型,这样的过程要重复 1000 1000 次。所以在实际的应用中如果想要利用 leave-one-out cross validation leave-one-out cross validation 来进行模型的选择 ,计算 Eloocv E l o o c v 是非常耗时的。

      4.1 - V-fold cross validation

      假设原始的资料 D D 的大小为 N N leave-one-out cross validation可以看成将这些资料切成了 N N 笔,每一次留一笔作为validation set,其余的作为 training set training set 。这是计算 Eloocv E l o o c v 非常耗时的主要来源。如果我们只将原始的资料切成 V V 份,同样每一份依次作为validation set,其余的 V1 V − 1 份数据作为 training set training set ,这样既能减少计算量,同时也能到达和 leave-one-out cross validation leave-one-out cross validation 类似的效果。


      这里写图片描述

      Eloocv E l o o c v 的计算方法相同,可以得到在这样划分下的 Ecv E c v

      Ecv(H,A)=1Vv=1VE(v)val(gv) E c v ( H , A ) = 1 V ∑ v = 1 V E v a l ( v ) ( g v − )

      这样的方式称为 V-fold cross validation V-fold cross validation ,可以看到 leave-one-out cross validation leave-one-out cross validation V-fold cross validation V-fold cross validation 的一种特殊情况。通常 V V 的设定为10

      4.2 - Final words on validation

      在计算力允许的情况下,使用 leave-one-out cross validation leave-one-out cross validation 会得到比 V-fold cross validation V-fold cross validation 更好的结果。如果使用 5 fold 5   f o l d 或者 10 fold 10   f o l d 已经得到了不错的结果,通常不会再使用 leave-one-out cross validation leave-one-out cross validation 。最后非常需要注意的是, validation error v a l i d a t i o n   e r r o r 的结果比起真正的 test error t e s t   e r r o r 的结果通常要乐观的多。

      5 - Summary

      本篇介绍了 validation v a l i d a t i o n 这个用来做模型选择和超参数选择的重要工具。因为如果用 Ein E i n 来进行模型的选择有非常大的过拟合风险, 使用 Etest E t e s t 是不切实际的。之后介绍了 leave-one-out cross validation leave-one-out cross validation ,这个方法是好处是在理论上保证了 Eloocv E l o o c v Eout E o u t 不会有太大的差异,但是由于其计算非常的耗费计算资源,所以在实际的应用中通常使用的方法是 V-fold cross validation V-fold cross validation

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值