天天看點

從源碼的角度解釋調用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對計算結果所有門檻值進行輸出。