簡述
機器學習很多是為測試樣本產生乙個**值,然後將這個**值與閾值進行對比,若大於閾值則分為正類,否則分為反類。這個**值的好壞,直接決定了學習器泛化能力。根據這個**值,我們可以對測試樣本進行排序,「最可能」是正例的排在最前面,「最不可能」是正例的排在最後面。這樣,分類過程就相當於在這個排序中以某個截斷點將樣本分為兩部分,前面一部分作為正例,後面一部分作為反例。
如果我們更加重視「查準率」,則可以選擇排序中靠前的位置進行階段(盡可能的準確**正例);若更加重視「查全率」,則可以選擇排序中靠後的位置進行截斷(盡可能多的包含正例)。因此排序的好壞,直接體現了綜合考慮學習器在不同任務下的「期望泛化效能」的好壞。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曲線如何繪製之前,先引入幾個概念...