训练/测试拆分之前或之后的欠采样

Posted

技术标签:

【中文标题】训练/测试拆分之前或之后的欠采样【英文标题】:Undersampling before or after Train/Test Split 【发布时间】:2021-05-13 03:30:07 【问题描述】:

我有一个信用卡数据集,其中 98% 的交易是非欺诈交易,2% 是欺诈交易。

我一直在尝试在训练和测试拆分之前对多数类进行欠采样,并在测试集上获得非常好的召回率和精度。

当我只对训练集进行欠采样并在独立集上进行测试时,我得到的精度很差,但召回率相同!

我的问题是:

我应该在拆分为 train 和 test 之前进行欠采样吗,这是否会影响数据集的分布并且不能代表现实世界?

还是说上面的逻辑只适用于过采样的时候?

谢谢

【问题讨论】:

【参考方案1】:

如果您有机会收集更多数据,那可能是最好的解决方案。 (假设您已经尝试过这一步)

如果准确率很差,召回率很好,这表明您的模型擅长将欺诈类预测为欺诈,但该模型对非欺诈类感到困惑,大多数情况下它会将非欺诈类预测为欺诈(如果您为多数类设置 0 1 为少数类)。 这意味着您必须尝试降低多数类的欠采样率。

通常欠采样/过采样只会在火车拆分时进行,这是正确的方法。 然而,

    在进行欠采样之前,请确保您的训练拆分具有与主数据集相同的类分布。 (拆分时使用分层)

    如果您使用 python sklearn 库来训练分类器,请设置参数 class_weight='balanced'

例如:

   from sklearn.linear_model import LogisticRegression
   Lr = LogisticRegression(class_weight='balanced')
    尝试使用具有不同超参数的不同算法,如果模型拟合不足,则考虑选择 XGboost。

如果您在拆分前进行欠采样,则测试拆分分布可能无法复制真实数据的分布。因此,人们通常会避免在拆分之前进行抽样。

【讨论】:

这是一个非常有用的答案。我还有几个问题:1.“这意味着您必须尝试降低多数类的欠采样率。”你的意思是我不应该对大多数班级进行过低采样吗?例如,如果我有 100 人占多数,2 人占少数(仅限火车)。当前采样使两者都为 2-2。 , 2.欠采样后不能使用类权重参数对吗?因为我们已经使多数和少数类的样本数量相等。我可以采取哪些步骤来提高精度,召回率接近 0.75,但使用 xgboost 的精度也是 0.03 尝试使用不同的采样率和不同的权重比(多数:少数)50%:50%、40%:60%、30%:70% 等,看看哪个会得到更好的结果。您可以使用class_weight 参数轻松完成此操作,而无需执行手动采样(如您所知)。然而,通常对于这种目标,FP 不是代价高昂的错误,但 FN 是。因此,我们可以将更多的兴趣放在增加 Recall 上。 查看,在类似的真实案例中,如果单个欺诈交易被错误分类为非欺诈,那么它会对业务产生非常严重的影响(即使对于单个 FN 也是如此)。假设如果一个非欺诈交易被预测为欺诈FP),它不会(或非常少)影响业务收入,因为后来通过进一步的业务检查,我们了解到这被错误归类为欺诈。但该模型不应该提供任何机会来逃避真正的欺诈,因为它需要立即采取行动。因此我提到对于这种的情况,FNFP要贵很多。 假设您正在处理任何产品评论的情感分类之类的业务问题,在这种情况下,RecallPrecision b> 很重要。希望有帮助

以上是关于训练/测试拆分之前或之后的欠采样的主要内容,如果未能解决你的问题,请参考以下文章

为不平衡二元分类对数据进行过采样的过程

过采样类不平衡训练/测试拆分“发现样本数量不一致的输入变量”解决方案?

ScikitLearn 随机森林中的欠采样与 class_weight

测试折叠上的 CV 和欠采样

机器学习——评估方法

机器学习——评估方法