[机器学习] 训练集(train set) 验证集(validation set) 测试集(test set)

在有监督(supervise)的机器学习中,数据集常被分成2~3个即:

训练集(train set) 验证集(validation set) 测试集(test set)

      一般需要将样本分成独立的三部分训练集(train set),验证集(validation set)和测试集(test set)。其中训练集用来估计模型,验证集用来确定网络结构或者控制模型复杂程度的参数,而测试集则检验最终选择最优的模型的性能如何。一个典型的划分是训练集占总样本的50%,而其它各占25%,三部分都是从样本中随机抽取。 
     样本少的时候,上面的划分就不合适了。常用的是留少部分做测试集。然后对其余N个样本采用K折交叉验证法。就是将样本打乱,然后均匀分成K份,轮流选择其中K-1份训练,剩余的一份做验证,计算预测误差平方和,最后把K次的预测误差平方和再做平均作为选择最优模型结构的依据。特别的K取N,就是留一法(leave one out)。

     training set是用来训练模型或确定模型参数的,如ANN中权值等; validation set是用来做模型选择(model selection),即做模型的最终优化及确定的,如ANN的结构;而 test set则纯粹是为了测试已经训练好的模型的推广能力。当然,test set这并不能保证模型的正确性,他只是说相似的数据用此模型会得出相似的结果。但实际应用中,一般只将数据集分成两类,即training set 和test set,大多数文章并不涉及validation set。

train

训练数据。拟合模型,用这部分数据来建立模型。

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

validation

验证数据。train建了一个模型,但是模型的效果仅体现了训练数据,但不一定适合同类的其他数据,所以建模前数据分成两部分,一部分为训练数据,一部分为验证数据(两部分数据的比例大致为7:3,这取决于你验证的方法)。另外,你也可能训练多个模型,但不知哪个模型性能更佳,这时可以将验证数据输入不同模型进行比较。

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

test

测试数据。跟前两者的最大区别在于:train和validation数据均是同一对象的数据,但是测试,我们就需要用跨对象的数据来验证模型的稳定性。

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

 

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

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

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

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

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

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
划分训练集测试集验证集机器学习中常用的一步。一般情况下,我们需要将数据集划分成三个部分: - 训练集training set):用于训练模型。 - 验证集validation set):用于调整模型的超参数,比如学习率、正则化系数等。 - 测试集test set):用于评估模型的泛化性能,也就是模型对未见过的数据的预测能力。 下面是一个 Python 代码示例,用于将数据集划分为训练集验证集测试集,并生成对应的 txt 文件。 ```python import os import random # 数据集路径 data_dir = 'data/' # 分割比例 train_ratio = 0.8 val_ratio = 0.1 test_ratio = 0.1 # 获取文件列表 files = os.listdir(data_dir) file_list = [] for file in files: file_list.append(os.path.join(data_dir, file)) # 打乱文件列表 random.shuffle(file_list) # 计算分割点 train_point = int(len(file_list) * train_ratio) val_point = int(len(file_list) * (train_ratio + val_ratio)) # 划分数据集 train_files = file_list[:train_point] val_files = file_list[train_point:val_point] test_files = file_list[val_point:] # 写入 txt 文件 with open('train.txt', 'w') as f: f.write('\n'.join(train_files)) with open('val.txt', 'w') as f: f.write('\n'.join(val_files)) with open('test.txt', 'w') as f: f.write('\n'.join(test_files)) ``` 上述代码中,我们首先定义了数据集路径、分割比例以及三个空列表,用于存储划分后的训练集验证集测试集。然后,我们通过 `os.listdir()` 函数获取数据集中所有文件的路径,将它们存储在一个列表中,并且使用 `random.shuffle()` 函数将列表打乱。 接下来,我们根据分割比例计算出训练集验证集测试集的分割点,使用 Python 的切片功能将文件列表划分为三个部分,并将它们分别存储在 `train_files`、`val_files` 和 `test_files` 中。 最后,我们使用 `with open()` 函数分别打开三个 txt 文件,并使用 `f.write()` 函数将文件列表写入相应的文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值