使用 SMOTE 后导致高误报的不平衡数据集

Posted

技术标签:

【中文标题】使用 SMOTE 后导致高误报的不平衡数据集【英文标题】:Unbalanced dataset resulting in high false positives after using SMOTE 【发布时间】:2019-10-05 12:30:09 【问题描述】:

我正在研究一个二元分类不平衡营销数据集,它具有:

    否:是的比例为 88:12(否-未购买该产品,是-已购买) ~4300 个观察值和 30 个特征(9 个数值和 21 个分类)

我将数据分为训练 (80%) 和测试 (20%) 集,然后在训练集上使用 standard_scalar 和 SMOTE。 SMOTE 将训练数据集的“否:是”比率设为 1:1。然后我运行了一个逻辑回归分类器,如下面的代码所示,在测试数据上获得了 80% 的召回分数,而在没有 SMOTE 的情况下应用逻辑回归分类器,测试数据的召回率仅为 21%。

使用 SMOTE,召回率提高很大,但误报率很高(请参阅混淆矩阵的图片),这是一个问题,因为我们最终会针对许多虚假(不太可能购买)客户。有没有办法在不牺牲召回/真阳性的情况下降低误报?

#Without SMOTE
clf_logistic_nosmote = LogisticRegression(random_state=0, solver='lbfgs').fit(X_train,y_train)

#With SMOTE  (resampled train datasets) 
clf_logistic = LogisticRegression(random_state=0, solver='lbfgs').fit(X_train_sc_resampled, y_train_resampled)

【问题讨论】:

一开始每个类的value_counts是多少??您总共使用了多少个功能?在进行特征工程之后? 总样本 = 4334,value_counts:0 = 3832 (88%),1 = 502 (12%) 特征工程后的总特征 = 30(9 个数字,21 个分类) 【参考方案1】:

即使我也遇到过类似的问题,误报率非常高。在那种情况下,我在做特征工程后应用了 SMOTE。

然后我在做特征工程之前使用了 SMOTE,并使用 SMOTE 生成的数据来提取特征。这样它工作得很好。虽然,这将是一种较慢的方法,但它对我来说很有效。让我知道你的情况。

【讨论】:

以上是关于使用 SMOTE 后导致高误报的不平衡数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何计算分层 K 折交叉验证的不平衡数据集的误报率?

scikit-learn 中的不平衡

weka中的不平衡数据集?不工作

从信用卡欺诈模型看不平衡数据分类数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制。过采样后模型选择RFxgboost神经网络能够取得非常不错的效果。模型层面:

python使用imbalanced-learn的SMOTE方法进行上采样处理数据不平衡问题

数据预处理-非平衡样本的处理方式(SMOTE--待补充)