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

训练集(training)、验证集(validation)和测试集(test)
文章图片

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

  • 训练集(train):训练模型
  • 验证集(val):评估模型
  • 测试集(test):一旦找到了最佳参数,就开始最终训练
【训练集(training)、验证集(validation)和测试集(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=https://www.it610.com/article/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验证得分

现在假设你已经选好了网络模型,开始训练最终模型
训练集(training)、验证集(validation)和测试集(test)
文章图片

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折验证
训练集(training)、验证集(validation)和测试集(test)
文章图片

如上,当我们不确定多个模型哪个更好时,通过K折验证找到loss最小的。
K折验证时将数据划分为大小相同的K个分区。对于每个分区i,在剩余的K-1个分区上训练模型,然后再分区i上评估模型。最终分数等于K个分数的平均值。
训练集(training)、验证集(validation)和测试集(test)
文章图片

k=4 num_validation_samples=len(data)//k# 验计算得证集的样本数np.random.shuffle(data)# 数据打乱validation_scores=[]# 储存每折的验证集得分 for fold in range(k): validation_data=https://www.it610.com/article/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折验证分数又是每折的均值)。

    推荐阅读