【机器学习】验证集和测试集有什么区别


定义

  1. Ripley 的著作《模式识别与神经网络》(Pattern Recognition and Neural Networks)中,训练集、验证集和测试集的定义如下:

训练集:用来学习的样本集,用于分类器参数的拟合。

验证集:用来调整分类器超参数的样本集,如在神经网络中选择隐藏层神经元的数量。

测试集:仅用于对已经训练好的分类器进行性能评估的样本集。

  1. 详细解释

训练数据集(Training Set):
是一些我们已经知道输入和输出的数据集训练机器去学习,通过拟合去寻找模型的初始参数。例如在神经网络(Neural Networks)中, 我们用训练数据集和反向传播算法(Backpropagation)去每个神经元找到最优的比重(Weights)。

验证数据集(Validation Set):
也是一些我们已经知道输入和输出的数据集,通过让机器学习去优化调整模型的参数,在神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点;在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。

测试数据集(Test Set):
用户测试模型表现的数据集,根据误差(一般为预测输出与实际输出的不同)来判断一个模型的好坏。


验证集和测试集的区别

  1. 验证集和测试集的对比
    在这里插入图片描述

  2. 验证集的作用:
    使用验证集是为了快速调参,也就是用验证集选择超参数(网络层数,网络节点数,迭代次数,学习率这些)。
    另外用验证集还可以监控模型是否异常(过拟合啦什么的),然后决定是不是要提前停止训练。
    验证集的关键在于选择超参数,我们手动调参是为了让模型在验证集上的表现越来越好,如果把测试集作为验证集,调参去拟合测试集,就有点像作弊了。
    而测试集既 不参与参数的学习过程,也不参与参数的选择过程,仅仅用于模型评价。

  3. 验证集的正确打开方式:
    验证集可以看做参与了 “人工调参” 的训练过程。
    一般训练几个 epoch 就跑一次验证看看效果(大部分网络自带这个功能)。
    这样做的第一个好处是:可以及时发现模型或者参数的问题,比如模型在验证集上发散啦、出现很奇怪的结果啦(Inf)、mAP不增长或者增长很慢啦等等情况,这时可以及时终止训练,重新调参或者调整模型,而不需要等到训练结束。
    另一个好处是验证模型的泛化能力,如果在验证集上的效果比训练集上差很多,就该考虑模型是否过拟合了。同时,还可以通过验证集对比不同的模型。


为什么验证数据集和测试数据集两者都需要?

因为验证数据集(Validation Set)用来调整模型参数从而选择最优模型,模型本身已经同时知道了输入和输出,所以从验证数据集上得出的误差(Error)会有偏差(Bias)。

但是我们只用测试数据集(Test Set) 去评估模型的表现,并不会去调整优化模型。

在传统的机器学习中,这三者一般的比例为training/validation/test = 50/25/25, 但是有些时候如果模型不需要很多调整只要拟合就可时,或者training本身就是training+validation (比如cross validation)时,也可以training/test =7/3.

但是在深度学习中,由于数据量本身很大,而且训练神经网络需要的数据很多,可以把更多的数据分给training,而相应减少validation和test。


参考链接:

  1. 机器之心
  2. https://blog.csdn.net/JNingWei/article/details/78170171
  3. https://blog.csdn.net/qq_31347869/article/details/98203028
  4. https://zhuanlan.zhihu.com/p/29133576
### 创建使用机器学习中的训练集、验证集测试集 为了有效地构建评估机器学习模型,通常会将原始数据划分为三个不同的子集:训练集、验证集以及测试集。这种划分有助于防止过拟合并确保模型能够泛化到未见过的数据上。 #### 数据分割策略 一种常见的做法是以固定比例来分配这些集合。例如,在给定的情况下: - 训练集大小为 `(30000, 1)`[^2] - 验证集大小为 `(10000, 1)`[^2] - 测试集大小为 `(5000, 1)` 这表明大约75% 的样本用于训练模型,而剩下的部分分别作为验证最终测试之用。 #### 使用Python实现数据集拆分 下面是一个简单的例子,展示了如何利用 `scikit-learn` 库来进行上述操作: ```python from sklearn.model_selection import train_test_split # 假设 X 是特征矩阵,y 是标签向量 X_train_val, X_test, y_train_val, y_test = train_test_split( X, y, test_size=0.1, random_state=42) # 进一步把训练+验证集分成两份 X_train, X_val, y_train, y_val = train_test_split( X_train_val, y_train_val, test_size=0.25, random_state=42) ``` 在此代码片段中,首先从整个数据集中抽取出了独立的测试集 (`test_size=0.1`);接着再从未被选入测试集的部分里随机选取四分之一作为验证集(`test_size=0.25`)。注意这里两次调用了相同的函数,并且都指定了种子值 (`random_state`) 来保证结果可重复性。 #### 处理不平衡类别分布 如果遇到类间不均衡的情况,则可能需要采用更复杂的方法比如StratifiedKFold 或者 SMOTE 算法等技术来保持各类别的代表性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值