拆分数据集(train和test)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拆分数据集(train和test)相关的知识,希望对你有一定的参考价值。

参考技术A 随机读取文件夹下面的所有文件名,写入到txt

百度百科:交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。

训练数据集:训练模型;
验证数据集:验证模型的效果;如果模型的效果不好,则重新调整参数再次训练新的模型,直到找到了一组参数,使得模型针对验证数据集来说已经达到最优了;(调整超参数使用的数据集)
测试数据集:将此数据集传入由验证数据集得到的最佳模型,得到模型最终的性能;(作为衡量最终模型性能的数据集)

将原始数据集分割为训练数据集和测试数据集,再将训练数据集分割为 k 个样本子集,依次遍历这k个子集,每次把当前子集作为验证集,其余所有子集作为训练集。这样算是一次实验,而k折交叉验证只有实验k次才算完成完整的一次,也就是说交叉验证实际是把实验重复做了k次(保证k个部分的数据都分别做过验证集)训练出 k 个模型,每一个模型都在对应的验证数据集上求出其性能的指标,k 个模型的性能指标的平均值作为最终衡量该组参数对应的模型的性能指标。
一组参数训练出 k 个模型,如果最终指标不理想,重新调整参数,再次得到这 k 个模型的性能指标的均值。
借鉴 https://www.cnblogs.com/volcao/p/9291831.html

跨不同数据集扩展的最佳方法

【中文标题】跨不同数据集扩展的最佳方法【英文标题】:Best way to scale across different datasets 【发布时间】:2019-09-21 23:30:54 【问题描述】:

我在预处理数据时遇到了一种特殊情况。

假设我有一个数据集A。我将数据集拆分为A_trainA_test。我使用任何给定的缩放器(sci-kit learn)拟合A_train,并用scaler转换A_test。现在使用A_train 训练神经网络并在A_test 上进行验证效果很好。没有过拟合,性能很好。

假设我有数据集B,其特征与A 中的特征相同,但特征值的范围不同。 AB 的一个简单示例可以分别是波士顿和巴黎的住房数据集(这只是一个类比,说成本、犯罪率等特征范围差异很大)。为了测试上述训练模型在B 上的性能,我们根据A_train 的缩放属性对B 进行变换,然后进行验证。这通常会降低性能,因为此模型从未显示来自B 的数据。

奇怪的是,如果我直接在B 上进行拟合和变换,而不是使用A_train 的缩放属性,性能会好很多。通常,如果我在A_test 上进行测试,这会降低性能。在这种情况下,它似乎工作,虽然它不正确。

由于我主要研究气候数据集,因此对每个数据集都进行培训是不可行的。因此,我想知道使用相同特征扩展此类不同数据集以获得更好性能的最佳方法。

任何想法,请。

PS:我知道用更多数据训练我的模型可以提高性能,但我对正确的扩展方式更感兴趣。我尝试从数据集中删除异常值并应用QuantileTransformer,它提高了性能但可能会更好。

【问题讨论】:

如果住房数据集的并行性成立,我不明白为什么针对特定上下文训练的模型应该适用于另一个上下文。有些功能和动态可以匹配,有些则不匹配。基于错误的假设,您的模型可能存在严重缺陷。 我没有说住房数据集的并行性成立,我的意思是另一个数据集具有相同的特征,但它们完全处于不同的范围内。如果您知道巴黎或加利福尼亚的成本有多高。该引用是为了显示一个类比。这就像在美国训练气候模型并预测欧洲气候。我总是可以通过显示更多数据来提高性能,但是有一个限制。 【参考方案1】:

一个可能的解决方案可能是这样的。

    对数据集 A 进行标准化(预处理),使每个特征的范围都在一个固定的区间内,例如 [-1, 1] 之间。 在标准化集 A 上训练您的模型。

    每当你得到一个像 B 这样的新数据集时:

    (3.1.) 对新数据集进行归一化,以使特征具有与 A 中相同的范围 ([-1, 1])。 (3.2) 将经过训练的模型(步骤 2)应用于标准化的新集 (3.1)。

    由于集合 B 与其标准化版本之间存在一对一映射,因此您可以根据标准化集合 B 的预测来查看集合 B 的预测。

    李>

请注意,您无需提前访问集合 B(如果有数百个集合,则无需访问此类集合)。一旦给你一个并且你想在它上面测试你训练过的模型,你就可以对它们进行标准化。

【讨论】:

当然可以。但这是一个肮脏的把戏,因为你总是事先不知道数据集 B。 请帮助我正确理解问题。您获得了数据集 A,并在其上训练了一个模型,然后您想在其他数据集上使用该模型(但具有不同的特征范围)?还是有别的问题? 是的,你没看错。您错过的是,有超过 1000 个不同的数据集,例如 B,您不能将其包含在预处理中。有时,在有人对您的模型进行测试之前,您不会知道它们的存在。一般来说,缩放比例越高,模型在不同数据集上的效果就越好,因为无论如何神经网络都具有良好的泛化能力。 也许我写的不是很清楚。我编辑了那个。基本上,您不需要知道或在预处理中包含 B 组(或多个组)。您只需对集合 A 进行归一化,然后对其进行训练。一旦你得到一个新的集合,你就可以在旅途中对其进行标准化。 很抱歉,您似乎忽略了我的问题中的一些内容。您发布的解决方案已经在我的问题中。需要明确的是,您仍然在谈论 A_test 而不是 B

以上是关于拆分数据集(train和test)的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn train_test_split 拆分数据集以将预测标签与地面实况标签进行比较

TensorFlow 数据集拆分不起作用

AI - MLCC06 - 训练集和测试集 (Training and Test Sets)

用于拆分训练集和测试集的函数 train_test_split

模型训练与优化

跨不同数据集扩展的最佳方法