Datawhale X 李宏毅苹果书 AI夏令营 Task3-机器学习实践方法论

在上一章介绍完机器学习模型后,我们接着讨论模型中可能存在的一些问题。首先我们需要明确一件事,就是Kaggle上的测试结果不好,可能有多个原因。

第一,如果模型在运行训练模型时,所产生的损失就很大,那么有可能是模型偏差(model bias)或优化(optimization)问题。

第二,如果模型在运行训练模型时,所产生的损失较小,但是在测试集上得到的损失却很大,这就大致是过拟合(overfitting)和不匹配(mismatch)的问题。

一、模型偏差

其实简单来说,模型偏差的意思是:把模型设计的太过简单,导致了所计算出的所有函数都无法得到满意的结果,换句话说就是最优化的模型没有找到。比喻以下,在大海里想要捞针,结果针都不在大海里。

大致的解决方法有两个,中心思想都是围绕增加灵活性展开的:增加输入的特征,使用深度学习的方法。

二、优化问题

这个问题我们在第一篇文章里已经有所提及,下面附上一张图方便理解。

机器在进行梯度下降的过程中,只找到了第一个极小值就停下了,并没有找到损失函数最小值所在的那个点。这就好比在大海里捞针,看到了一个形状很像针的物体就停止了寻找。那么,此时可能有个疑问,就是模型损失太大究竟是模型偏差的问题,还是优化问题。下面让我们举个例子来做具体解释。

这是一个深度学习的案例。可以看到,无论是在测试数据还是训练数据上,56层的网络都要比20层网络得到的结果更差。这其实是优化的问题。

在图中,我们可以看到在20层的时候,误差已经十分小了,这就说明模型没有出现偏差,如果出现偏差,则会出现较大的误差。

56层,按道理来说层数更多,应该会得到更好的结果,可反而比20层的结果差。在20层的基础上,即使什么都不做,多余的36层停在那儿,也不应该出现结果变差的情况。所以说,这一定是模型优化的问题。

优化问题的拒绝方法可以是:先找到一些浅的,小的不包含深度学习模型,进行在训练模型上的运行。这些模型较小,所以会在能力范围内,不停遍历寻找,找到最好的一组参数。随后计算损失,观察结果,这样心里就会有底,知道基于浅的模型,深的模型大致会有怎样的结果。接下来还缺一个深的模型,如果深的模型跟浅的模型比起来,深的模型明明灵活性比较大,但损失却没有办法比浅的模型压得更低,这就代表说优化有问题,梯度下降不给力,因此要有一些其它的方法来更好地进行优化。

具体方法有:

1、特征选择与工程,重点关注与预测目标直接相关的特征,进行细粒度刻画和特征交叉组合。

2、模型调优:调整模型参数,如决策树的深度、支持向量机的核函数等。

3、样本处理:处理不平衡数据集,通过上下采样、合成少数类过采样技术等方法平衡样本分布。

4、集成学习:结合多个基学习器的预测结果,通过投票、平均等方式提高整体模型性能。

三、过拟合 

过拟合,简单来说,就是在训练集上的结果较好,但到了测试集上却无法得到好的结果。下图就是个不错的例子。 

在这个案例中,测试数据和训练数据在真实情况下应该分布在一条二次曲线上。但由于模型的能力较强,且模型没有给很大的限制,所以灵活性很大。这就导致了有许多穿过三个蓝色训练数据点的曲线,上图中的曲线在应用到三个黄色的测试数据时产生了较大的损失。总结一下就是模型的自由度太高,导致模型在训练数据上损失小,而在测试数据上损失大,这就是过拟合。

解决过拟合问题有两个基本方法:第一是增加训练集,这个办法往往是最有效的。当数据增多时,机器收到的限制就很大,能够穿过这些数据点的曲线也就变少了。最终形成的曲线应用起来,也能得到不错的效果,如下图。

增加数据集的方法是做数据增强(data augmentation),它并不是引入了额外新的数据,而是我们自己基于对问题的理解对数据进行处理,从而创造出新的数据。

比如说,我们在做猫狗识别的实验中,可以将猫狗的图像截一部分进行放大或缩小,也可以将图片进行左右的反转,这样就可以得到成倍的数据。但是给数据的时候要注意,并不能随意的处理数据,要合理地,给机器能够识别的,符合常理的数据,比如说不能将猫狗的图片上下颠倒。

第二种方法是给模型一些限制,让其少一些灵活性。具体的方法是:给模型比较少的参数,用较少的特征,早停,正则化,丢弃法。

在这里我们还有几个注意事项。在给模型设限制的同时,我们也要注意适度。太多的限制会导致模型偏差的问题。并且当我们选择模型的时候,要选择一个中庸的模型,不能太过复杂,也不能过于简单,太过复杂会出现过拟合的问题,而太过简单,则损失肯定会大,会出现模型偏差的问题,如下图所示。

在Kaggle上上传模型的时候,有公开数据集可供我们测试调整,但不建议调整到在训练集上得到完美结果再上传,因为Kaggle上还有私人数据集,在公开数据集上运行良好,并不代表在私人数据上也能得到较好的结果。虽然在公开数据集上可以得到好的分数,但却在私人数据集上被拉开了差距。

具体的解决方法就要用到交叉验证了,下面让我们详细展开。

四、交叉验证

k折交叉验证(k-fold cross validation)是把训练数据分成k份。举个例子,把训练数据分成3份,其中拿出一份作为验证集,另外两份作为训练集,并且这件事要重复做三遍。比如说,第一回,1号数据做测试集,2、3号做训练集;第二回,2号做测试集,1、3号做训练集;第三回,3号做测试集,1、2号做训练集。

 接着假设我们现在手里有三个模型,我们需要把三个模型按照刚才的方法都运行一遍,从而每个模型都可以得到三个损失,再把三个损失加起来求平均值,平均损失值最小的那个,就是我们选择的最终模型。

五、不匹配

这个问题比较特殊,我们很难通过寻常的手段去调整它,只能靠我们自己对问题的理解,来解决。

正如上图所示,真实数据和预测数据的走向基本吻合,但在2月26号这天,我们发现模型预测出了大问题。原本应该是高峰的值,现在却变成了低谷,这与模型的优化无关,这是不匹配问题。

用今年的数据去预测明年,总会出点错,在今年的2月26日,有可能因为大家都有事,所以平台播放量小,可明年的2月26号有可能大家很空闲,平台播放量就上去了,这样的情况就不能怪机器了,给它再多的数据集,也难以预测出这样的情况。

好了,说到这里,我的机器学习初步阶段就要结束了。之后我也希望自己能够继续学习机器学习的相关知识,并与大家分享,下次再见。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值