训练集(training)、验证集(validation)和测试集(test)

在这里插入图片描述

0.什么是训练集、验证集和测试集?

  • 训练集(train):训练模型
  • 验证集(val):评估模型
  • 测试集(test):一旦找到了最佳参数,就开始最终训练

使用训练集训练多个网络模型,再使用验证集测试这些网络,找到得分最高的那个网络作为我们选择的最佳网络,再将训练集和验证集合并,重新训练这个最佳网络,得到最佳网络参数。

打个比方:我们现在有个任务,但是解决这个任务的网络有网络A、网络B和网络C,如何找到效果最好的哪个?

  1. 先拿train对三个网络都进行训练(用相同的train训练三个网络),然后用validation来测试三个网络(validation对三个网络也是一样的),我们发现网络B的效果最好,所以我们认为对于本任务,网络B的结构是效果最好的。
  2. 当然我们现在训练的网络都只是粗训练,现在我们要针对网络B开始精细训练:将train和validation合并组成新的train,现在我们有数据train和test,开始针对B网络精细训练了

对于train、validation和test的区分有简单留出、K折验证和重复K折验证三种,具体如下:

1. 简单留出验证的伪代码

num_validation_samples=10000  # 验证集样本数
np.random.shuffle(data)  # 通常需要打乱数据

calidation_data=data[:num_calidation_samples]  # 定义验证集

data=data[num_calidation_samples:]  # 截取剩余数据给变量data
training_data=data[:]  # 定义训练集:相当于换个名字,实属疑惑,感觉走弯路

model=get_model()
model.train(training_data)  # 用train训练model
validation_score=model.evaluate(validation_data)  # 用val验证得分

现在假设你已经选好了网络模型,开始训练最终模型
在这里插入图片描述

model=get_model()
model.train(np.concatenate([training_data,validation_data]))  # concatenate是拼接Training和Validation为新的Training
test_score=model.evaluate(test_data)  # 再使用Test测试得分

总结
以上方法简单易理解,但是缺点也明显:

  • 如果样本数量太少,验证集和测试集更少,无法在统计学上代表数据
  • 划分数据前时,进行不同的随机打乱则得到的模型性能差别可能很大

解决以上问题的方法有一下两种:

  • K折验证
  • 重复的K折验证

2. K折验证

在这里插入图片描述
如上,当我们不确定多个模型哪个更好时,通过K折验证找到loss最小的。

K折验证时将数据划分为大小相同的K个分区。对于每个分区i,在剩余的K-1个分区上训练模型,然后再分区i上评估模型。最终分数等于K个分数的平均值。
在这里插入图片描述

k=4
num_validation_samples=len(data)//k  # 验计算得证集的样本数

np.random.shuffle(data)  # 数据打乱

validation_scores=[]  # 储存每折的验证集得分
for fold in range(k):
    validation_data=data[num_validation_samples * fold : num_validation_samples * (fold+1)]  # 选择验证集分区
    training_data=data[:num_validation_samples * fold]+data[num_validation_samples * (fold+1):]  #剩余的作为训练集
    
    model=get_model()
    model.train(training_data)
    validation_acore=model.evaluate(validation_data)
    
    validation_acores.append(validation_acore)  # 将该折的得分储存到分数列表中
validation_score=np.average(validation_scores)  # 计算平均值:K折验证分数的均值

model=get_model()  # 现在训练最终模型
model.train(data)
test_score=model.evaluate(test_data)

3. 重复K折验证

如果可用数据相对较少,而你又需要尽可能精确评估模型,可以选择带有打乱数据的重复K折验证:多次使用K折验证,在每次使用K折验证前都先将数据打乱,最终分数时每次K折验证分数的均值(K折验证分数又是每折的均值)。

  • 28
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值