zoukankan      html  css  js  c++  java
  • sklearn.metrics.roc_curve



    官方网址:http://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics

    首先认识单词:metrics: ['mɛtrɪks] : 度量‘指标 curve : [kɝv] : 曲线

    这个方法主要用来计算ROC曲线面积的;

    sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)

    Parameters :

    y_true : 数组,shape = [样本数]

    在范围{0,1}或{-1,1}中真正的二进制标签。如果标签不是二进制的,则应该显式地给出pos_label

    y_score : 数组, shape = [样本数]

    目标得分,可以是积极类的概率估计,信心值,或者是决定的非阈值度量(在某些分类器上由“decision_function”返回)。

    pos_label:int or str, 标签被认为是积极的,其他的被认为是消极的。

    sample_weight: 顾名思义,样本的权重,可选择的

    drop_intermediate: boolean, optional (default=True)

    是否放弃一些不出现在绘制的ROC曲线上的次优阈值。这有助于创建更轻的ROC曲线

    Returns :

    fpr : array, shape = [>2] 增加假阳性率,例如,i是预测的假阳性率,得分>=临界值[i]

    tpr : array, shape = [>2] 增加真阳性率,例如,i是预测的真阳性率,得分>=临界值[i]。

    thresholds : array, shape = [n_thresholds]

    减少了用于计算fpr和tpr的决策函数的阈值。阈值[0]表示没有被预测的实例,并且被任意设置为max(y_score) + 1

    要弄明白ROC的概念可以参考 :https://www.deeplearn.me/1522.html



    介绍ROC曲线的两个重要指标:

    真阳性率 = true positive rate = TPR = TP/ (TP + FN)

    可以这样理解:真阳性率就是在标准的阳性(标准的阳性就等于真阳性加假阴性=TP + FN)中,同时被检测为阳性的概率,有点绕,自行理解。

    假阳性率 = false positive rate = FPR = FP / (FP+TN)

    可以这样理解:假阳性就是在标准的阴性(标准的阴性就等于假阳性加真阴性=FP + TN)中,被检测为阳性的概率。很好理解的,本来是阴性,检测成了阳性的概率就是假阳性率呗。



    ROC曲线就由这两个值绘制而成。接下来进入sklearn.metrics.roc_curve实战,找遍了网络也没找到像我一样解释这么清楚的。

    import numpy as np
    from sklearn import metrics
    y = np.array([1, 1, 2, 2])
    scores = np.array([0.1, 0.4, 0.35, 0.8])
    fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
    y 就是标准值,scores 是每个预测值对应的阳性概率,比如0.1就是指第一个数预测为阳性的概率为0.1,很显然,y 和 socres应该有相同多的元素,都等于样本数。pos_label=2 是指在y中标签为2的是标准阳性标签,其余值是阴性。
    所以在标准值y中,阳性有2个,后两个;阴性有2个,前两个。

    接下来选取一个阈值计算TPR/FPR,阈值的选取规则是在scores值中从大到小的以此选取,于是第一个选取的阈值是0.8

    scores中大于阈值的就是预测为阳性,小于的预测为阴性。所以预测的值设为y_=(0,0,0,1),0代表预测为阴性,1代表预测为阳性。可以看出,真阴性都被预测为阴性,真阳性有一个预测为假阴性了。

    FPR = FP / (FP+TN) = 0 / 0 + 2 = 0

    TPR = TP/ (TP + FN) = 1 / 1 + 1 = 0.5

    thresholds = 0.8

    我们验证一下结果

    print(fpr[0],tpr[0],thresholds[0])

    同代码结果一致,其余的就不演示了,剩下的阈值一次等于 0.4 0.35 0.1 自行验证。

    最后结果等于

    print(fpr,' ',tpr,' ',thresholds)

    全部代码

    import numpy as np
    from sklearn import metrics
    y = np.array([1, 1, 2, 2])
    scores = np.array([0.1, 0.4, 0.35, 0.8])
    fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
    print(fpr,' ',tpr,' ',thresholds)


    ---------------------
    作者:z智慧
    来源:CSDN
    原文:https://blog.csdn.net/u014264373/article/details/80487766
    版权声明:本文为博主原创文章,转载请附上博文链接!
  • 相关阅读:
    关于JVM的一些东西
    网络的最大流最小割定理
    类的生命周期
    关于java中的不可变类(转)
    如何在Linux上升级java
    CAS操作
    如何使用fastJson来解析JSON格式数据和生成JSON格式数据
    计算机中如何实现除数是2的幂次的除法【转载自CSDN】
    python:使用Fabric自动化你的任务
    python中的元类
  • 原文地址:https://www.cnblogs.com/Rvin/p/11051045.html
Copyright © 2011-2022 走看看