1 前言
最开始接触交叉验证,没理解这里的验证集,我当时想,怎么可以这样呢?验证集怎么可以参与训练调参呢?
后来才明白,验证集就是从训练集划分出来的东西,是我把验证集误想成了测试集了。。。
2 正文
首先强调:
机器学习分为两个步骤:训练+测试。
- 训练阶段:只使用训练集training set对模型进行训练,即调参。
- 测试阶段:只使用测试集test set对模型进行测试,用于评估模型学习情况,泛化能力,不参与调参。
- 那么验证集validation set是怎么来的呢?
原来我们在训练阶段存在这些问题:
- 我们怎么保证此时训练获得的参数是ok的呢?
- 即我们什么时候选择停止迭代呢?
- 以及我们怎么防止(减少)过拟合、欠拟合呢?
为了解决上述问题,我们就想出来了一个选择模型、选择参数的方法:
从训练集里划分出一部分数据,称之为验证集,相当于用来“模拟测试集”,即相当于高考之前的每一次的模拟考试。
于是上述就变成了:
- 训练阶段:
a. 只使用训练集对不同的模型进行训练(这里的训练集不包含验证集噢!!)
b. 只使用验证集对不同的模型进行”测试"
c. 选取在验证集上表现最好的模型 - 测试阶段:只使用测试集对模型进行性能测试。
也就是说,训练集、验证集都是拿来训练的,测试集才是拿来测试的。
训练集、验证集可以拿来调参,测试集不可以。
3 帮助调参、选择模型的方法
3.1 引入验证集
- 将训练集分为两部分:
- training set
- validation set
-
如何选择模型:
在训练集中训练不同的模型,选择验证集中错误最小的模型 -
缺点:
当样本本来就不足时,上述操作可能会引入数据稀疏问题。
3.2 2 交叉验证(Cross-Validation)
- 将训练集分为 K 组,每次使用K-1组作为训练集,剩下一组作为验证集。
- 取验证集上性能最好的模型。
交叉验证的一个方法:k折交叉验证
- 将原始训练集划分为K组,每一组子集在一轮中被选取作为验证集,剩余K-1组作为训练集:
- 第一轮:从头训练模型,在数据子集D1-D9上训练,数据子集D10上验证,获得一个准确度
- 第二轮:从头训练模型,在数据子集D2-D9、D10上训练,数据子集D1上验证,获得一个准确度
- 第三轮:从头训练模型,在数据子集D3-D9、D1上训练,数据子集D2上验证,获得一个准确度
- …
- 10轮训练中,10个准确度的平均值代表着模型的性能,选取准确度最高的模型的参数作为最优参数
- 在整个数据集上,使用最优参数从头训练模型
- 在真正的测试集上测试模型的泛化能力
觉得对您所帮助的话,请多多点赞!