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

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

24 个回答

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方法

1. regularization:L2用的最多,L1也有用的。

2. dropout:一大利器。

3. early stop:结合cross validation使用。

4. cross validation:当数据量较小的时候,应该是用来减轻 overfitting 最好的方式了吧。

5. 当然,尽可能的扩大 training dataset 才是王道。

6. 在训练之前记得 shuffle 一下数据集,一般是每次训练一个 epoch(就是把 training dataset 训练了一遍)后就 shuffle 一次,但是对于较大的数据集可以只 shuffle 一次,虽然这样会使得训练在第二个 epoch 就变得 biased,但是带来的好处可以 overcome 这种缺陷。


更新:

7. data augmentation