sklearn.metrics.roc_curve使用簡要說明

一、背景說明

小哥我是一名機器學習小白,剛開始學習sklearn。像部分剛入門的小白一樣被混淆矩陣搞得頭昏腦脹,最近碰到朋友諮詢我roc_curve返回的結果是如何生成的時候,我一臉懵逼。shift+Tab查看系統說明沒有看明白(本人英語水平很弱,親一定要學好英語);然後,上網求助,也沒有得到想要的答案。最後受這篇文章http://www.bubuko.com/infodetail-2718749.html的啓發,自己重新摸索出規律,把自己一點小想法分享給大家,希望能幫助大家

二、TP、TN、FP、FN概念

在這裏插入圖片描述## 三、TPR、TNR、FPR、FNR概念
1、TPR=tp/(tp+fn)
TPR:即真正率或靈敏度或召回率或查全率或真正率或功效,本來爲正樣本的樣本被預測爲正樣本的總樣本數量÷真實結果爲正樣本的總樣本數
另:精確度或查準率公式等於tp/(tp+fp)
準確得分計算:(tp+tn)/(tp+fp+fn+tn)
2、FNR=fn/(tp+fn) =1-TPR
FNR:即假負率,本來爲正樣本的樣本被預測爲負樣本的總樣本數量÷真實結果爲正樣本的總樣本數。
相當於假設檢驗中,犯第二類錯誤概率(β)
3、FPR=fp/(fp+tn)
FPR:即假正率,本來爲負樣本的樣本被預測爲正樣本的總樣本數量÷真實結果爲負樣本的總樣本數。
相當於假設檢驗中,犯第一類錯誤概率(α)
4、TNR=tn/(fp+tn)=1-FPR
TNR:即真負率或特異度,本來爲負樣本的樣本被預測爲負樣本的總樣本數量÷真實結果爲負樣本的總樣本數。

四、roc_curve運行機制簡單剖析

4.1、roc_curve簡單介紹

4.1.1 重要參數

y_true:真實結果數據,數據類型是數組
y_score:預測結果數據,可以是標籤數據也可以是概率值,數據類型是形狀 與y_true一致的數組
pos_label:默認爲None,只有當標籤數據如{0,1}、{-1,1}二分類數據才能默認;否則需要設置正樣本值

4.1.2 返回的結果

返回三個數組結果分別是fpr(假正率),tpr(召回率),threshold(閾值)

4.2、第一種情形:y_score是標籤數據

4.2.1、例子

代碼.

//python 代碼
y_true=np.array([0, 0, 0, 1, 1, 0, 0, 0, 1, 0])
y_score=np.array([0, 0, 0, 1, 1, 0, 0, 0, 0, 0])
fpr,tpr,threshold=roc_curve(y_true,y_score)

返回結果.

threshold:array([2, 1, 0])
tpr:array([0.        , 0.66666667, 1.        ])
fpr:array([0., 0., 1.])

4.2.2、解釋:

1、threshold返回的結果是y_score內的元素去重後加入一個‘最大值+1’的值降序排序後組成的數據,每一個元素作爲閾值,數據類型是一維數組。比如:y_score=np.array([0, 1, 2,0,3,1])對應的threshold=np.array([4, 3, 2,1,0])
2、當index=0,閾值等於threshold[0]=2。此時,假定y_score中所有大於等於2的元素對應index在y_true中的樣本爲正樣本,其他爲負樣本,然後與y_true對應元素對比組成混淆矩陣,因沒有大於等於2的值,所以TP和FP都爲0,即tpr[0]=0/3=0.0,fpr[0]=0/7=0.0
3、當index=1,閾值等於threshold[1]=1。此時,假定y_score中所有大於等於1的元素對應index在y_true中的樣本爲正樣本,其他爲負樣本,然後與y_true對應元素對比組成混淆矩陣,因大於等於1的數有2個,所以TP=2和FP=0,即tpr[1]=2/3=0.66666667,fpr[1]=0/7=0.0
4、當index=2,閾值等於threshold[2]=0。此時,假定y_score中所有大於等於0的元素對應index在y_true中的樣本爲正樣本,其他爲負樣本,然後與y_true對應元素對比組成混淆矩陣,因大於等於0的數有10個,所以TP=3和FP=7,即tpr[2]=3/3=1.0,fpr[2]=7/7=1.0
所以,最終結果:tpr=array([0., 0.66666667, 1.]),fpr=array([0., 0., 1.])

4.3、第二種情形:y_score是概率值

4.3.1、例子

代碼.

//python 代碼
y_true=np.array([0,0,1,1])
y_score=np.array([0.1,0.4,0.35,0.8])
fpr,tpr,threshold=roc_curve(y_true,y_score)

返回結果.

threshold:array([1.8 , 0.8 , 0.4 , 0.35, 0.1])
tpr:array([0. , 0.5, 0.5, 1. , 1.])
fpr:array([0. , 0. , 0.5, 0.5, 1. ])

4.3.2、解釋:

1、當index=0,閾值等於threshold[0]=1.8。此時,假定y_score中所有大於等於1.8的元素對應index在y_true中的樣本爲正樣本,其他爲負樣本,然後與y_true對應元素對比組成混淆矩陣,因沒有大於等於1.8的值,所以TP和FP都爲0,即tpr[0]=0/2=0.0,fpr[0]=0/2=0.0
2、當index=1,閾值等於threshold[1]=0.8。此時,假定y_score中所有大於等於1的元素對應index在y_true中的樣本爲正樣本,其他爲負樣本,然後與y_true對應元素對比組成混淆矩陣,因大於等於0.8的數有1個,剛好y_true中該位置元素值爲1,所以TP=1和FP=0,即tpr[1]=1/2=0.5,fpr[1]=0/2=0.0
3、當index=2,閾值等於threshold[2]=0.4。此時,假定y_score中所有大於等於0.4的元素對應index在y_true中的樣本爲正樣本,其他爲負樣本,然後與y_true對應元素對比組成混淆矩陣,因大於等於0.4的數有2個,所以TP=1和FP=1,即tpr[2]=1/2=0.5,fpr[2]=1/2=0.5
4、當index=3,閾值等於threshold[3]=0.35。此時,假定y_score中所有大於等於0.35的元素對應index在y_true中的樣本爲正樣本,其他爲負樣本,然後與y_true對應元素對比組成混淆矩陣,因大於等於0.35的數有3個,所以TP=2和FP=1,即tpr[3]=2/2=1.0,fpr[3]=1/2=0.5
5、當index=4,閾值等於threshold[4]=0.1。此時,假定y_score中所有大於等於0.1的元素對應index在y_true中的樣本爲正樣本,其他爲負樣本,然後與y_true對應元素對比組成混淆矩陣,因大於等於0.1的數有4個,所以TP=2和FP=2,即tpr[4]=2/2=1.0,fpr[4]=2/2=1.0
所以,最終結果:tpr=array([0. , 0.5, 0.5, 1. , 1.]),fpr=array([0. , 0. , 0.5, 0.5, 1. ])

小哥我的分享就到此結束,有不足之處,請及時指正!

另給大家推薦一個ROC曲線描述很好的博客: https://blog.csdn.net/yuxiaosmd/article/details/83046162.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章