天天看点

从源码的角度解释调用sklearn.metrics中roc_curve()方法的疑惑

关于roc_curve的疑惑和解释

    • 前言
    • 疑惑1:len(thresholds)的长度为什么比len(y_pre_pro)大1?
    • 疑惑2:其返回一个大于1的阈值,如何不影响最终roc和auc曲线图
    • 疑惑3:对于多个阈值相近,为了使图像更加清楚,可以使用什么技巧?
    • 总结

前言

模型训练完成后,在计算ks值以及绘制roc曲线和auc曲线时候,我们方便的调用sklearn.metrics中的ric_curve(y_true, y_pre_pro)方法,计算tpr、fpr、threshholds。函数roc_curve() 通过对 y_pre_pro 进行排序,将排序后的y_pre_pro从大到小作为阈值,计算该阈值下的tpr、fpr,并且以下图所示的的形式将结果返回。

从源码的角度解释调用sklearn.metrics中roc_curve()方法的疑惑

疑惑1:len(thresholds)的长度为什么比len(y_pre_pro)大1?

查看roc_curve()函数的源码发现:

从源码的角度解释调用sklearn.metrics中roc_curve()方法的疑惑

其返回值thresholds的说明为:降低用于计算fpr和tpr的决策函数的阈值。“threshold[0]”表示没有预测到任何实例,并被任意设置为“max(y_score) + 1”。

由此可以解释 len(thresholds) = len(y_pre_pro) + 1。

疑惑2:其返回一个大于1的阈值,如何不影响最终roc和auc曲线图

根据疑惑1的解释,其大于1 的阈值位于thresholds[0]的位置,并且与tpr、fpr位置相对应,如果我们不对计算结果进行处理,我们绘制的roc曲线图如下:

plot_ks(tpr, fpr, ks, thresholds)
           
从源码的角度解释调用sklearn.metrics中roc_curve()方法的疑惑

注:plot_ks()方法为自己封装的方法,其横轴为thresholds,纵轴为tpr及fpr。

通过对索引为0的位置的数据进行处理,我们可以得到下图roc曲线:

plot_ks(tpr[1:], fpr[1:], ks, thresholds[1:])
           
从源码的角度解释调用sklearn.metrics中roc_curve()方法的疑惑

疑惑3:对于多个阈值相近,为了使图像更加清楚,可以使用什么技巧?

查看roc_curve()函数的源码发现:

从源码的角度解释调用sklearn.metrics中roc_curve()方法的疑惑

drop_intermediate参数的解释为:是否降低一些不会出现在绘制的ROC曲线上的次优阈值。这对于创造更清楚的ROC曲线是有用的。

roc_curve(y_true, y_score, pos_label=None, sample_weight=None,drop_intermediate=True)
           

roc_curve()方法在调用时,可以传入参数drop_intermediate,其默认值为True即减少次优阈值,可以通过设置其为False返回所有阈值。

总结

1.roc_curve()返回结果索引为0的数据其阈值大于1,可以进行处理,以方便我们对计算结果进行观察。

2.可以通过设置参数drop_intermediate = False对计算结果所有阈值进行输出。