从事机器学习工作的同学们,对这两个名词和概念应该是再熟悉不过了,因为我们每天都要跟过拟合和欠拟合作斗争,只有打败了它们,我们的模型才能在实际应用中有好的表现。
So,遇到欠拟合或者过拟合时应该怎么办?小编我在与欠拟合和过拟合斗智斗勇的过程中,学习和总结到了一些方法,拿来跟大家分享一下,相信能为你打怪升级增加一个不错的装备~
无论是过拟合还是欠拟合,归结原因不外乎数据和模型两个方面。注意哦,是数据和模型两个方面哦,两个方面哦,不是一个方面哦!之所以这么矫情地强调有两个方面,是因为很多刚开始做这方面工作的同学,会容易执着于模型,而忽略数据。比如遇到欠拟合时经常单方面地考虑模型是不是太简单不够复杂,而忽略了数据集本身可能就不能收敛或者准确率不高,一味地增加模型复杂度,却始终不能提高准确率,或者掉入了过拟合的坑。
下面从数据和模型两个方面来说下欠拟合和过拟合产生的原因以及该怎么解决。
先说欠拟合,出现欠拟合的原因,通常有以下几个:
1. 模型过于简单,不能拟合数据中的规律;
2. 数据集中有过多错误数据,造成干扰;
3. 数据集中没有或者缺少能让模型有效学习规律的特征。
针对这几种情况,我们可以采取以下几种方法来解决欠拟合问题:
1. 增加模型复杂度,让模型能够拟合更加复杂的规律,但这里应该注意,不要一味的增加模型复杂度,这会容易导致过拟合。
2. 检查数据集,修复或删除错误或异常数据,这样可以提高模型可达到的准确率。毕竟,你知道的,这句至理名言:数据决定最终的准确率,模型只是尽力去逼近这个值。
3. 增加数据的特征维度,添加一些新的特征,或者加入一些二次项或三次项这样的多项式特征。这样为模型提供更多特征,可以帮助模型更好地学习规律。
解决了欠拟合,对模型进行测试,结果发现模型准确率在测试集和验证集上差距很大,没错,过拟合又来找麻烦了,小伙伴们是不是心好累的感觉。不用怕,我们有办法!
过拟合出现的原因主要有以下几个:
1. 模型过于复杂,学习到噪声数据,导致泛化能力差;
2. 训练数据较少,或分布不均衡,导致训练集数据不能涵盖真实数据的多样性,从而导致模型学习不到全局特征;
3. 训练数据中有不合适的特征,导致模型学习了错误的特征。比如在特征中有唯一标识的编号信息,这很容易误导模型,通过编号记住答案。
4. 训练时间过长,这可能导致某些权重值变大,使得模型在验证集上的性能下降。
针对过拟合,我们可以采取下面几种方法来改善:
1. 检查模型是否过于复杂,实际上,模型应该尽可能简单,过于复杂的模型,容易过拟合,而且即使没有造成严重的过拟合也违反了奥卡姆剃刀定律。
2.增加训练数据,这通常都会或多或少地提高模型的泛化能力,在数据量较少的时候,效果更加明显。如果获取更多数据有难度,那可以进行数据扩增,通过对现有数据进行适当修改来达到增加数据的目的。
3. 在训练数据中适当加入噪声,这可以让模型更稳定。
4. 检查数据,查看是否有类似于唯一编码这样不合理的特征存在。
5. 使用正则化,建议使用L2正则化,对权重值进行约束,这样可以防止网络出现一些过大的权重值。
6. 使用dropout,这也是一种正则化方法。在训练过程中,随机抛弃某些节点,使模型输出不依赖于某些特定节点,提高模型鲁棒性,而且dropout还可以提升模型表现效果。当然,测试过程中,你不需要dropout。
7. 早停法。训练过程中监测验证集上的准确率,当准确率到达一定高度后开始下降时停止训练,这还可以帮你节省训练时间。早停法也是一种正则化的方法,它将模型能力限制在一定范围内。
你是不是从这些改善欠拟合和过拟合的方法里找到了适合你的方法,并已经跃跃欲试了呢,大胆去尝试吧,相信你会得到一个好结果。
最后一点总结,影响模型效果的因素有很多,当然你可以尝试调整各种超参数和优化方法来看看哪些参数效果更好,但这些对于模型效果的提升可能是比较有限的。最有效提升模型效果的方法是从数据入手,其次是模型,再次是超参。还是那句话,最重要的是数据!数据!数据!
领取专属 10元无门槛券
私享最新 技术干货