训练/测试拆分之前或之后的欠采样
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),它不会(或非常少)影响业务收入,因为后来通过进一步的业务检查,我们了解到这被错误归类为欺诈。但该模型不应该提供任何机会来逃避真正的欺诈,因为它需要立即采取行动。因此我提到对于这种的情况,FN比FP要贵很多。
假设您正在处理任何产品评论的情感分类之类的业务问题,在这种情况下,Recall和Precision b> 很重要。希望有帮助以上是关于训练/测试拆分之前或之后的欠采样的主要内容,如果未能解决你的问题,请参考以下文章
过采样类不平衡训练/测试拆分“发现样本数量不一致的输入变量”解决方案?