在上一篇文章当中我们说到,可以使用正则化来解决过拟合问题,今天我们再来介绍另一种方法:交叉验证法。
那么,什么是交叉验证呢?
交叉验证:
一般的情况下,交叉验证法指的是将数据集随机切分为训练集、验证集和测试集这三部分,训练集用来训练模型**,验证集用于训练过程中模型的验证和选择,也就是说如果存在着多个模型,从中挑选出训练误差最小的那个模型,而测试集是用来对选定的模型进行一个总的评估。
交叉验证的原理:
如果模型在训练集以及验证集中表现效果很好,也就是拟合度很好,而在测试集中拟合效果较差,那么就说此时模型出现了过拟合问题。
这也就是交叉验证能避免过拟合的原理。
交叉验证的使用场合:数据集较小的情况下;
当数据较小的时候,可以利用交叉验证的方法将训练集切分为很多份,然后进行组合,以此扩大可用训练集的数量,训练出较好的模型。
交叉验证的种类:
按照样本切分和组合的方式,可以分为一下几种:
- Holdout检验
- 简单交叉验证
- K折交叉验证
- 留一交叉验证
Holdout检验(holdout cross validation):
这种方法是将数据集分为两个集合,A和B,A作为训练集,B作为测试集,先使用A训练模型,然后利用B来验证模型的效果。
指标可以用平均绝对误差(MAE)、平均绝对百分比误差(MAPE)、精确率、召回率或是绘制ROC曲线来进行评估。
总体来说,Holdout并不是一种很好的检验方法,其在测试集的基础上所计算出来的各种统计指标,十分依赖于刚开始的分类,与原始的分组情况有着很大的关系。
K折交叉验证(k-fold cross validation):
将数据集切分成为K个互不相交的大小相同的数据集,利用其中K-1个集合作为训练集训练模型,用剩余一个子集进行测试,重复上述步骤K次,选出平均测试误差最小的模型。
显而易见,当K的取值越大的时候,统计的偏误也就越小,但这也会带来一个问题,就是计算量变大,计算成本变高。
经过长期实验人们发现,当K取值为10的时候,代价与模型之间的能够达到很好的平衡。
留一交叉验证(Leave one out cross validation):
使用场合:K等于样本数N时,在数据缺乏的情况下使用。
假设样本数据集中有N个样本,将其中一个单独作为测试集,其中N-1个样本作为训练集进行训练模型,重复K(N)次,得到N个模型,用N个模型的分类准确率的平均数作为分类器的性能指标。
优点:每一个模型几乎使用所有的样本来训练模型的,并且由于最终取平均的原因,结果较为可靠。
缺点:当N比较大时,计算耗时,计算成本较高。
自助法(Bootstrap):
假设给定的数据集包含d个样本。将该数据集有放回地抽样m次,产生m个样本的训练集。这样原数据样本中的某些样本很可能在该样本集中出现多次,没有进入该训练集的样本最终形成检验集(测试集)。
显然每个样本被选中的概率是1/m,因此未被选中的概率就是(1-1/m),这样一个样本在训练集中没出现的概率就是m次都未被选中的概率,即(1-1/m)^m。
当m趋于无穷大时,这一概率就将趋近于e^-1=0.368,所以留在训练集中的样本大概就占原来数据集的63.2%。
优点:训练集的样本数和原数据机一样都是m,并且有三分之一的数据可以作为训练集,适合样本数较少的数据集。
缺点:经过抽样的数据分布与原始数据的数据分布不同,会导致偏差增大。