问题描述
我将尝试使其尽可能具体,但这也是一个普遍的问题。我有一个严重偏斜的数据集,其顺序为{ '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
之类的算法在重度不平衡分类中是天赐之物,其中少数类别比多数类别更为重要。对于任何遇到这种麻烦的人,我建议您尝试寻找一种不同于平时喜欢的算法的算法,以帮助您解决问题。