OpenCV:模型训练与验证

一、过拟合&欠拟合

1 概念

过拟合是指所选模型的复杂度比真模型更高,学习时选择的模型所包含的参数过多,对已经数据预测得很好,但是对未知数据预测得很差得现象。

欠拟合是指所选模型得复杂度比真模型更低,学习时选择的模型所包含的参数过少。

2 如何判断

-特征变量只有一个的时候,可以通过画出决策树的图像,观察拟合效果
-画出training error 和cross validation error关于模型超参数的error曲线图来判断
-画出学习曲线来识别,考量增加数据量会不会改善学习模型效果
-以上分析的前提都是假设基本误差很小,训练集和验证集数据来自相同分布

3 特点

过拟合:高方差、低偏差

4 原因

过拟合:训练数据不够,模型进行过度训练

欠拟合:特征维度少,导致拟合的函数无法满足训练集,误差较大。

5 如何避免

过拟合:
1) Early stopping:在模型对训练数据集迭代收敛之前停止迭代来防止过拟合
2) 数据集扩增:既需要得到更多符合要求的数据,即和已有数据是独立同分布的,或者近似独立同分布的。一般的方法有:从数据源头采集更多的数据,复制原有数据并加上随机噪声,重采样,根据当前数据集估计数据分布参数,使用该分布产生更多数据等。过拟合的主要原因是模型太努力去记住训练样本的分布情况,而加大样本量,可以使得训练集的分布更加具备普适性,噪声对整体的影响下降。
3) 正则化方法:一般有L1正则和L2正则等
4) Dropout:正则是通过在代价函数后面加上正则项来防止模型过拟合的。而在神经网络中,有一种方法是通过修改神经网络本身结构来实现的,即dropout。

欠拟合:
1) 使用更复杂的模型,增加模型的拟合能力
2) 减少正则化程度

二、模型验证

解决上述问题最好的解决方法:构建一个与测试集尽可能分布一致的样本集(可称为验证集),在训练过程中不断验证模型在验证集上的精度,并以此控制模型的训练。
一般情况下,参赛选手也可以自己在本地划分出一个验证集出来,进行本地验证。训练集、验证集和测试集分别有不同的作用:

  • 训练集(Train Set):模型用于训练和调整模型参数;

  • 验证集(Validation Set):用来验证模型精度和调整模型超参数;

  • 测试集(Test Set):验证模型的泛化能力。

因为训练集和验证集是分开的,所以模型在验证集上面的精度在一定程度上可以反映模型的泛化能力。在划分验证集的时候,需要注意验证集的分布应该与测试集尽量保持一致,不然模型在验证集上的精度就失去了指导意义。

既然验证集这么重要,那么如何划分本地验证集呢。在一些比赛中,赛题方会给定验证集;如果赛题方没有给定验证集,那么参赛选手就需要从训练集中拆分一部分得到验证集。验证集的划分有如下几种方式:

  • 留出法(Hold-Out)

直接将训练集划分成两部分,新的训练集和验证集。这种划分方式的优点是最为直接简单;缺点是只得到了一份验证集,有可能导致模型在验证集上过拟合。留出法应用场景是数据量比较大的情况。

  • 交叉验证法(Cross Validation,CV)

将训练集划分成K份,将其中的K-1份作为训练集,剩余的1份作为验证集,循环K训练。这种划分方式是所有的训练集都是验证集,最终模型验证精度是K份平均得到。这种方式的优点是验证集精度比较可靠,训练K次可以得到K个有多样性差异的模型;CV验证的缺点是需要训练K次,不适合数据量很大的情况。

  • 自助采样法(BootStrap)

通过有放回的采样方式得到新的训练集和验证集,每次的训练集和验证集都是有区别的。这种划分方式一般适用于数据量较小的情况。


版权声明:本文为o6eceici原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。