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

时间:2020-02-13 19:55:42

标签: python scikit-learn classification roc

我无法优化用于二值分类的阈值。我正在使用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)预测测试数据集的概率,并使用上面计算出的optimum_threshold来获取类。

这里是一个问题:当我一次又一次地启动代码时,如果我不修正random_state,则最佳阈值是变化的,并且会安静地移动。这会导致基于测试样本的准确性指标发生巨大变化。

我是否需要计算一些平均阈值并将其用作恒定的硬值?或者也许我到处都必须修复random_state?还是发现optimum_threshold的方法不正确?

1 个答案:

答案 0 :(得分: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常见问题解答提到最好在需要的地方使用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)