对于高度不平衡的数据集,成本敏感分类器失败

问题描述

我将尝试使其尽可能具体,但这也是一个普遍的问题。我有一个严重偏斜的数据集,其顺序为{ 'Class 0': 0.987,'Class 1':0.012 } 我想拥有一组在这类数据集上可以很好地工作的分类器,然后为这些模型创建一个整体学习器。我认为我不想过采样或欠采样。我绝对不希望进行SMOTE,因为它们无法很好地缩放高维数据/或导致大量数据点。我想使用一种成本敏感的方法来创建我的分类器,因此遇到了class_weight=balanced库中的scikit-learn参数。但是,它似乎并没有太大帮助,因为我的F1分数仍然非常糟糕(在0.02等范围内)。我还尝试使用sklearn.utils.class_weight.compute_class_weight来手动计算权重,并将其存储在字典中并将其作为参数传递给class_weight参数,但是我发现F1得分没有任何改善,我的误报率仍然很高(大约5k),其他所有东西都非常低(小于50)。我不明白我在想什么。我执行错误吗?我还能做什么来解决我的问题?当我将评估指标从f1_score(average='binary')更改为f1_score(average='weighted')时,F1分数从〜0.02增加到〜98.66,我认为这可能是错误的。任何形式的帮助(包括有关如何解决此问题的参考)都将非常有帮助。

我正在尝试实现XGBOOST,catboost,LightGBM,Logistic回归,SVC('linear'),随机森林分类

解决方法

我意识到这个问题源于纯真的天真。我通过使用imbalanced-learn Python库解决了我的问题。诸如imblearn.ensemble.EasyEnsembleClassifier之类的算法在重度不平衡分类中是天赐之物,其中少数类别比多数类别更为重要。对于任何遇到这种麻烦的人,我建议您尝试寻找一种不同于平时喜欢的算法的算法,以帮助您解决问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...