机器学习笔记2——模型评估与选择(一)

一、Doudog的困惑

现在我要启动把doudog训练成“老司机”的任务。

我每天带着doudog在计算机学院的教室里转,遇到一个女孩就告诉它这是不是女神,经过几天的训练,doudog的模型已经能够准确识别出所有计算机学院的女神了,即错误率(error rate)为0,精度(accuracy)为100%。

我很高兴,于是带着它到校园里走走,测试一下这几天的学习效果。

校园里女生更多了,但doudog只要遇到计算机学院的女生可以准确判断出女神,遇到其他学院的女生精度就下降了,尤其对外语和艺术学院女生的精度十分糟糕。等我把它带出学校到熙熙攘攘的大街上,这只狗狗已经开始乱咬人了。

Doudog走出计算机学院为什么就“瞎”了呢,这里面就涉及到模型的评估与选择问题。

二、经验误差与过拟合

为了搞清这个问题,需要先了解几个概念:

1、训练误差(training error)或经验误差(empirical error)

顾名思义,就是在训练集上的误差,doudog的训练集是计算机学院的女生,因为它能够十分准确识别,所以它的训练误差就是0。由于它是通过计算机学院的女生来积累识别女神的经验,因此也叫作经验误差。

2、泛化误差(generalization error)

在新样本即训练集以外样本上的误差,doudog的泛化误差明显过高,还没出校园就“瞎”了。

3、过拟合(overfitting)、欠拟合(underfitting)

由于Doudog对计算机学院女生太了解,把计算机学院理工科女生的一些特点也当做了女神的一般特征,于是遇到艺术学院的女神就可能有眼不识泰山,这就叫做过拟合。

如果与之相反,doudog在计算机学院没学好,把教学楼门口的雕塑当做女神膜拜,这就叫做“欠拟合”。

过拟合是机器学习的关键障碍,无法彻底避免,而欠拟合则可以通过增加训练次数、扩展分支等方式克服。

我现在大概明白doudog“瞎了狗眼”的原因了,因为它对训练集学习的太好,“过拟合”了,而且训练集太小。就像一只从小地方走出来的狗狗到了大城市,不瞎才怪。

三、常用模型评估方法

既然doudog的模型有问题,那么就要进行改进优化,这就涉及到模型的评估方法。

我希望doudog的“泛化误差”最小,但是我不可能事先让它认识所有的人,因此实际上不可能直接得到泛化误差。我只能在校园内找到一些女生来对它进行训练和测试,然后把测试误差作为泛化误差的近似,以此来进行评估。

首先,训练集和测试集的重合部分要尽可能小,否则测试就没有意义,犹如老师考试出题不能都是课堂练习题。

假设找到了1000名女生,这就是一个包含1000个样例的数据集D={(x1, y1), (x2, y2), … , (x1000, y1000)},其中x代表女生,y代表是否是女神,即x的标记信息。数据集D既要训练,又要测试,就要对它进行适当的处理,从中产生出训练集S和测试集T,常用三种方法。

1、留出法(hold-out)

直接把1000名学生D划分为互不重合的两拨人,一拨作为训练集S,另一拨作为测试集T。S和T的大小没有黄金标准,一般2/3~4/5作为训练,剩余用于测试。

假设用700人做训练集,300人做测试集,

在划分时,要进行“分层采样”(stratified sampling),比如要让训练集和测试集中女神的占比相近、各学院学生的占比相近、来自各学院女神的占比也相近等。这样可以避免因划分而引入额外的偏差,影响最终结果。

但即使分层采样,训练集和测试集中分布的女神不一样,结果可能也会不一样,比如把校花放到训练集的评估结果可能和放到测试集的评估结果是不一样的。因此,单次留出法划分的结果往往不够稳定可靠,

那就要使用留出法多次随机划分,然后在进行重复试验评估,最后取平均值,作为最终的评估结果。

2、交叉验证法(cross validation)

把1000个学生分成10组,每组100人,每组的学生都通过分层采样得到。

如果选择其中的1组学生作为测试集,剩余的9组(10-1)学生合并一起做为训练集,这样就有10种组合方法,可以进行10次训练和测试,获得10个测试结果,这些结果的均值就是最终评估结果。这种方法就叫做10折交叉验证法。

当然也可以根据需要分成5组、20组、k组,分别进行5次、20次和k次训练/测试,通称k折交叉验证(k-fold cross validation)。

与留出法一样,k折交叉验证法在分组的时候也存在因样本划分不同而引入的差别,因此k折交叉验证通常也要随机使用不同的划分方法重复多次,最后取多次k折交叉验证结果的均值。

上述10折交叉验证法重复10次就叫做10次10折交叉验证法,实际上是进行了10*10=100次训练/测试。

重复p次叫做p次k折交叉验证。实际上进行了p*k次训练/测试。

考虑到一个极端情况,如果把1000个学生,分成1000组(k=1000),每组1个人,这就是交叉验证法的一个特例——留一法(Leave-One-Out, LOO)

留一法的好处有两个:一是它只有唯一的划分方式,即1000组、每组1人,显然不受样本划分方式的影响;二是它的训练集有1000-1=999个样本,只比整个数据集D少了一个样本,这样训练出来的模型与用D训练出的模型最接近。评估结果更准确。

留一法的缺陷也有两个:一是计算的开销比较大,1000个学生就要进行1000次训练/测试,如果有100万个样本或更多,计算开销无法忍受;二是根据“没有免费的午餐”定理,留一法的未必永远都比其他方法准确。

3、自助法(bootstrapping)

在上述两种方法中,或多或少都保留了一部分样本用于测试,我们评估的模型是使用700个女生训练出来的,而不是用1000个,这必然会带来因训练样本规模不同而导致的估计偏差。留一法虽然影响较小,但计算成本太高。

自助法可以较好的解决这个问题:

给D中的1000个学生分配从1-1000的号码,然后随机叫号,被叫到号的在黑板上依次写下自己的号码,重复执行1000次之后,黑板上得到了1000个号码,显然这其中有一些号码多次出现。把这些号码对应的学生放入D'作为训练集,号码多次出现的则需要“复制人”。没叫到号的学生作为测试集。

这样训练集S与数据集D都具有相同的样本数量,实际评估的模型与期望评估的模型训练样本数一样,同时我们还有一定比例(大约1/3)的样本用于测试。这种测试结果,也称作“包外估计”(out-of-bag estimate)。

上述1/3的计算方法是:假设D中有m个样本,样本经过m次采样后没被采到的概率是1-1/m的m次方,m趋向无穷时求极限,得到始终没被叫到号的概率约为0.368。

在数据集较小,难以有效划分训练/测试集时一般使用自助法。

在数据集足够时,一般使用留出法和交叉验证法。

四、调参与最终模型

在进行模型评估与选择时,还要对参数进行设定,即参数条件,简称调参(parameter tuning)。

调参与软件的架构思想一样,需要在诸多因素中取舍平衡。

如果对每种参数配置都训练出模型来,计算的开销可能将无法忍受,但调参往往对最终模型性能有关键影响,因此要在计算开销和性能估计之间折中。

一般采取的方法是对每个参数选定一个范围和变化步长,比如在[0, 0.2]的范围内以0.05为步长,这样实际要评估的候选参数值只有0,0.05,0.1,0.15和0.2共5个。

由于在模型评估过程中,对数据集D只使用了其中一部分数据训练模型,剩余一部分用作测试。因此在模型选择完成后,学习算法和参数配置已选定,应该用数据集D对模型进行重新训练,得到最终模型。


本文为学习思考笔记,难免有错误和不准确之处,欢迎吐糟、探讨。

原创声明:“机器学习笔记”系列文章为本人(李博 blog.xzlib.com学习《机器学习》(周志华著,清华大学出版社)一书过程中的笔记,内容均为本人结合书中讲述和自身理解所写,文章配图、视频均为本人原创,转载和引用请注明出处并不得篡改作者姓名,本人保留《中华人民共和国著作权法》赋予的所有权利。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值