desc_score_indices = np.argsort(y_score, kind="mergesort")[::-1]
y_score = y_score[desc_score_indices]
y_true = y_true[desc_score_indices]
# accumulate the true positives with decreasing threshold
tps = y_true.cumsum()
fps = 1 + list(range(len(y_true))) - tps
return fps, tps, y_score
ROC曲线只是显示“如果您增加FPR一定量,您将获得多少灵敏度”。TPR和FPR之间的权衡。变异性来自分类器的某个参数的变化(对于下面的逻辑回归案例,它是阈值)。
例如,逻辑回归会给出对象属于正类的概率(值在[0..1]中),但这只是概率。它不是一个类。因此,在一般情况下,您必须为概率指定阈值,超过该阈值,您将将对象分类为正类。您可以学习逻辑回归,为您的集合中的每个对象获取正类的概率,然后您只需通过使用从0到1的某些步骤来改变此阈值参数来阈值化您的概率(在上一步计算的概率),您将获得每个阈值的TPR和FPR。因此,您将获得每个阈值的TPR和FPR。您可以在图表上标记它们,并最终在计算所有阈值的(TPR,FPR)对之后,通过它们绘制一条线。
对于线性二元分类器,您可以将这个变化过程看作是选择决策线和正(或负,如果您愿意)类簇之间距离的过程。如果您将决策线远离正类 - 您将把更多的对象分类为正类(因为您增加了正类空间),同时您也增加了某个值的假阳性率(因为负类空间减少了)。