仅过采样/欠采样仅训练集或训练集和验证集

数据挖掘 数据 训练 打击
2021-09-17 14:13:29

我正在研究一个存在类不平衡问题的数据集。现在,我知道只需要对训练集而不是测试集进行过采样或欠采样。但我的问题是:是对训练集进行过采样,然后将其拆分为训练和验证集,还是先拆分为训练集和验证集,然后仅对训练集执行采样(上/下)

2个回答

过采样训练数据而不是验证数据,因为如果训练数据不平衡,您的测试数据很可能会显示相同的特征并且不平衡。

如果您不知道测试数据是否平衡,请仅对训练数据进行过采样。

但是我会亲自给你一个建议,因为我不久前遇到了同样的问题。

对数据进行过采样(训练)测试验证数据的准确性(未过采样)使用不进行过采样(或您执行的任何一个欠采样)获得的准确性来测试此准确性

如果结果仅略有不同,请在非过采样数据上训练模型。原因是由于过采样技术会在属于同一类的当前数据点附近引入数据点,这可能无法准确地描述您的测试数据。

在这种情况下,您可以做两件事

  1. 如果可用,调整模型参数

例如:如果使用随机森林,它在模型中有一个名为“class_weight”的参数,如果保持在“平衡”,则会对每个输出变量赋予相等的权重,这将与输入中的类频率成反比

其他模型也可以使用类似的参数(逻辑回归等)

  1. 使用 train_test_split 分割数据时设置参数分层

例子 :train_test_split(train_data, df['target_column'], stratify = df['target_column'])

Stratify 将确保您的训练和验证数据根据基于训练数据的输出标签频率进行拆分。就像数据对于“A”类的数据是 90,对于“B”类的数据是 10。拆分后,训练和验证将有 90:10 的班级比例

如果您未来的数据也带有不平衡(部署后),请不要平衡验证集,仅在训练集中进行过采样/欠采样。如果您平衡验证集,您的模型可能会运行良好(可能会在 Val 中获得更好的分数)但在未来部署后,它可能不会更好地运行,因此在训练时,仅使用不平衡数据进行验证。