如何从此ROC功能获得AUC?

时间:2017-07-11 09:17:40

标签: python model roc auc

来自此roc函数 如何获得AUC(曲线下面积)值?

以下是我使用的代码:

def roc(data_set):
    normal = 0
    data_set_size = data_set.shape[1]
    roc_rate = np.zeros((2, data_set_size))
    for i in range(data_set_size):
        if data_set[2][i] == 1:
            normal += 1
    abnormal = data_set_size - normal
    max_dis = data_set[1].max()
    for j in range(1000):
        threshold = max_dis / 1000 * j
        normal1 = 0
        abnormal1 = 0
        for k in range(data_set_size):
            if data_set[1][k] > threshold and data_set[2][k] == 1:
                normal1 += 1
            if data_set[1][k] > threshold and data_set[2][k] == 2:
                abnormal1 += 1
        roc_rate[0][j] = normal1 / normal  # true positive
        roc_rate[1][j] = abnormal1 / abnormal  # false positive
    return roc_rate

模型的准确性是AUC / TotalArea的比例? 对吗??

提前致谢。

2 个答案:

答案 0 :(得分:0)

很酷的是你从最初的原则中解决这个问题,对ROC曲线一直有点好奇,但到目前为止只使用了现成的功能。

从您提供的代码中假设

x = roc_rate[0]
y = roc_rate[1]

然后使用this解决方案以数字方式集成它:

import scipy
scipy.integrate.simps(y,x)

也许我没有正确理解你的代码 - 使用它的输入和输出样本会更容易,但是如果你使用这个数值积分你将获得该区域。

是的,我认为ROC曲线适合1 x 1轴,如果模型根本没有分类能力,那么'曲线'就是对角线,其面积为1/2,正确只是偶然回答。完美模型的ROC曲线是一个倒置的L,占据整个区域1,真实世界模型是在对角线和倒置L之间的曲线。

答案 1 :(得分:0)

当scipy.integrate.simps(y,x)

我遇到了像这样的错误

/usr/local/lib/python2.7/site-packages/scipy/integrate/quadrature.py:324:RuntimeWarning:在true_divide中遇到零除   h0divh1 = h0 / h1 /usr/local/lib/python2.7/site-packages/scipy/integrate/quadrature.py:324:运行时警告:在true_divide中遇到无效值   h0divh1 = h0 / h1 /usr/local/lib/python2.7/site-packages/scipy/integrate/quadrature.py:326:RuntimeWarning:在true_divide中遇到零除   y [slice1] hsum hsum / hprod + /usr/local/lib/python2.7/site-packages/scipy/integrate/quadrature.py:326:RuntimeWarning:在true_divide中遇到无效值   y [slice1] hsum hsum / hprod + /usr/local/lib/python2.7/site-packages/scipy/integrate/quadrature.py:326:RuntimeWarning:添加时遇到无效值   y [slice1] hsum hsum / hprod + /usr/local/lib/python2.7/site-packages/scipy/integrate/quadrature.py:327:RuntimeWarning:添加时遇到无效值   Y [slice2] *(2-h0divh1))

我该如何解决?