为什么10倍交叉验证的准确度得分比使用sklearn进行的9010系列测试分割的准确度得分最差?

2024-10-01 22:30:41 发布

您现在位置:Python中文网/ 问答频道 /正文

任务是通过神经网络进行二元分类。数据存在于字典中,其中包含每个条目的复合名称(作为键)和标签(0或1,作为向量值中的第三个元素)。第一个和第二个元素是组合名称的两部分,稍后用于提取相应的特征

在这两种情况下,字典被转换为两个数组,以便对多数类(66%的数据中存在)执行平衡欠采样:

data_for_sampling = np.asarray([key for key in list(data.keys())])
labels_for_sampling = [element[2] for element in list(data.values())]

sampler = RandomUnderSampler(sampling_strategy = 'majority')
data_sampled, label_sampled = sampler.fit_resample(data_for_sampling.reshape(-1, 1), labels_for_sampling)

然后使用重新采样的名称和标签数组,通过Kfold方法创建训练集和测试集:

kfolder = KFold(n_splits = 10, shuffle = True)
kfolder.get_n_splits(data_sampled)

for train_index, test_index in kfolder.split(data_sampled):

        data_train, data_test = data_sampled[train_index], data_sampled[test_index]

或列车试验分割法:

data_train, data_test, label_train, label_test = train_test_split(data_sampled, label_sampled, test_size = 0.1, shuffle = True)

最后,使用data_train和data_test中的名称从原始词典中重新提取相关条目(按键),然后使用这些条目收集这些条目的特征。就我而言,10个折叠集的单个拆分应提供与90-10个train_test_拆分类似的列车测试数据分布,这似乎在训练期间是正确的,其中两个训练集仅在一个历元后产生约0.82的精度,分别使用model.fit()运行。但是,当使用model.evaluate()对上述历元之后的测试集评估相应的模型时,train_test_split中的集给出~0.86分,而Kfold中的集给出~0.72分。我做了很多测试,看看它是否只是一个坏的随机种子,它是没有边界的,但结果保持不变。这些集合还具有正确平衡的标签分布和看似混乱的条目


Tags: 数据intest名称fordataindex条目
2条回答

事实证明,问题源于多种来源的组合:

虽然train_test_split()方法中的shuffle=True首先正确地洗牌提供的数据,然后将其分割为所需的部分,但Kfold方法中的shuffle=True只会导致随机构建的折叠,但是折叠中的数据保持有序

由于这篇文章,文档指出了这一点: https://github.com/scikit-learn/scikit-learn/issues/16068

现在,在学习过程中,我的自定义train函数再次对train数据应用shuffle,这只是为了确保,但它不会对测试数据进行shuffle。此外,如果没有给出参数,model.evaluate()默认为batch_size=32,这与有序测试数据相匹配,导致验证精度不一致。测试数据确实存在缺陷,因为它包含大量“难以预测”的条目,这些条目由于排序而聚集在一起,似乎它们降低了结果的平均准确性。正如TC Arlen所指出的那样,如果对所有N个褶皱进行完整的扫描,最终可能会给出更精确的估计,但我预计仅进行一次扫描后会得到更接近的结果,这导致了这个问题的发现

根据数据中的噪声量和数据集的大小,这可能会导致样本外数据的分数偏离此值。一个分割不能保证和其他分割一样,这就是为什么你首先有10个分割,然后在所有结果中取平均值

你应该相信最具普遍性的是而不是任何一个给定的分割(无论是来自10个折叠中的一个还是^{),但更值得信赖的是所有N个折叠的平均结果

深入挖掘数据可能会揭示一个或多个拆分与另一个拆分偏离如此大的原因。例如,您的数据中可能存在某些特征(例如,“样本采集日期”和采集方法每月都有变化),使得数据之间存在偏差。如果是这种情况,你应该使用分层测试分割(在你的简历中也是如此)(参见scikit-learn documentation on that),这样你就可以得到一个更公正的数据分组

相关问题 更多 >

    热门问题