在对大多数 class 进行欠采样后,训练集 < 测试集是否可行?

Is it feasible to have the training set < the test set after undersampling the majority class?

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

我用这个数据集构建了一个随机森林用于class化。我从过去的经验中知道,如果我使用整个数据集,召回率很低,这可能是由于不平衡 class.

所以我决定欠采样Class0。我的步骤如下:

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

  2. 现在训练集有 ~900 个 Class 0 ~100 的数据用于 Class 1。我聚类了 ~900 个 Class 0 的数据,并且欠采样它(按比例)到 ~100 条记录。

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

我的问题来了:

1) 我的步骤有效吗?我先拆分 train/test,然后对训练集的大部分 class 进行欠采样。

2) 现在我的训练集 (~200) < 测试集 (450)。有道理吗?

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

非常感谢您的帮助!

1) Are my steps valid? I split the train/test first and then undersample the majority class of the train set.

您应该将 traintest 分开,这样 class 的余额将保留在两个 中。如果在你的 整个数据集 中比率是 6.5:1 它应该在 traintest 中相同。

是的,你应该在欠采样之前拆分它(不需要欠采样 test 个案例),只记得监控多个指标(例如 f1 scorerecallprecision 已经提到过,你应该没问题)因为你正在接受与 test.

不同的分布训练

2) Now my train set (~200) < test set (450). Does it make sense?

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

3) The performance is still not very good. Precision is 0.34, recall is 0.72 and the f1 score is 0.46. Is there any way to improve? Should I use CV?

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

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