在机器学习中,当一个算法的预测非常接近或者直接等于它的训练数据,导致不能够准确预测除了训练数据以外的数据,我们把这种情况称为过度拟合。算法能够非常接近甚至就是训练的数据,是个非常好的事,但是它不能准确预测除了训练数据以外的数据就很糟糕了,这就也失去了机器学习模型的作用。
机器学习算法在构造时,它会利用一些样本数据来训练模型。但是当模型在这些样本数据上训练得太久或当这个模型太过复杂,它就会开始学习一些数据集中的“噪音”或不相关的信息。那么当这个模型记住了这些“噪音”,又拟合得太接近训练集,这个模型就会变得过度拟合。这样得到的模型就不能够很好地概括新数据,不能够很好地概括新数据就不能够很好地执行分类和预测任务。模型过度拟合的根本原因是训练的数据集中有噪音且被模型记住并反映到了权重上。也就是说训练数据集中那些不相关的信息,甚至是错误地信息,被模型记住了,并拟合到模型函数上,且拟合得非常好,很接近训练数据集。这些“噪音”就是汤里掉进了一粒老鼠屎,搅臭一煲汤。
那我们有什么办法可以提前发现模型是否存在过度拟合呢?答案是有的。低误差率和高方差都是存在过度拟合的信号。当我们的模型出现低误差率或存在高方差时,我们就要考虑模型是否存在过度拟合的问题。
如何避免模型过度拟合呢?
为了避免模型过度拟合,通常不会把整个数据集都给模型去训练,而是留出一部分数据集作为测试集来检查模型是否存在过度拟合。 过度拟合的模型对新的(没有见过的)数据的分类或预测的准确性是很差的。利用这一点,我们就可以用测试集来检验模型是否存在过度拟合的情况。如果模型对训练数据集已能够达到比较低的误差率,而对测试集的数据去表现高误差率,那么模型可能存在过度拟合的问题。
过度训练也可能导致模型过度拟合,如果是这种情况,可以早一些结束模型的训练来避免模型过度拟合。那么具体该什么时候结束训练呢?停止训练过早或排除太多重要的数据都会使模型适得其反。当训练时间太短或训练数据相关性不够(即数据对模型来说不够重要,用不重要的数据来训练会导致输入与输出的相关性变得很差,就是生搬硬套的东西),就会发生欠拟合。
另外,如果模型太复杂也会导致过度拟合的问题,要解决这个问题可以通过排除那些不太相关或相关性很低的输入来解决,简单来说就是排除不重要的数据,以此来减少模型的复杂性。
欠拟合与过度拟合一样对于未见的数据的泛化都很差。前面我们说过过度拟合的预测表现出低误差率、高方差,而在欠拟合的预测则表现出高偏差、低方差。随着模型的学习的持续进行,它的偏差就慢慢减小,当模型变得过度拟合,方差就会随之变高。模型的训练会从欠拟合转移到过度拟合,我们必须权衡偏差与方差之间的取舍,即我们的目的是要找到模型在欠拟合与过度拟合之间那个最佳的点,在这个点上偏差方差都是可以接受的。这样的模型在数据集就建立某种主导趋势,也因此模型得以应用到更广泛的新数据上,即泛化能力更好。
怎样做才能够了解模型的准确性呢?怎样才能知道模型拟合是否适度?K-fold交叉验证是目前用来评价模型准确性最多的方法之一。具体的做法就是把训练数据集分成K个大小相等的子集,这些子集在这个方法中被称为fold,拿出一个fold来扮演测试集,也叫抵抗组(holdout set)或验证集(validation set),剩下的子集都用来训练模型,重复这个过程,都到每个子集都扮演过一次测试集。每一轮都会得到一个分数,当进行完所有轮后,对分数进行平均,用这个平均分来评价整个模型的性能。
我们再来回顾一下如何避免过度拟合的问题?现实世界很多问题都不是简单的线性关系,虽然我们常常使用线性模型来帮助我们避免过度拟合的问题。总结一下解决拟合问题的方法大概有以下这些:
-
提前停止训练:这样做的原因正如前已经提到过那样,因为训练数据中有“噪音”,提前停止,就可以避免模型学习了太多“噪音”数据,如果停止适当,还有可能直接避免了噪音数据被模型学习到。不过要注意,想法虽好,但是如果停止太早导致模型训练不足,造成欠拟合,停止太晚,导致模型学习了太多噪音数据,造成过度拟合,所以这种方法,我们就要在欠拟合和过度拟合之间做出权衡,以期在找到一个处于两者之间的最佳的权衡点,这个点就是使用这种方式解决拟合问题要找的。
-
使用更多的数据来训练模型: 这一点无可质疑,只要保证训练数据是非常干净,相关的,没有什么噪音的,否则只会让模型变得复杂,甚至导致过度拟合。
-
数据扩充:训练数据是干净又相关的,这当然是最好的,其实适时加入一些噪音数据,据说可以让模型更加稳定,这样的操作要有所节制,否则还是出现过拟合的问题。
-
特征选择:在构建一个模型时,会有很多特征供我们选择,用来预测特定的结果,很多时候这些特征有很多都是彼此重复的,识别并选择出最重要的那么特征,排除无关的,冗余的特征是很重要的。这听起来是不是很像在做降维的事?不过它们是不一样的,前者是要把无关的,重复的排除掉,后者则是为了减少特征的数量,但是这些特征是相关的,不重复的。但是两者的目的都是为了简化模型,使其在训练数据集建立起主导趋势。
-
正则化:当模型过于复杂导致出现了过度拟合,我们可以通过减少特征的数量来解决。如果我们不知道哪些特征应该去掉,那些应该留下?那么下正则化这个工具就派上用场了。具体的做法:正则化对系数较大的输入参数施加惩罚,这将会限制模型中的方差。正则化方法有很多,如套索正规化(lasso regularization)、岭回归(ridge regression)、dropout。虽然有这么多正则化方法,但是它们都用于识别和减少数据中的噪声。
-
集成方法:一种机器学习技术,通过组合多个模型的预测结果来提高预测准确性和稳定性。集成学习方法由一组分级器组成。集成学习方法的例子有:
决策树——它们的预测是聚合在一起决定最优结果的。
袋装法与推升法—— 袋装法它会从训练数据集中随机选择一个样本集合。每个数据点被选中的机会是相等的,都可以被重复选择。在选择出若干个这样的样本集合后,模型用这些样本集合单独训练。结果取决于任务的类型,如果任务是回归问题,那么就取这些预测值的平均值,产生一个更加准确的预估值,如果是分类问题,就取这些预测值的大多数。