灵敏度特异性图python

Lui*_*uez 1 python classification machine-learning scikit-learn

我正在尝试重现类似于此的灵敏度特异性图:其中 X 轴是阈值

在此处输入图片说明

但是我还没有找到怎么做,一些像 ROC 曲线这样的 skalern 指标会返回真阳性和假阳性,但我还没有找到任何选项来制作这个图。

我试图将概率与实际标签进行比较以保持计数,我得到的情节是这样的:

在此处输入图片说明

因此,X 标签必须标准化,以便曲线实际上可以上下移动。

App*_*ish 6

我不认为该情节正在显示您认为它显示的内容。当阈值降至零时,灵敏度将接近 1,因为 100% 的观察将被归类为阳性,而假阴性率将降至零。同样,当阈值接近 1 时,选择性将接近 1,因为每个观察都将被归类为阴性,假阳性率将为零。所以这个图没有显示灵敏度或选择性。

要在 x 轴上将选择性和灵敏度绘制为阈值的函数,我们可以使用内置的 ROC 功能并从中提取值,以我们自己的方式绘制它们。给定一个二元标签向量test_y、一个关联预测变量矩阵test_x和一个拟合RandomForestClassifier对象rfc

import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import precision_score, recall_score

# Get the estimated probabilities of each observation being categorized as positive
# [:,1] for probabilities of negative
predicted_y_probs = rfc.predict_proba(test_x)[:,0]

thresholds = np.linspace(0,1,20) # or however many points you want

sensitivities = [recall_score(test_y, predicted_y_probs >= t) for t in thresholds]
selectivities = [precision_score(test_y, predicted_y_probs >= t) for t in thresholds]
plt.plot(thresholds, sensitivies, label='sensitivity')
plt.plot(thresholds, selectivities, label='selectivity')
plt.legend()
Run Code Online (Sandbox Code Playgroud)

但是,这不会重新创建您提供的图作为参考,这似乎显示了每个观察被归类为正的估计概率的分布。换句话说,该图中的阈值是一个常数,x 轴向我们显示每个预测相对于该(静止)阈值的下降位置。它没有直接告诉我们灵敏度或选择性。如果你真的想要一个看起来像这样的情节,请继续阅读。

我想不出重建那些平滑曲线的方法,因为密度图会延伸到 0 以下和 1 以上,但我们可以使用直方图来显示信息。使用与之前相同的变量:

# Specify range to ensure both groups show up the same width.
bins = np.linspace(0,1,10)

# Show distributions of estimated probabilities for the two classes.
plt.hist(predicted_y_probs[test_y == 1], alpha=0.5, color='red', label='positive', bins=bins)
plt.hist(predicted_y_probs[test_y == 0], alpha=0.5, color='green', label='negative', bins=bins)

# Show the threshold.
plt.axvline(0.5, c='black', ls='dashed')

# Add labels
plt.legend()
Run Code Online (Sandbox Code Playgroud)

我仅使用三个物种中的两个物种为经典鸢尾花数据集运行此代码,并得到以下输出。Versicolor 是“阳性”,virigiinica 是“阴性”,而 setosa 被忽略以产生二元分类。请注意,我的模型具有完美的召回率,因此 versicolor 的所有概率都非常接近 1.0。由于只有 100 个样本,其中大部分都被正确分类,因此它相当块状,但希望它能够理解这个想法。

绿柱分布在 0.0、0.4 和 0.9 附近的直方图,以及 1.0 处的一个红柱