【发布时间】:2021-11-05 02:08:41
【问题描述】:
任务是通过神经网络进行二元分类。数据存在于字典中,其中包含每个条目的复合名称(作为键)和标签(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]
或者 train_test_split 方法:
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_split 类似的训练测试数据分布,这在训练期间似乎是正确的,两个训练集的准确度都约为 0.82仅在一个 epoch 之后,使用 model.fit() 单独运行。然而,当相应的模型在所述时期之后的测试集上使用 model.evaluate() 进行评估时,来自 train_test_split 的集合给出了~0.86 的分数,而来自 Kfold 的集合是~0.72。我做了很多测试,看看它是否只是一个坏的随机种子,它没有界限,但结果保持不变。这些集合还具有正确平衡的标签分布和看似良好的混洗条目。
【问题讨论】:
标签: python machine-learning scikit-learn k-fold