sklearn中的类权重无效

数据挖掘 scikit-学习 交叉验证 网格搜索
2022-01-28 09:01:10

我正在处理一个不平衡的数据集,并且像往常一样很容易获得高准确率,但不太频繁的类的召回率非常低。我想改进频率较低的课程的假阴性。

专注于 sklearn 随机森林的具体性,一种可能的策略是设置一个 class_weight 来惩罚频率较低的类上的错误,并使用 sklearn 评分函数作为 ROC 进行评分。

grid = GridSearchCV(pipe, cv=number_of_cross_validations, n_jobs=1, param_grid=param_grid , scoring = scorer)
classifier = grid.fit(X_train, y_train)

管道在哪里pipe包含 RandomForestClassifier 并且param_grid包含不同class_weight的尝试。

我的问题可能与这个问题有关,确实class_weight单独似乎不足以显着降低假阴性。作为一个极端的例子,如果我设置:

 class_weight = {0: 0.0000001, 1: 0.9999999} 

(其中 1 是实例较少的类,比率为 1:50),我希望最终的分类器几乎总是预测 1,因为每次出错时付出的成本都非常高。但事实并非如此,拟合的分类器继续产生大量的假阴性。为什么会这样?

2个回答

这很可能是因为 sklearn 为您选择了您的多数类,您只需要以相反的方式权衡您的类,“0”是多数类。

如果您的类没有类重叠问题,您可能想尝试一些重新采样技术。您可以对记录较少的类进行过采样,或者查看 SMOTE 、ROSE 等包。

SMOTE 的好例子:https ://www.kaggle.com/qianchao/smote-with-imbalance-data#