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