【问题标题】:Python metrics ROC curve: negative predictive value for a histogram?Python度量ROC曲线:直方图的负预测值?
【发布时间】:2020-03-05 17:03:25
【问题描述】:

我有一个由 matplotlib 生成的直方图,我一直在使用 sklearn 指标来计算精确召回曲线。这是显示依赖于召回的直方图的阳性预测值 (PPV) 的图。这是直方图:

生成的曲线采用以下形式:

我认为负预测值 (NPV) 是 PPV 的倒数,所以我的猜测是简单地做 NPV = 1 - PPV 但这并没有奏效。到目前为止,我一直在使用 sklearn 模块的度量库中的函数来生成 ROC 曲线和精确召回曲线。但到目前为止,我还没有发现任何特定的指标曲线可以做像负预测值这样的事情。这是我一直用来从直方图生成曲线的源代码:


import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import pylab
from sklearn import metrics

data1 = np.loadtxt('1.txt') 
data2 = np.loadtxt('2.txt') 
x = np.transpose(data1)[1]
y = np.transpose(data2)[1]

background =  (1 + y)/2
signal =  (1 + x)/2

classifier_output = np.concatenate([background,signal])
true_value = np.concatenate([np.zeros_like(background, dtype=int), np.ones_like(signal, dtype=int)])

precision, recall, threshold = metrics.precision_recall_curve(true_value, classifier_output)
plt.plot(recall, precision)
plt.show()

在度量标准或一般情况下,有没有其他方法可以计算像这样的直方图的 NPV?

【问题讨论】:

    标签: python scikit-learn metrics roc


    【解决方案1】:

    虽然从您的图中很难判断出精确度和召回率对您来说是什么,但我们可以轻松修改您的代码来计算您的要求。

    来自wiki 的精度(也称为阳性预测值或 PPV)​​是真阳性的数量除以预测为阳性的样本数量(即真阳性 + 假阳性),而阴性预测值或 NPV 是真阴性数除以预测为阴性的样本数。因此,我们可以通过将正负交换来计算 NPV。在代码中:

    import numpy as np
    import matplotlib.mlab as mlab
    import matplotlib.pyplot as plt
    import pylab
    from sklearn import metrics
    
    data1 = np.loadtxt('1.txt') 
    data2 = np.loadtxt('2.txt') 
    x = np.transpose(data1)[1]
    y = np.transpose(data2)[1]
    
    background =  (1 + y)/2
    signal =  (1 + x)/2
    
    classifier_output = np.concatenate([background,signal])
    true_value = np.concatenate([np.zeros_like(background, dtype=int), np.ones_like(signal, dtype=int)])
    
    precision, recall, threshold = metrics.precision_recall_curve(true_value, classifier_output)
    npv, fnr, inv_thresh = metrics.precision_recall_curve(1 - true_value, 1 - classifier_output)
    plt.plot(recall, precision)
    plt.plot(recall, npv[::-1])
    plt.show()
    

    请注意,我们需要反转npv 以匹配precision 的顺序。这是因为metrics.precision_recall_curve 按阈值(即按输入分数)对输出进行排序。因为我们使用了一次classifier_output 和一次1 - classifier_output 作为输入,所以顺序颠倒了。如果您想检查这一点,请尝试绘制 precisionnpv w.r.t。 thresholdinv_thresh

    免责声明:我无法尝试我提供的代码,因此可能需要进一步完善

    【讨论】:

      猜你喜欢
      • 2013-04-30
      • 2016-07-03
      • 2019-12-26
      • 2017-06-04
      • 1970-01-01
      • 2022-11-01
      • 2013-01-26
      • 2016-11-06
      • 1970-01-01
      相关资源
      最近更新 更多