【问题标题】:Area under the ROC curve using Sklearn?使用 Sklearn 的 ROC 曲线下的面积?
【发布时间】:2019-03-10 02:13:10
【问题描述】:

我不明白为什么Sklearn 函数roc_auc_score 在以下情况下返回1

y_true = [0, 0, 1, 0, 0, 0, 0, 1]

y_scores = [0.18101096153259277, 0.15506085753440857, 
            0.9940806031227112, 0.05024950951337814, 
            0.7381414771080017, 0.8922111988067627, 
            0.8253260850906372, 0.9967281818389893]

roc_auc_score(y_true,y_scores)

末尾的三个分数0.7381414771080017, 0.8922111988067627, 0.8253260850906372 与标签0, 0, 0 不匹配。那么,AUC 怎么可能是 1?我在这里做错了什么?

【问题讨论】:

    标签: python scikit-learn roc auc


    【解决方案1】:

    ROC 曲线的 auc 仅衡量您的模型相对于您的正类对数据点进行排序的能力。

    在您的示例中,正类的分数始终大于负类数据点。因此,auc_roc_score 为 1 是正确的。

    pd.DataFrame({'y_true':y_true,'y_scores':y_scores}).sort_values('y_scores',ascending=False)
    
        y_scores    y_true
    7   0.996728    1
    2   0.994081    1
    5   0.892211    0
    6   0.825326    0
    4   0.738141    0
    0   0.181011    0
    1   0.155061    0
    3   0.050250    0
    

    【讨论】:

      【解决方案2】:

      如果您查看 ROC 本身,就会更容易理解原因:

      > roc_curve(y_true, y_scores)
      
      (array([0., 0., 0., 1.]),
       array([0. , 0.5, 1. , 1. ]),
       array([1.99672818, 0.99672818, 0.9940806 , 0.05024951]))
      

      返回元组中的第一个值是FPR,第二个是TPR,第三个是值变化的阈值点。

      对于 0.99672818 的阈值,FPR 确实是 0.5,而不是 0,这会让你认为 ROC 的 AUC 不是 0。然而,FPR/TPR 点只是线 0, 0 - > 0, 1 -> 1, 1,其下方的面积确实是 1。

      【讨论】:

      • 非常感谢您的详细解释。 !
      猜你喜欢
      • 2018-05-24
      • 2016-04-06
      • 2014-11-10
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多