scikit_learn学习笔记七——机器学习里的过拟合与欠拟合及解决方案

欠拟合与过拟合

scikit_learn学习笔记七——机器学习里的过拟合与欠拟合及解决方案_第1张图片
图片来自百度

欠拟合 Underfit

在训练数据和未知数据上表现都很差,高偏差。

解决方法:

1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。

2)添加多项式特征,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。例如上面的图片的例子。

3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。

过拟合 Overfit

在训练数据上表现良好,在未知数据上表现差。高方差。

通俗一点地来说过拟合就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力太差

文章前面的图表示size和prize的关系,过拟合学习到的模型曲线如右图所示,虽然在训练的时候模型可以很好地匹配数据,但是很显然过度扭曲了曲线,不是真实的size与prize曲线。

解决方法:

1)重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。

2)增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。

3)采用正则化方法

正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对余的范数。但是在机器学习中一般使用L2正则。

  • L1范数是指向量中各个元素绝对值之和,也叫“稀疏规则算子”(Lasso regularization)。
  • L2范数是指向量各元素的平方和然后求平方根。

    L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀),不会过分拟合训练数据,从而使得不会过拟合,以提高模型的泛化能力。

4)采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。

scikit_learn学习笔记七——机器学习里的过拟合与欠拟合及解决方案_第2张图片
dropout.png

【总结】模型过拟合说到底还是因为数据跟模型的参数不匹配,所以防止模型过拟合的方法大概可以分为四大类:数据方面、模型方面、损失函数、训练技巧方面。

  1. 数据方面:准备大量的数据,还可以用数据增强的方式产生大量数据;
  2. 模型方面:(1)设计合适的模型,(2)选择预训练模型进行微调;(3)在模型的中间使用BN层;(4)在模型的fc层处使用dropout;
  3. 损失函数方面:通过在损失函数上添加正则项,要控制w的快速衰减,所以有L1、L2正则的方法;
  4. 训练技巧方面:(1)因为在训练时,训练误差是一直减小的,而测试误差是先减小再增大,所以在合适的时间(测试误差最小)停止训练;(2)bagging和其他集成方法

[附] 【后续来优化完善】

验证曲线诊断过拟合和欠拟合

通过验证曲线判定过拟合与欠拟合。
验证曲线是一种通过定位过拟合与欠拟合等诸多问题的方法,帮助提高模型性能的有效工具。
验证曲线绘制的是准确率与模型参数之间的关系。

  • from sklearn.model_selection import learning_curve #加载学习曲线
  • from sklearn.model_selection import validation_curve #加载验证曲线
  1. learning_curve():这个函数主要是用来判断(可视化)模型是否过拟合的。
  2. validation_curve():这个函数主要是用来查看在参数不同的取值下模型的性能

你可能感兴趣的:(scikit_learn学习笔记七——机器学习里的过拟合与欠拟合及解决方案)