之前我们提到了数据,我们也可以称其为数据集,数据集我们可以进行处理,分为以下几种。
Training Set,用于模型训练的数据样本。
Validation Set,是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。
在神经网络中,验证数据集用于:
- 寻找最优的网络深度
- 或者决定反向传播算法的停止点
- 或者在神经网络中选择隐藏层神经元的数量
- 在普通的机器学习中常用的交叉验证(Cross Validation)就是把训练数据集本身再细分成不同的验证数据集去训练模型。
Test Set,用来评估最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
测试集的生成理论上来说很简单,但是有些细节需要注意**:**
- 通过随机切片的方式获取测试集,要注意设置随机种子,防止多次运行程序获得了全部数据
- 但是设置随机种子的方式也并不完美,如果你更新数据集后也会打破原来的切分方式
- 可以通过每行数据中的唯一标示来计算Hash值,然后根据Hash值进行划分
sklearn中提供的train_test_split方法是一种比较方便的切分数据的方式。
from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(data, test_size=0.2, random_state=42)
还需要注意的是,我们在划分数据集时需要尽量使数据分布均匀,不能训练集代表一个群体,测试集代表另一个群体,那么模型得到的效果一定是有偏差的,所以我们需要使用分层采样的方式,让训练集和测试集尽可能的分布均匀。
三者的关系如下图所示
- 训练集:课本,学生根据课本里的内容来掌握知识。训练集直接参与了模型调参的过程,显然不能用来反映模型真实的能力。即不能直接拿课本上的问题来考试,防止死记硬背课本的学生拥有最好的成绩,即防止过拟合。
- 验证集:作业,通过作业可以知道不同学生学习情况、进步的速度快慢。验证集参与了人工调参(超参数)的过程,也不能用来最终评判一个模型(刷题库的学生不能算是学习好的学生)。
- 测试集:考试,考的题是平常都没有见过,考察学生举一反三的能力。所以要通过最终的考试(测试集)来考察一个学型(模生)真正的能力(期末考试)。