【问题标题】:How to set a threshold for a sklearn classifier based on ROC results?如何根据 ROC 结果为 sklearn 分类器设置阈值?
【发布时间】:2017-06-11 08:53:51
【问题描述】:

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

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

我也来到了这篇文章 (scikit .predict() default threshold),其中指出阈值不是分类器的通用概念。但是由于ExtraTreesClassifier有predict_proba方法,而且ROC曲线也和thresdholds定义有关,我觉得应该可以指定。

我没有找到任何参数,也没有任何类/接口可以用来做这件事。如何使用 scikit-learn 为经​​过训练的 ExtraTreesClassifier(或任何其他类)设置阈值?

非常感谢, 大肠杆菌

【问题讨论】:

    标签: python scikit-learn classification threshold roc


    【解决方案1】:

    这就是我所做的:

    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% 的真阳性(假阳性为零)的阈值。 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)
    

    返回我想要的:

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

    【讨论】:

    • 请记住,由于在测试数据上选择的阈值会导致数据泄漏,因此生成的混淆矩阵不是样本外性能的适当指标。正确的方法是将数据拆分为训练/验证/测试。使用训练数据训练分类器,使用验证数据选择阈值并使用测试集评估最终模型(包括阈值)。
    • 是的,你是对的,我把答案简单化了
    【解决方案2】:

    如果没有任何具体的代码示例,很难提供准确的答案。如果您已经在进行交叉验证,则可以考虑将 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')
    

    【讨论】:

    • 嗨,怀特,感谢您的回复。我通过选择 roc_auc 和当时我感兴趣的其他指标来优化它(我还创建了一个自定义计分器来优化 LR+)。我的主要疑问是如何选择 ROC 曲线上一个点显示的阈值之一作为我调用 predict() 时的阈值?我的问题与 (github.com/scikit-learn/scikit-learn/issues/4813>) 有关。我不确定这是否适用于树木,因为它们通常不使用 probas。但是其他方法怎么设置呢?
    猜你喜欢
    • 2020-11-27
    • 2018-08-14
    • 1970-01-01
    • 2019-03-10
    • 2019-03-13
    • 1970-01-01
    • 2019-01-23
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多