本文首发自集智专栏编程
过拟合多是机器学习中最烦人的问题。下面咱们就谈谈什么是过拟合?怎么发现过拟合?以及防止出现过拟合的6种方法。网络
过拟合是指模型为了获得一致假设而使假设变得过于严格,也就是说模型对训练数据的学习有点过头。模型并无学习数据的总体分布,而是学习了每一个数据点的预期输出。机器学习
这就比如你在作数学题的时候,你只记准了某些特定问题的答案是什么,但不知道解题的公式。这就形成模型没法泛化。如同一我的在他熟悉的领域畅通无阻,而一旦迈出这个领域就不知所措了。函数
过拟合问题比较棘手的是,猛一看好像模型的性能很好,由于它在训练数据上出现的错误很小。然而,一旦让模型去预测新的数据,它就掉链子了。post
如上所说,过拟合的一个典型特征就是模型不能泛化。若是想测试模型是否具备泛化能力,一个简单的方法就是将数据集分红两部分:训练集和测试集。性能
实际上分红三部分效果会更好:60%的训练数据集,20%的测试数据集和20%的验证数据集。学习
经过分割数据集,咱们能够用每一个数据集去检验模型的性能,以深刻了解模型的训练过程,找出何时发生了过拟合。下图展现了不一样的状况。测试
注意,若是想让这种方法凑效,你须要确保每一个数据集都能表明你的数据。一个比较好的实践方法是分割数据集以前先打乱(shuffle)数据集的顺序。人工智能
过拟合虽然很难缠,可是也有一些方法能让咱们预防,下面分别从3个角度分享6种防止过拟合的方法。cdn
首先,咱们能够试着查看整个系统的各个组件寻找解决方法,也就是说改变咱们所用的数据。
1 获取更多数据
你的模型能够存储不少不少的信息,这意味着你输入模型的训练数据越多,模型就越不可能发生过拟合。缘由是随着你添加更多数据,模型会没法过拟合全部的数据样本,被迫产生泛化以取得进步。 收集更多的数据样本应该是全部数据科学任务的第一步,数据越多会让模型的准确率更高,这样也就能下降发生过拟合的几率。
收集更多的数据会比较耗时耗力。若是没有时间和精力作这个,应该尝试让你的数据看起来更多元化一些。利用数据加强的方法能够作到这一点,这样模型每次处理样本的时候,都会以不一样于前一次的角度看待样本。这就提升了模型从每一个样本中学习参数的难度。
关于数据加强的方法,参见集智的这篇回答
另外一个好方法是增长噪声数据:
注意:在这两种状况中,你须要确保噪声数据的量级不能过大。不然最后你获取的输入信息都是来自噪声数据,或者致使模型的输出不正确。这两种状况也都会对模型的训练过程带来必定干扰。
即时你如今手中获取了全部须要的数据,若是你的模型仍然过拟合训练数据集,多是由于模型过于强大。那么你能够试着下降模型的复杂程度。
如前所述,模型只能过拟合部分数据。经过不断下降模型的复杂度(好比随机森林中的估计量,神经网络中的参数),最终达到一个平衡状态:模型足够简单到不产生过拟合,又足够复杂到能从数据中学习。这样操做时一个比较方便的方法是根据模型的复杂程度查看模型在全部数据集上的偏差。
简化模型的另外一个好处是能让模型更轻便,训练速度更快,运行速度也会更快。
模型出现过拟合的第二个地方多是在训练阶段,应对方法包括调整损失函数或训练过程当中模型运行的方式。
大部分状况下,模型会首先学习数据的正确分布,而后在某个时间点上开始对数据过拟合。经过识别模型是从哪些地方开始发生转变的,那么就能够在过拟合出现以前中止模型的学习过程。和前面同样,经过查看随着时间推移的训练错误,就能够作到这一点。
正则化是指约束模型的学习以减小过拟合的过程。它能够有多种形式,下面咱们看看部分形式。
L1和L2正则化
正则化的一个最强大最知名的特性就是能向损失函数增长“惩罚项”(penalty)。所谓『惩罚』是指对损失函数中的某些参数作一些限制。最多见的惩罚项是L1和L2:
对于线性回归模型,使用L1正则化的模型建叫作Lasso回归,使用L2正则化的模型叫作Ridge回归(岭回归)。下图是Python中Lasso回归的损失函数,等式中加号后面一项α||w||1即为L1正则化项。
下图是Python中Ridge回归的损失函数,等式中加号后面一项α||w||22即为L2正则化项。
通常回归分析中回归w表示特征的系数,从上面等式能够看到正则化项是对系数作了处理(限制)。
结合等式,咱们能够作出以下说明:
有了惩罚项之后,模型就被迫对其权重作出妥协,由于它不能再任意让权重变大。这样就能让模型更泛化,从而帮助咱们对抗过拟合。
L1惩罚项另外一个优势是它能进行特征选择,也就是说它可让一部分无用特征的系数缩小到0,从而帮助模型找出数据集中最相关的特征。缺点就是一般它在计算上不如L2惩罚项高效。
下面是权重矩阵的情形。注意L1矩阵是稀疏的权值矩阵,有不少0值,而L2矩阵则有相对较小的权值。
除了利用L1正则化和L2正则化防止模型过拟合以外,在训练阶段向参数中添加噪声数据也能促进模型的泛化。
对于深度学习模型中的过拟合问题,咱们能够从两个角度出发:Dropout和Dropconnect。 因为深度学习依赖神经网络处理从一个层到下一个层的信息,于是从这两方面着手比较有效。其理念就是在训练中随机让神经元无效(即dropout)或让网络中的链接无效(即dropconnect)。
这样就让神经网络变得冗长和重复,由于它没法再依赖具体的神经元或链接来提取具体的特征。等完成模型训练后,全部的神经元和链接会被保存下来。试验显示这种方法能起到和神经网络集成方法同样的效果,能够帮助模型泛化,这样就能减小过拟合的问题。
过拟合是咱们在训练机器学习模型过程当中遇到的一个大问题,若是不知道怎么应对,确实会让人很头疼。借助前面提到的这些方法,相信应该能帮你在训练机器学习模型过程当中有效的防止模型过拟合。
参考资料:戳这里
0806期《人工智能-从零开始到精通》限时折扣中!
谈笑风生 在线编程 了解一下?
(前25位同窗还可领取¥200优惠券哦)