1.什么是训练集、验证集和测试集?
训练集,即:训练的集合,是用来训练模型的数据集合。通过这部分数据,学习得到一个模型。训练集可以当做高中刷题的题库,训练的过程可以比作高中生学习的过程。
测试集,即:测试的集合,是用来检验或者说验证模型的数据集合。通过这部分数据,可以验证学习的好坏。测试集可以当做高考的试题,测试的过程可以比作参加高考。
理解上述两个概念以后,那学习的过程我们就可以捋清楚了:
通过学习(理解成“训练”的过程),让自己变得更好(把自己当成“模型”)。通过3年的学习(训练了3年),参加高考(理解成“测试”的过程),检验自己学得好不好。
注意注意!此时此刻我其实隐含了一个假设条件,就是你参加完高考以后不能凭借着考场的回忆再去刷题,就是高考完以后你脑子就回到了高一入学的状态重新学习3年参加高考,高考如果不理想脑子又回到了高一入学的状态重新学习3年参加高考……在机器学习中,也就是说:“训练集”不能用于训练更新模型。当测试效果发现不行时,从头开始训练,不能含有一点记忆。
那么问题来了:我花了3年时间去训练,高考完了发现没学好、高考分数很低怎么办?时间都白白浪费了,但还没有学好。有的人可能说,那就再来3年呗。好,那咱们就再来3年,再来3年就一定会好吗?是不一定的,再来3年,再来10个3年也不是一定可以学好的。那训练不好就重新训练,那什么时候是个头呀?
所以,此时又有人想出了一个办法,我们每半年参加1次模拟考试,检验一下学习效果,及时调整学习策略。这,就是验证集(模拟考试的题库)
验证集,就是用来检验模型数据的集合。
此时可以适当总结下:验证集≠测试集(模拟成绩≠高考成绩,模拟成绩好可能高考大概率会好,但不代表高考成绩一定好)
2.什么是K折交叉验证?
K折交叉验证,是一种动态的验证方式。以 K 取10为例,将数据集(此数据集非机器学习中的数据集,而是指一种数据的集合,只是为了解释分组问题的一个概念)划分成10份,将每份数据分别标记为1号、2号、3号、4号、5号、6号、7号、8号、9号、10号。每次训练用1份作为验证集,其余9份作为验证集,如下表所示。
1号 | 2号 | 3号 | 4号 | 5号 | 6号 | 7号 | 8号 | 9号 | 10号 | |
第1次 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 验证 |
第2次 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 验证 |
训练 |
第3次 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 验证 |
训练 | 训练 |
第4次 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 验证 |
训练 | 训练 | 训练 |
第5次 | 训练 | 训练 | 训练 | 训练 | 训练 | 验证 |
训练 | 训练 | 训练 | 训练 |
第6次 | 训练 | 训练 | 训练 | 训练 | 验证 |
训练 | 训练 | 训练 | 训练 | 训练 |
第7次 | 训练 | 训练 | 训练 | 验证 |
训练 | 训练 | 训练 | 训练 | 训练 | 训练 |
第8次 | 训练 | 训练 | 验证 |
训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 |
第9次 | 训练 | 验证 |
训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 |
第10次 | 验证 |
训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 | 训练 |
问1: 那为什么要用验证集?
答1: 用来调整超参数的。
问2: 比如分类问题中用到了激活函数,但不知道使用relu还是tanh函数的准确率更高,该怎么办?
答2: 那就用relu函数来训练10次得到10份验证集上的准确率,将10份准确率取个均值作为relu函数的代表。再用tanh函数来训练10次得到10份验证集上的准确率,将10份准确率取个均值作为tanh函数的代表。将这两个准确率进行比较,哪个准确率高,就说明哪个激活函数更好。
当确定好某个函数的准确率好时,就是用该激活函数,再将全部数据作为训练集训练,然后在测试集上进行测试即可。
这么做的优点是:
使用了验证集,可以检验学习的好坏。
每份数据都当过验证集、也都当过训练集,不会存在因数据问题带来模型偏差。
充分训练了模型(毕竟每份数据被用来训练了9次),当数据量小时起到了“扩充”训练数据的作用。
可以挑选出最佳的超参数。
3.数据集划分过程
将数据集分为训练集和测试集,将测试集放在一边先不管。
已知目前有 N 组超参数组合(将从 N 组中挑选出最好的1组)。
对每个超参数组而言,将训练集分为 K 份。每次使用 K 份中的 1 份作为验证集,其他 K-1 份作为训练集。通过 K 次训练后,我们得到了 K 个不同的评价指标。将 K 个评价指标取均值作为该超参数组的代表。
循环 N 次,获得 N 个超参数组对应的评价指标的均值,取其中最好的一个超参数组。
使用最优的超参数,然后将 K 份数据全部作为训练集重新训练模型,得到最终模型,然后直接在测试集上测试即可。
3.应用场景及注意事项
3.1.应用场景
数据量较小时,会使用 K 折交叉验证。K 折交叉验证可以起到“扩充”数据的作用。
超参数多,不知道该选哪个合适,会用到K折交叉验证。
3.2.注意事项
K 折交叉验证,不是 K 折交叉测试(这在好多文章中都搞混了),测试集是不能用来更新模型和调整超参数的。我们将数据分成K份的目的是来验证数据的,不是来测试数据的。验证≠测试。
可以将 K 折交叉验证,概括为 N 次 K 折交叉验证。N 是指超参数组的数量,需要从 N 个超参数组中选出最好的一个来;K 是指交叉验证划分的数量,一般取5或者10。