我正在尝试重现与此相似的灵敏度特异性图:
X轴为阈值
但是我还没有找到如何做的方法,像ROC曲线之类的一些简单的指标会返回真实的正值和错误的正值,但是我没有找到任何方法可以在那里绘制此图。
我正在尝试将问题与实际标签进行比较以保持计数,我得到的情节如下所示:
因此,X标签必须经过某种程度的归一化处理,以便曲线实际上可以上下移动。
最佳答案
在@ApproachingDarknessFish's answer的基础上,您可以将各种分布拟合为所得的直方图,但并非所有分布都在[0,1]之外。例如,至少出于可视化的考虑,β分布将很好地捕获[0,1]上的大多数单峰分布:
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats
test_y = np.array([0]*100 + [1]*100)
predicted_y_probs = np.concatenate((np.random.beta(2,5,100), np.random.beta(8,3,100)))
def estimate_beta(X):
xbar = np.mean(X)
vbar = np.var(X,ddof=1)
alphahat = xbar*(xbar*(1-xbar)/vbar - 1)
betahat = (1-xbar)*(xbar*(1-xbar)/vbar - 1)
return alphahat, betahat
positive_beta_estimates = estimate_beta(predicted_y_probs[test_y == 1])
negative_beta_estimates = estimate_beta(predicted_y_probs[test_y == 0])
unit_interval = np.linspace(0,1,100)
plt.plot(unit_interval, scipy.stats.beta.pdf(unit_interval, *positive_beta_estimates), c='r', label="positive")
plt.plot(unit_interval, scipy.stats.beta.pdf(unit_interval, *negative_beta_estimates), c='g', label="negative")
# Show the threshold.
plt.axvline(0.5, c='black', ls='dashed')
plt.xlim(0,1)
# Add labels
plt.legend()