疑问:
- 为什么要分训练集、验证集、测试集?
- 为什么采用交叉验证?
- 交叉验证的应用场景是什么?
- 最终预测模型是怎么得到的?
预备知识:什么是超参数?
超参数是在开始学习过程之前设置值的参数(人为设置),而不是通过训练得到的参数数据。例如:树的数量或树的深度、学习率、深层神经网络隐藏层数、k均值聚类中的簇数等。
数据划分的演进过程:
1、训练集+测试集
如果在一个数据集A上进行训练,同样再用A作为评估数据集,无法评估在新数据集上的表现,为了避免这种情况,通常会取出一部分未被训练的数据作为测试集。
假如我们用训练集训练了一个随机森林模型,用测试集去评估模型,评估的过程中,会手动调整树颗数或者树深度这种超参数,然后再去测试集上看看效果如何。其实这种操作是错误的,这样做是在迎合测试集,造成测试集数据泄露,如果下一次再随机划分测试集,效果未必好,所以这是一个高方差的估计。
任何方式使用来自测试集的信息这种行为,都是 “窥视”。
习惯上我们称评估最终模型性能的数据集为 “测试集”,最终模型的评估必须在一个没有在训练模型或是调整参数时被使用过的数据集上进行。
问:若“封存”了测试集,那么通过什么来评估模型对不可见数据的性能呢?通过什么标准调参(超参数)呢?
答案:验证集
2、训练集+验证集+测试集
验证集用于初步评估模型能力,当验证集上的评估实验比较成功时,在测试集上进行最后的评估。
但是仅仅有单一的验证集还是有局限性的:
- 如果样本数据较小,划分下来,用于训练的数据较少。可能存在丢失训练数据信息的风险。
- 不同验证集生成的结果不同,这造成验证集具备极大的不确定性。(比如验证块中某些数据可能存在误差值,异常值,导致测试结果偏低,或者某些部分验证的数据过于简单,混入噪声较小,使得测试结果偏高)因为我们是要在验证集上调整超参数的,所以一定要将这种不确定性降低。
所以用K折交叉验证的方式来评估模型,能够减小偏差,并且评估性能较稳定。
如何解决上述问题?
答案:K折交叉验证
3、K折交叉验证+测试集
首先简述下K折交叉验证思路:
- 验证数据其实是训练数据的一部分,假设将训练数据分成4折:
- 第一次使用A+B+C训练,D验证,分数S1
- 第二次使用A+B+D训练,C验证,分数S2
- 第三次使用A+C+D训练,B验证,分数S3
- 第四次使用B+C+D训练,A验证,分数S4
最终分数是S1、S2、S3、S4的平均。
K-cv解决的问题:
- 训练集中的每个数据都可以参与训练,解决了训练数据不足的问题。
- K折就是K个验证集,验证了K次,减小了验证集的不确定性。
5、交叉验证主要应用场景
(1)超参数寻优
对于只有一层隐藏层的神经网络,假如想确定隐藏层神经元的个数n,选取6个值[0,5],进行10折交叉验证,随着n的逐渐增大,模型拟合能力越好,偏差和方差同时下降。当n超过一定阈值,方差变大,这时模型开始过拟合,泛华能力降低。所以我们要选择合适参数,使得方差和偏差平衡,得到最优的模型。
但是这种优化属于局部优化,要想达到全局的最优,需使用网格搜索法。
(2)算法选择
我们可以认为模型=算法+参数,在(1)中我们关注改变不同的超参数调整并选择模型,同理我们也可以结合算法和参数的变化,选择模型。
问:现在知道了何时模型最优,那么如何确立最终的模型呢?
答:当我们确定下算法和超参数,用全量的数据训练一遍,得到的就是最终的预测模型。
参考:
Andrew W. Moore:Cross-validation for detecting and preventing overfitting
Andrew NG: < 结构化学习> 1.5-1.6
sklearn官方文档:http://sklearn.apachecn.org/cn/0.19.0/modules/cross_validation.html
重采样:https://www.zhihu.com/question/39259296
验证集和测试集的作用:https://cloud.tencent.com/developer/article/1034870
CV特征选择:https://blog.csdn.net/jasonding1354/article/details/50562513