【机器学习】过拟合和欠拟合的详细介绍和解决方式

 在讲解过拟合和欠拟合之前,我们需要补充一个新概念——泛化,相信很多朋友在学习机器学习或者深度学习的时候,经常看到泛化、泛化能力等一些词言,下面就由我向大家补充一下泛化的小概念~

泛化概念

 首先我们要知道机器学习的主要挑战是什么,所谓机器学习的主要挑战即是我们的算法必须能够在先前未观测到的新输入上表现良好,而不只是在训练集上表现良好。
 而在先前未观测到的输入上表现良好的能力被称为泛化(generalizaion)。
举个例子:

小明和小李都上了高三。小明头脑机灵,一边刷着五年高考三年模拟一边总结做题规律,而小李一门心思刷题,一套完了又一套,刷的试卷堆成山了却没有对错题进行总结。高考结束成绩公布,小明超出一本线几十分,而小李却勉强上了二本线。这是为什么呢?

原来高考试题一般是新题,谁也没做过,平时的刷题就是为了掌握试题的规律,能够举一反三、学以致用,这样面对新题时也能从容应对。这种对规律的掌握便是泛化能力。

在这个例子中,小明善于总结做题规律,可以说是他的泛化能力好;而小李只知道刷题却没有掌握做题规律,可以说是他的泛化能力差。

泛化能力分类

根据泛化能力强弱,可以分为:

  • 欠拟合:模型过于简单,不能在训练集上获得足够低的误差; 拟合: 测试误差与训练误差差距较小;
  • 过拟合:过分关注训练集细节,在训练集上表现良好,但不能泛化到新数据上;
  • 不收敛:模型不是根据训练集训练得到的。

一、欠拟合

欠拟合是指模型不能在训练集上获得足够低的误差。
它通常是由以下两点造成:

  1. 模型太简单,即复杂度过低
  2. 特征量太少。

1.1 解决欠拟合的几种方法策略

1. 模型复杂化
对同一个算法复杂化。例如回归模型添加更多的高次项,增加决策树的深度,增加神经网络的隐藏层数和隐藏单元数等
弃用原来的算法,使用一个更加复杂的算法或模型。例如用神经网络来替代线性回归,用随机森林来代替决策树等
2. 增加更多的特征,使输入数据具有更强的表达能力
特征挖掘十分重要,尤其是具有强表达能力的特征,往往可以抵过大量的弱表达能力的特征。
特征的数量往往并非重点,质量才是,总之强特最重要。
能否挖掘出强特,还在于对数据本身以及具体应用场景的深刻理解,往往依赖于经验。
3. 调整参数和超参数
超参数包括:
神经网络中:学习率、学习衰减率、隐藏层数、隐藏层的单元数、Adam优化算法中的β1和β2参数、batch_size数值等。
其他算法中:随机森林的树数量,k-means中的cluster数,正则化参数λ等。
4. 降低正则化约束
正则化约束是为了防止模型过拟合,如果模型压根不存在过拟合而是欠拟合了,那么就考虑是否降低正则化参数λ或者直接去除正则化项。

二、过拟合

大的来讲,过拟合是指训练误差和测试误差之间的差距太大。
而小的来讲,过拟合可以细分为一下几点:

  • 建模样本选取有误,如样本数量太少,选样方法错误,样本标签错误等,导致选取的样本数据不足以代表预定的分类规则
  • 样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则
  • 假设的模型无法合理存在,或者说是假设成立的条件实际并不成立
  • 参数太多,模型复杂度过高
  • 对于决策树模型,如果我们对于其生长没有合理的限制,其自由生长有可能使节点只包含单纯的事件数据(event)或非事件数据(no event),使其虽然可以完美匹配(拟合)训练数据,但是无法适应其他数据集
  • 对于神经网络模型:a)对样本数据可能存在分类决策面不唯一,随着学习的进行,,BP算法使权值可能收敛过于复杂的决策面;b)权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征
    影响欠拟合和过拟合的另一个重要因素是训练数据集的大小。一般来说,如果训练数据集中样本数太少,特别是比模型参数数量(按元素计)更少时,过拟合就更容易发生。此外,泛化误差不会随着训练数据集里样本数量增加而增大。因此,在计算资源允许的范围之内,我们通常希望训练数据集大一些,特别是在模型复杂度较高时,如层数较多的深度学习模型。

2.1 解决过拟合的几种方法策略

  • 权重衰减(weight decay)
    虽然增大训练数据集可能会减轻过拟合现象,但是获取额外的训练数据往往代价高昂。所以我们常用权重衰减(weight decay)来应对过拟合问题。
  • 使用正则化约束
    代价函数后面添加正则化项,可以避免训练出来的参数过大从而使模型过拟合。使用正则化缓解过拟合的手段广泛应用,不论是在线性回归还是在神经网络的梯度下降计算过程中,都应用到了正则化的方法。常用的正则化有l1正则和l2正则,具体使用哪个视具体情况而定,一般l2正则应用比较多。
  • 减少特征数
    欠拟合需要增加特征数,那么过拟合自然就要减少特征数。去除那些非共性特征,可以提高模型的泛化能力
  • 调整参数和超参数
    在任何情况下,调整参数和超参数都是一个可行的方法。
  • 降低模型的复杂度
    欠拟合需要增加模型的复杂度,那么可想而知,过拟合可以通过降低模型的复杂度来应对。它俩之间有一定的关系。
  • 使用Dropout(丢弃法)
    除了前面的权重衰减以外,深度学习模型常常使用丢弃法(dropout) 来应对过拟合问题。
  • 提前结束训练
    即early stopping,在模型迭代训练时候记录训练精度(或损失)和验证精度(或损失),如果模型训练的效果不再提高,比如训练误差一直在降低但是验证误差却不再降低甚至上升,这时候便可以结束模型训练了。

希望如果有什么总结不到位或者错误的地方,各位大佬能在评论区“拔刀相助”~~~

你可能感兴趣的:(深度学习基础,深度学习之目标检测,人工智能,决策树,python)