【发布时间】:2023-12-17 17:55:02
【问题描述】:
我正在研究一个类别非常不平衡的分类问题。我的数据集中有 3 个类:0,1 类和 2 类。0 类是训练集的 11%,1 类是 13%,2 类是 75%。
我使用了随机森林分类器并获得了 76% 的准确率。但我发现 93% 的准确率来自 2 类(多数类)。这是我得到的Crosstable。
我想要的结果:
- 0 类和 1 类的假阴性更少或/和 0 类和 1 类的假阳性更少
我在互联网上找到解决问题的方法以及我尝试过的方法:
-
使用 class_weight='balanced' 或自定义 class_weight(0 类为 1/11%,1 类为 1/13%,2 类为 1/75% ),但它不会改变任何东西(准确性和交叉表仍然相同)。你对此有解释/解释吗?
-
我知道在这种情况下准确度并不是最好的指标,我使用了其他指标:precision_macro、precision_weighted、f1_macro 和 f1_weighted,我为每个类实现了精确率与召回率曲线下的面积,并使用平均值作为指标。
这是我的代码(欢迎反馈):
from sklearn.preprocessing import label_binarize
def pr_auc_score(y_true, y_pred):
y=label_binarize(y_true, classes=[0, 1, 2])
return average_precision_score(y[:,:],y_pred[:,:])
pr_auc = make_scorer(pr_auc_score, greater_is_better=True,needs_proba=True)
这是precision vs recall curves 的情节。
唉,对于所有这些指标,交叉表保持不变......它们似乎没有任何效果
-
我还调整了 Boosting 算法(XGBoost 和 AdaBoost)的参数(以准确度为指标),但结果并没有得到改善。我不明白,因为 boosting 算法应该处理不平衡的数据
-
最后,我使用了另一个模型 (BalancedRandomForestClassifier),我使用的指标是准确度。正如我们在crosstab 中看到的那样,结果很好。我很高兴得到这样的结果,但我注意到,当我更改此模型的指标时,结果再次没有变化......
所以我真的很想知道为什么使用 class_weight、更改指标或使用提升算法不会带来更好的结果...
【问题讨论】:
-
您是否尝试过使用权重数组的 Xgboost?我使用 xgboost 进行不平衡的二元类分类,并设置 scale_pos_weight 提高了模型的性能。由于你有一个多类分类你不能使用 scale_pos_weight 除非你使用 one vs rest 方法,但是你可以使用权重数组,这应该可以解决问题。
标签: random-forest metrics multilabel-classification imbalanced-data boosting