如何根据 ROC 结果设置 sklearn 分类器的阈值?

How to set a threshold for a sklearn classifier based on ROC results?

我使用 scikit-learn 训练了一个 ExtraTreesClassifier(gini 指数),它非常适合我的需要。准确性不太好,但使用 10 折交叉验证,AUC 为 0.95。我想在我的工作中使用这个分类器。我是 ML 的新手,所以如果我问你一些概念上的错误,请原谅我。

我绘制了一些 ROC 曲线,据此,我似乎有一个特定的阈值,我的分类器开始表现良好。我想在拟合分类器上设置这个值,所以每次我调用预测时,分类器都会使用该阈值,我可以相信 FP 和 TP 率。

我还提到了这个 post (scikit .predict() default threshold),其中指出阈值不是分类器的通用概念。但由于 ExtraTreesClassifier 有方法 predict_proba,并且 ROC 曲线也与阈值定义有关,在我看来我应该可以指定它。

我没有找到任何参数,也没有找到任何 class/interface 来执行此操作。如何使用 scikit-learn 为训练有素的 ExtraTreesClassifier(或任何其他分类器)设置阈值?

非常感谢, 科利斯

如果没有任何具体的代码示例,很难提供准确的答案。如果您已经在进行交叉验证,您可以考虑将 AUC 指定为要优化的参数:

shuffle = cross_validation.KFold(len(X_train), n_folds=10, shuffle=True)
scores = cross_val_score(classifier, X_train, y_train, cv=shuffle, scoring='roc_auc')

这是我所做的:

model = SomeSklearnModel()
model.fit(X_train, y_train)
predict = model.predict(X_test)
predict_probabilities = model.predict_proba(X_test)
fpr, tpr, _ = roc_curve(y_test, predict_probabilities)

然而,令我恼火的是,predict 选择了一个对应于 0.4% true positives 的阈值(false positives 为零)。 ROC 曲线显示了一个阈值,我更喜欢我的问题,其中真阳性约为 20%(假阳性约为 4%)。然后我扫描 predict_probabilities 以找到与我最喜欢的 ROC 点对应的概率值。在我的例子中,这个概率是 0.21。然后我创建自己的预测数组:

predict_mine = np.where(rf_predict_probabilities > 0.21, 1, 0)

好了:

confusion_matrix(y_test, predict_mine)

returns我想要的:

array([[6927,  309],
       [ 621,  121]])