过拟合与欠拟合

在ml模型的学习过程中,算法本身还是在偏差和方差上做权衡

欠拟合: 不能很好的拟合数据, 训练集上很差
过拟合: 训练集上表现好,测试集上表现差
方差: Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。反应预测的波动情况。
偏差: Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,即算法本身的拟合能力

一般来说,复杂的模型有着更低的偏差,预测更精准,但是其方差会相应的变大。
在常见的一些算法系列中,

  • Bagging系通过有放回的抽样来训练模型,由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和variance。所以是降低模型的variance. Bagging 比如Random Forest 这种先天并行的算法都有这个效果,但是,在随机森林算法中,我们限制了每次分割的变量数量——也就是说,我们限制了用来解释数据的变量数量,所以,每棵树都有较高的偏差。
  • Boosting 则是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行加权,所以随着迭代不断进行,误差会越来越小,所以模型的 bias 会不断降低,方差会变高。

欠拟合对应着高偏差, 过拟合对应着高方差

\[Error = Bias^2 + Variance+Noise \]

判断方法: 我们可以通过交叉验证, 来判断模型的偏差与方差情况: 我们计算没一折交叉验证时候, 模型的偏差和方差,
然后分析模型究竟是高偏差呢还是高方差. 如果有时候模型性能好, 有时候又不好, 那么可以断定, 出现了高方差的情况

过拟合调整思路:

一般来说,模型出现过拟合很有可能是数据太小,其次是验证集和训练集分布不一致,再或者,验证集和训练集的数据预处理方式不一致。其次后面才更大可能是模型过于复杂,模型结构存在问题等原因。
遇到过拟合的时候,一般有以下几种处理策略

  1. earlystopping

early stopping非常的有用,但如果没两个epoch就overfitting了,那就比较麻烦了

  1. 正则化(L1,L2)

DL里主要就是在隐藏层对神经元之间的权重做L1 和 L2了,L1导致稀疏向量,L2权重衰减.
也有XGB的loss加正则控制模型复杂度以控制结构风险,线性模型+L1=Lasso, 线性model+L2=Righe regression,线性model+L1+L2=Elestic Net

  1. dropout
  2. 减小树的数量
  3. 增加样本量, 剔除无用特征,增加有用特征
  4. 多模型融合

DL里,其实drop out已经有了模型融合的味道在里面了,比较每次train的时候,被drop掉的neural连接都是随机的。从被drop掉的角度来看,和L1也有的拼

  1. baggin思路
  2. 批规范化(batch normalization)

bn更多时候是为了防止梯度消失而提出的,但发现也有能缓解over fitting

  1. weight decay 权重衰减

其实很多时候L2也叫做weight decay,但是这里说的weight decay和L2最大的区别就是:它对梯度较大的变量进行正则化
具体的可以参看这篇文章Decoupled Weight Decay Regularization

  1. 训练途中反向做梯度上升

这是2020年ICML的一篇工作,代码就只有一行。意识就是当出现过拟合的时候,对损失函数加上一个超参b,使其做方向梯度上升,这时候神奇的发现,val loss做了2次梯度下降


不过实操一遍发现,好像也不是那么回事,也许是我任务的原因。
文章链接:Do We Need Zero Training Loss Per Achieving Zero Training Error

欠拟合调整思路:

  1. 增加样本量,增加特征,特征离散化
  2. 增加模型的复杂度
  3. 减小正则化
  4. 使用非线性模型,比如核SVM 、决策树、深度学习等模型
posted @ 2020-09-05 23:00  real-zhouyc  阅读(448)  评论(0编辑  收藏  举报