python 繪製ROC曲線

2021-08-19 23:26:33 字數 3570 閱讀 8732

簡述

機器學習很多是為測試樣本產生乙個**值,然後將這個**值與閾值進行對比,若大於閾值則分為正類,否則分為反類。這個**值的好壞,直接決定了學習器泛化能力。根據這個**值,我們可以對測試樣本進行排序,「最可能」是正例的排在最前面,「最不可能」是正例的排在最後面。這樣,分類過程就相當於在這個排序中以某個截斷點將樣本分為兩部分,前面一部分作為正例,後面一部分作為反例。

如果我們更加重視「查準率」,則可以選擇排序中靠前的位置進行階段(盡可能的準確**正例);若更加重視「查全率」,則可以選擇排序中靠後的位置進行截斷(盡可能多的包含正例)。因此排序的好壞,直接體現了綜合考慮學習器在不同任務下的「期望泛化效能」的好壞。roc曲線就是從這個角度出發來研究學習器泛化效能的。

真正例率和假正例率

資料集:

x1  0.9894352   1

x2 0.9794352 1

x3 0.977945262 1

x4 0.960783037 1

x5 0.944241384 1

x6 0.93664411 1

x7 0.924929575 1

x8 0.920406882 0

x9 0.888570298 1

x10 0.882629706 1

x11 0.882401646 1

x12 0.853832401 1

x13 0.839347591 1

x14 0.836771262 1

x15 0.833144033 1

x16 0.828867488 1

x17 0.815303556 0

x18 0.805622582 1

x19 0.802897991 1

x20 0.789226942 0

x21 0.758042059 1

x22 0.716307689 1

x23 0.69443123 1

x24 0.693818886 1

x25 0.684523938 1

x26 0.672463705 1

x27 0.629302653 0

x28 0.58780351 1

x29 0.548529475 1

x30 0.488394372 0

x31 0.483994649 0

x32 0.43695701 1

x33 0.408835528 1

x34 0.393323919 0

x35 0.374834691 1

x36 0.349519471 0

x37 0.29704696 0

x38 0.273542305 0

x39 0.205748558 0

x40 0.187974058 1

x41 0.179264057 0

x42 0.164596829 0

x43 0.142258075 0

x44 0.138514809 0

x45 0.128892511 0

x46 0.126119067 0

x47 0.113361272 0

x48 0.083327915 0

x49 0.071568497 0

x50 0.031525573 0

測試樣本包含三列,第一列樣本序號,第二列為**值,第三列為真實標記值。

#-*- coding: utf-8 -*-

import matplotlib.pyplot as plt

defget_data

(path):

f = open(path)

data_list = f.readlines()

return data_list

defget_truth_value

(): threshold_list =

truth_value =

data_list = get_data('test.txt')

for item in data_list:

item.strip().split('\t')[2])

return truth_value

defplot_curve

(x,y):

plt.scatter(x,y)

plt.xlabel(u"假正例率",fontproperties='simhei')

plt.ylabel(u"真正例率",fontproperties='simhei')

plt.show()

defget_tpr_fpr

(): truth_value = get_truth_value()

tpr =

fpr =

for i in range(1,len(truth_value)):

forecast =

forecast.extend([1]*(i))

forecast.extend([0]*(len(truth_value) - i))

tmp_list = [forecast[j]*int(truth_value[j]) for j in range(len(forecast))]

tp = sum(tmp_list[0:i])

fp = i - tp

fn = sum([int(x) for x in truth_value[i:len(truth_value)]])

tn = len(truth_value)-i - fn

print(tp,fp,fn,tn)

return tpr,fpr

if __name__ == "__main__":

x,y = get_tpr_fpr()

plot_curve(y,x)

繪圖

這裡繪圖方法是將測試樣本的每乙個值作為閾值,然後分別計算出真正例率和假正例率,如圖所示:

對於同乙個測試樣本,不同的學習器產生的**值不同,繪製的roc曲線也不同,當乙個曲線將另乙個曲線完全包住時,包住的曲線對應的學習器的泛化能力是強於另外乙個的,當兩條曲線有交點時,需要計算roc曲線圍住的面積:au

c=12

∑i=1

m−1(

xi+1

−xi)

∗(yi

+yi+

1)a uc

=12∑

i=1m

−1(x

i+1−

xi)∗

(yi+

yi+1

)s=1

2(上底

+下底)

∗高s =1

2(上底

+下底)

∗高

繪製ROC曲線

roc曲線是什麼意思,書面表述為 roc 曲線 接收者操作特徵曲線 是一種顯示分類模型在所有分類閾值下的效果的圖表。好吧,這很不直觀。其實就是乙個二維曲線,橫軸是fpr,縱軸是tpr 至於tpr,fpr怎麼計算 然後tpr,fpr的定義為 tpr tp tp fn 也就是recall fpr fp ...

Python學習 ROC曲線繪製

from sklearn.metrics import roc curve 匯入roc曲線函式 fpr,tpr,thresholds roc curve test 3 tree.predict proba test 3 1 pos label 1 test 3 測試集真實標記值 tree.predi...

分類演算法如何繪製roc曲線 ROC曲線繪製方法

roc receiver operating characteristic 曲線即受試者工作特徵曲線。roc曲線與座標軸圍成的面積被稱為auc area under curve 這兩個指標和敏感性 特異性和準確性一起,是評估演算法模型效能常用的指標。在進一步介紹roc曲線如何繪製之前,先引入幾個概念...