首页 > 解决方案 > 在对多数类进行欠采样后,让训练集 < 测试集是否可行?

问题描述

我有一个包含 1500 条记录的数据集,其中有两个不平衡的类。0 类是 1300 条记录,而 1 类是 200 条记录,因此比率为 6.5:1。

我用这个数据集构建了一个随机森林进行分类。我从过去的经验中知道,如果我使用整个数据集,召回率非常低,这可能是由于类别不平衡造成的。

所以我决定对0类进行欠采样。我的步骤如下:

  1. 将数据集随机分成比例为 7:3 的训练和测试集(因此 1050 用于训练,450 用于测试。)

  2. 现在,训练集有约 900 个 0 类数据 ~100 类 1 类数据。我对 0 类约 900 个数据进行聚类,并将其(按比例)欠采样到约 100 条记录。

所以现在训练集 ~100 Class 0 + ~100 Class 1 = ~200 条记录,而测试集是 70 Class 0 + 380 Class 1 = 450 条记录。

我的问题来了:

1) 我的步骤有效吗?我首先拆分训练/测试,然后对训练集的多数类进行欠采样。

2)现在我的训练集(~200)<测试集(450)。是否有意义?

3) 性能仍然不是很好。精度为 0.34,召回率为 0.72,f1 得分为 0.46。有什么方法可以改善吗?我应该使用简历吗?

非常感谢您的帮助!

标签: pythontensorflowmachine-learningdata-scienceimbalanced-data

解决方案


1) 我的步骤有效吗?我首先拆分训练/测试,然后对训练集的多数类进行欠采样。

您应该拆分traintest因此在两者中都保留了类平衡。如果在您的整个数据集中,比率在和6.5:1中应该相同。traintest

是的,您应该在欠采样之前对其进行拆分(无需对test案例进行欠采样),只需记住监控多个指标(例如f1 score,已经提到过,您应该可以接受这些指标),因为您正在训练recall与.precisiontest

2)现在我的训练集(~200)<测试集(450)。是否有意义?

是的,它确实。您也可以选择oversampling训练数据集(例如minority随机重复类以匹配来自 的示例数量majority)。在这种情况下,您也必须先拆分,否则您可能会test用样本破坏您的集合,training这将是更加灾难性的。

3) 性能仍然不是很好。精度为 0.34,召回率为 0.72,f1 得分为 0.46。有什么方法可以改善吗?我应该使用简历吗?

这取决于具体问题,我会做什么:

  • oversampling而不是undersampling- 神经网络需要大量数据,你现在没有很多样本
  • 尝试其他非 DL 算法(SVM如果你有很多功能?RandomForest否则可能也是一个不错的选择)
  • 否则微调你的神经网络(特别关注learning rate,如果你有时间,使用 CV 或相关方法)
  • 如果可用于手头的任务,请尝试使用一些预训练的神经网络

推荐阅读