怎样消除机器学习中的过度拟合?

过度拟合是机器学习中影响预测准确率的命门,那么有哪些方法可以行之有效的消除过度拟合呢?另外,这些方法能应用到神经网络中么?
关注者
416
被浏览
20764

20 个回答

The problem of multiple comparison is the underlying reason for overfitting

主要内容:
  1. Overfitting

  2. 判断和防止overfitting 的方式

————————————————————————————————————

过度拟合的模型往往不能进行一般化推广(generalization)


拟合问题需要在两个方面进行权衡



需要注意的是 如果用来训练的数据和测试的数据是同样的,那么这样的检验是没有意义的,就像 "Table Model" 一样


一般我们会将数据集分为training/testing(holdout) 两个部分

注: 在python中可以这样做

from sklearn.cross_validation import train_test_split

Xtrain, Xtest, ytrain, ytest = train_test_split(X, y)


识别 overfitting 的方式

  • Fitting graph(模型误差与模型复杂度的图像)


基于两个模型类型讨论 Overfitting

  1. Tree induction problem
  • 模型的复杂程度与节点的数量相关

2. Numeric model (Mathematical Functions)
  • 变量的数量与模型的复杂度相关
  • 直观的例子:

二维情况下,两个点可以用一条直线拟合

三维情况下,三个点可以用一个平面拟合

……

  • 随着维度的增加,我们可以拟合任意数量的点(模型的参数就会变得很多) 此时很容易过拟合(我们需缩减特征(attributes)数量来防止过拟合)


SVM 与 Logistics Regression 的比较

  • 模型敏感性

SVM对个别样本更不敏感(相对逻辑斯蒂模型)



过度拟合的劣势

  • 一个完全记忆式的模型是无用的,它不能被一般化
  • 当一个模型过度复杂时,它很容易去利用那些看似正确实则无用的(spurious)关系


Overfitting 识别的进一步分析

  • 前面提及的fitting graph 是利用Holdout-Evaluation 的方式来判断,这个只是的单次的检验(single test)
  • 在此基础上,我们得到 Cross-Validation 用来防止过度拟合
  • Cross-Validation 本质上是应用不同split的方式,多次进行Holdout-Evaluation

  • Cross-Validation 原理图

Further idea : Buliding a modeling "labortory"


Learning curves (学习曲线)

  • 模型一般化表现和训练集数量的图像
Logistics regression 和 decision tree 的学习曲线

  • 从图中可以看出,学习曲线初期比较陡,然后,增长速率逐渐放缓,到后期基本平坦了(边际递减)
  • 要合理分析当前自己的数据数量对于使用的模型而言处于哪个水平,依据学习曲线来做出是否继续在数据量上做投资的决策



避免 Tree induction 过拟合的方式

1. 在树过于大之前便停止生长
  • 每个叶中至少需要多少个数据(threshold)
  • 如何判断这个阈值(threshold)是重点【可以考虑用假设检验/P-值】
2 . 等树生长到足够大之后进行修剪
  • 修剪枝叶,直到任何改动都会降低正确率


Nest cross-Validation



  • 对训练数据集进行再划分,以此来优化模型(例如选择参数,选择特征数量(features))
  • Cull the feature set (example: SFS【sequence forward selection】)


★ Regularization (重点)

  • 重点是构造一个带惩罚(penalty)的目标函数,并最优化

  • 扩展:
    1. 将二范数惩罚函数与最小二乘法结合在一起就可以得到岭回归
    2. 将一范数惩罚函数与最小二乘法结合在一起就可以得到lasso方法
我不知道怎么系统的回来问题,就按我的理解从一篇经典文章入手,从一个实例出发。Imagenet Classification with Deep Convolutional Neural Networks, Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. Advances in neural information processing systems. 2012.
在这篇文章中,作者训练了一个有6千万参数的卷积神经网络,非常容易出现过拟合。解决方案:
1.增大训练数据量
2.采用dropout
我觉得第一条是针对神经网络等大数据量模型的最佳方法,可以从本质上解决(减少)过拟合,包括采集真实数据,或者在已有的数据上做各种仿射变化,毕竟过拟合产生的根本原因是模型参数相对训练数据量太多。第二条则是在算法层面去减少过拟合,之前也有叫weight decay的另一技术都是为了使某些神经元值为0,减少相互依赖,可以看成是一种正则化。
另外,推荐问题:机器学习中使用「正则化来防止过拟合」到底是一个什么原理?为什么正则化项就可以防止过拟合?
可以帮助理解正则化。