不平衡二元分类问题的最佳阈值

Posted

技术标签:

【中文标题】不平衡二元分类问题的最佳阈值【英文标题】:Optimal threshold for imbalanced binar classification problem 【发布时间】:2020-05-29 14:45:04 【问题描述】:

我无法优化二元分类的阈值。我正在使用 3 个模型:逻辑回归、Catboost 和 Sklearn RandomForestClassifier。

对于每个模型,我都在执行以下步骤:

1) 拟合模型

2) 第一类(属于数据集的 5%)的召回率为 0.0,零类的召回率为 1.0。 (这不能用 gridsearch 和 class_weight='balanced' 参数来解决。)>:(

3) 找到最佳阈值

fpr, tpr, thresholds = roc_curve(y_train, model.predict_proba(X_train)[:, 1])
optimal_threshold = thresholds[np.argmax(tpr - fpr)]

4) 两个课程的召回率都达到 70 左右。

5) 预测测试数据集的概率,并使用我上面计算的最佳阈值来获取类。

问题来了: 当我一次又一次地启动代码时,如果我不修复 random_state,最佳阈值会发生变化,并且会急剧变化。这导致基于测试样本的准确度指标发生巨大变化。

我是否需要计算一些平均阈值并将其用作恒定的硬值?或者也许我必须到处修复 random_state ?或者可能是找到最佳阈值的方法不正确?

【问题讨论】:

【参考方案1】:

如果您不将random_state 设置为固定值,则每次运行的结果都会有所不同。要获得可重复的结果集 random_state 在任何需要固定值的地方,或者使用固定的 numpy 随机种子 numpy.random.seed

https://scikit-learn.org/stable/faq.html#how-do-i-set-a-random-state-for-an-entire-execution

Scikit FAQ 提到最好在需要的地方使用random_state 而不是全局随机状态。

全局随机状态示例:

import numpy as np
np.random.seed(42)

一些本地设置random_state的例子:

X_train, X_test, y_train, y_test = train_test_split(sample.data, sample.target, test_size=0.3, random_state=0)

skf =  StratifiedKFold(n_splits=10, random_state=0, shuffle=True)

classifierAlgorithm = LGBMClassifier(objective='binary', random_state=0)

【讨论】:

以上是关于不平衡二元分类问题的最佳阈值的主要内容,如果未能解决你的问题,请参考以下文章

keras中二元分类的类不平衡

为不平衡二元分类对数据进行过采样的过程

如何更改二元分类的阈值

计算二元分类的 roc_curve 阈值

数据不平衡不平衡采样调整分类阈值过采样欠采样SMOTEEasyEnsemble加入数据平衡的流程代价敏感学习BalanceCascade

机器学习术语表