首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证数据和测试数据的确切区别是什么?

验证数据和测试数据的确切区别是什么?
EN

Data Science用户
提问于 2022-01-21 21:22:08
回答 3查看 258关注 0票数 2

我在堆栈溢出问题上问了这个问题,并被告知这是一个更好的地方。

我对术语验证和测试感到困惑,验证模型和测试是一样的吗?是否可以使用测试数据进行验证?

更让我困惑的是,何时使用验证?对于模型来说,这是必要的一步吗?另外,是否有可能进行验证而不是测试?

培训数据也可以与验证数据相同吗?

您还能知道这段代码是否进行测试吗?我真的很困惑

代码语言:javascript
复制
model.fit_generator(
    training_gen(1000,25),
    steps_per_epoch=50,
    epochs=10000,
    validation_data=validation_gen(1000, 25),
    validation_steps=1,
    callbacks=[checkpoint],
    verbose=2)

model.load_weights('./temp_trained_25.h5')
BER = []
for SNR in range(5, 30, 5):
    y = model.evaluate(
        validation_gen(10000, SNR),
        steps=1
    )
    BER.append(y[1])
    print(y)
print(BER)

注意到training_gen和validation_gen是:

代码语言:javascript
复制
def training_gen(bs, SNRdb = 20):
    while True:
        index = np.random.choice(np.arange(train_size), size=bs)
        H_total = channel_train[index]
        input_samples = []
        input_labels = []
        for H in H_total:
            bits = np.random.binomial(n=1, p=0.5, size=(payloadBits_per_OFDM,))
            signal_output, para = ofdm_simulate(bits, H, SNRdb)
            input_labels.append(bits[0:16])
            input_samples.append(signal_output)
        yield (np.asarray(input_samples), np.asarray(input_labels))


def validation_gen(bs, SNRdb = 20):
    while True:
        index = np.random.choice(np.arange(train_size), size=bs)
        H_total = channel_train[index]
        input_samples = []
        input_labels = []
        for H in H_total:
            bits = np.random.binomial(n=1, p=0.5, size=(payloadBits_per_OFDM,))
            signal_output, para = ofdm_simulate(bits, H, SNRdb)
            input_labels.append(bits[0:16])
            input_samples.append(signal_output)
        yield (np.asarray(input_samples), np.asarray(input_labels))

我对深入学习很陌生,似乎一切都让我困惑,如果我的问题看起来毫无根据,我很抱歉,但如果你能帮我解决这个困惑,我会很感激。

提前感谢!

EN

回答 3

Data Science用户

回答已采纳

发布于 2022-01-22 01:46:16

通常,您首先将数据集拆分为列车/测试集,然后如果模型培训过程需要验证集,则可以将培训集进一步拆分为最终的火车集和验证集。一个简单的规则是,测试集永远不会出现在您的模型开发过程中,包括在您开发数据预处理步骤(例如数据规范化器)时。

在以下情况下,您需要一个验证集:

  1. 训练梯度增强决策树(lgbm、xgboost等)启用了早期停止。因为它需要在每个培训步骤之后使用验证集来评估您的模型,以确定是否满足了早期停止条件。
  2. 训练神经网络。这是可选的,但建议,因为您可以获得验证分数曲线,除了始终-那里的培训分数曲线,以监测您的模型是否开始过度适合。当您使用早期停止时,这是必需的。
  3. 你在做交叉验证。其思想是用相同的超参数集N次拟合模型,但每次都使用不同的训练集和验证集。通过这种方式,您可以了解同一组超参数是如何为不同的数据场景工作的。

一个验证集应该只起一个作用,所以如果同时执行1和3,那么首先将数据分割成火车/测试集。然后,在每个交叉验证回合(从N轮中),您将您的火车集分成另一个火车集和1^{st}验证集。然后,在培训您的GBDT模型时,您再次将您的培训集划分为最终的培训集和您的2^{nd}验证集。您的1^{st}验证集用于交叉验证。您的2^{nd}验证集用于GBDT早期停止。

对于您的代码,我看到了两个潜在的问题:

  1. 如果数据源是channel_train,那么train_genvalid_gen都来自同一个源,但是随机生成器的选择是不同的。这是一个问题,因为您不能保证您的列车和您的有效数据是相互不同的。
  2. 你给你的有效基因打了两次电话。第一次作为第2点的目的,我在上面已经说过了。第二次应该达到测试的目的--这就是你所要求的。但是,也可能无法确定测试数据和列车数据不重叠。

因此,您有执行所有操作的代码,但是您可能没有确保train/valid/test数据是相互排斥的。

票数 4
EN

Data Science用户

发布于 2022-01-21 21:59:54

您可以使用测试数据来执行超参数优化,以查看模型管道中哪些超参数工作得最好。然后,验证数据只使用一次来查看整个模型管道是如何在样本外数据上工作的。对于此过程,不能再次使用测试数据集,因为这些数据已经用于选择最佳的超参数。测试和验证的过程是相同的(即在样本外数据上测试模型的性能),但是应用这些概念的模型开发阶段是不同的。

票数 1
EN

Data Science用户

发布于 2022-01-22 23:26:12

这个问题证明了科学方法已经迷失在ML世界关于模型的传播方式中,它会让学生在进入行业工作时感到困惑。

让我们通过对即将到来的赛季足球队训练的隐喻来说明不同之处。

  • 大部分时间都会花在练习核心技术上,比如传球、踢、防守等,以及在队形上的训练。这是训练数据。
  • 每次练习结束后,球队将进行一场对战比赛,看看球员们能把他们的技术运用到实践中去。这是验证数据。
  • 最后,球队可能会在季前赛中与邻近的对手进行一场表演赛,看看他们对赛季开始的准备如何。这是测试数据。

当你在学校的时候,你通常会从大量的标签数据开始,并随机地将其划分为训练、验证和测试数据集。这并不一定是坏事,但它掩盖了数据集服务的不同目的。

培训数据应该是廉价的、丰富的和多样化的--这就是你的模型将用来实际学习的东西。验证数据是为了确保你的模型在训练过程中真的变得更好了--你不想要一支擅长训练,但在实际比赛中却很糟糕的足球队。测试数据是一个最终的检查,您的模型可以在尽可能接近它将看到的条件下运行。通常,测试看起来与培训和验证非常不同--例如,您可能在标记的输入数据上训练和验证一个分类器,但随后在一些下游任务上测试模型,这些下游任务使用分类器作为输入特性的来源。

票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/107327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档