问题描述
我有一个信用卡数据集,其中 98% 的交易是非欺诈,2% 是欺诈。
我一直在尝试在训练和测试拆分之前对多数类进行欠采样,并在测试集上获得非常好的召回率和准确率。
当我仅在训练集上进行欠采样并在独立集上进行测试时,我得到的精度非常差,但召回率相同!
我的问题是:
在拆分成 train 和 test 之前我是否应该欠采样,这会扰乱数据集的分布并且不能代表现实世界吗?
还是上述逻辑只适用于过采样?
谢谢
解决方法
如果您有机会收集更多数据,那可能是最好的解决方案。 (假设您已经尝试过此步骤)
如果精确度差且召回率好,这表明您的模型擅长将欺诈类别预测为欺诈,但该模型对于非欺诈类别却令人困惑,大多数情况下它将非欺诈类别预测为欺诈(如果您为多数类设置 0 为少数类设置 1)。 这意味着您必须尝试降低多数类的欠采样率。
通常欠采样/过采样将仅在训练拆分时进行,这是正确的方法。 然而,
-
在欠采样之前,请确保您的训练分割具有与主数据集相同的类分布。 (分裂时使用分层)
-
如果您使用 python
sklearn
库来训练分类器,请设置参数class_weight='balanced'
。
例如:
from sklearn.linear_model import LogisticRegression
Lr = LogisticRegression(class_weight='balanced')
- 尝试使用具有不同超参数的不同算法,如果模型欠拟合,则考虑选择 XGboost。
如果您在拆分之前进行欠采样,则测试拆分分布可能无法复制真实世界数据的分布。因此,人们通常在拆分之前避免抽样。