對於二分類問題,根據分類結果能形成「混淆矩陣」。
p是查準率,r是查全率,定義如下:
一般來說,查準率和查全率是一對矛盾的度量,書上給出的「p-r圖」比較平滑,現實中區域性波動較大。
roc全稱是「受試者工作特徵」曲線,縱軸是「真正例率」tpr,橫軸是「假正例率」fpr,兩者同樣基於混淆矩陣,定義如下:
可以通過auc(曲線下的面積)比較兩個分類器的效能。
我們要清楚的是,分類器做**,是不會直接輸出類別符號,而是給出屬於某個類別的概率值,比如說**當前西瓜是好瓜的概率是80%。pr曲線和aoc曲線的畫法是差不多的,根據分類器的**結果從大到小對樣例進行排序,逐個把樣例加入正例進行**,算出此時的p、r值。
為了方便,我直接**實現了。**如下:
#!/usr/bin/env python
# -*-coding:utf-8 -*-'''
@file : test.py
@time : 2020/03/11 20:27:25
@author : schiller xu
@version : 1.0
@contact : [email protected]
@desc : none'''
import random
import numpy as np
import matplotlib.pyplot as pt
list_p=
list_r=
list_tp=
list_fp=
list_tpr=
list_fpr=
#正例數和反例數
number_p=25
number_n=25
#產生正反例和**值,按照**值從大到小排列
list_data=
[[1,random.random()]
for i in range(number_p)
]list_neg=
[[-1,random.random()]
for i in range(number_n)
]list_data.extend(list_neg)
list_data.sort(key=lambda x: x[1],reverse=true)
for i in list_data:
print(i)
if list_data[0]
[0]==-1:
else:
))for i in range(1,number_p+number_n):
if list_data[i]
[0]==1:
) else:)))
for i in range(number_p+number_n):
print(
"("+str(list_r[i]
)+','+str(list_p[i]
)+')'
)x=np.array(list_r)
y=np.array(list_p)
tpr=np.array(list_tpr)
fpr=np.array(list_fpr)
#pr圖藍色表示
pt.plot(x, y,'b--o',label=
'pr'
)#roc綠色表示
pt.plot(fpr,tpr,'g--o',label=
'roc'
)pt.legend(
)pt.xlim(0, 1)
pt.ylim(0, 1)
pt.title(
"pr and roc curve"
)pt.show(
)
其中一次的資料樣本如下:
[1, 0.972465136805586]
[1, 0.9699186889290848]
[1, 0.9611558285258316]
[1, 0.9490100343890661]
[1, 0.945494922623268]
[-1, 0.9298404375249634]
[-1, 0.9253050908724593]
[1, 0.9179792320057252]
[1, 0.9029249172614586]
[-1, 0.8985088203989411]
[-1, 0.8920543556575127]
[-1, 0.8750351381751852]
[-1, 0.8504740280725512]
[1, 0.8374708361478499]
[-1, 0.8253450779514403]
[-1, 0.8244418984124263]
[1, 0.8181527020041762]
[-1, 0.752244236642972]
[1, 0.7460862224109783]
[1, 0.7432261084515641]
[1, 0.7409454088712828]
[-1, 0.7371362748455107]
[-1, 0.6822955149067242]
[1, 0.5985675419027885]
[-1, 0.5715525471916322]
[1, 0.5531563190065774]
[1, 0.5485301371231199]
[-1, 0.5175250115700692]
[-1, 0.5090063218073044]
[1, 0.5010686374084308]
[-1, 0.482313862965455]
[1, 0.44738013073917726]
[1, 0.43372870862894697]
[-1, 0.4261195587899538]
[1, 0.3776112552826205]
[-1, 0.28961604761188553]
[-1, 0.27955075928742346]
[1, 0.27829042206703614]
[1, 0.2782864067012276]
[-1, 0.27185534894732455]
[-1, 0.23773265429953483]
[-1, 0.22413723937794816]
[1, 0.2119534778887895]
[1, 0.18704185168412202]
[-1, 0.17552218100533823]
[-1, 0.14101947435168005]
[-1, 0.09985538173639386]
[-1, 0.051404226082772286]
[1, 0.025664213506509492]
[1, 0.01205253729664213]
1代表現實是正例,-1代表現實是反例,後面是**值。我們可以按照書上的方法手動推幾個:
分類的閾值首先定為0.972465136805586,只有大於等於閾值的為**為正例,其他的都是反例,那麼tp=1,fp=0,p=1,r=0.04,tpr=0.04,fpr=0;
閾值如果定為0.9699186889290848,tp=2,fp=0,p=1,r=0.08,tpr=0.08,fpr=0
…………
最後pr圖和roc曲線如下:
和書上平滑的曲線差別較大,而且pr曲線受樣本資料分布影響較大。
文中部分機器學習的圖侵刪;
pr曲線和f1、roc曲線和auc
matplotlib.pyplot 常用方法
機器學習 PR曲線, ROC曲線
在機器學習領域,如果把accuracy作為衡量模型效能好壞的唯一指標,可能會使我們對模型效能產生誤解,尤其是當我們模型輸出值是乙個概率值時,更不適宜只採取accuracy作為衡量模型性泛化能的指標 這篇博文會為大家介紹兩種比較二分決策模型效能的方法pr曲線,roc曲線 對於分類問題我們可以直接 輸入...
機器學習中的PR曲線和ROC曲線
主要是我對周志華 機器學習 第二章模型估計與選擇中一些內容的總結 對於二分類問題,可將樣例根據其真實類別與學習器 類別的組合劃分為真正例 tp 假反例 fn 假正例 fp 真反例 tn 具體分類結果如下 查準率p和查全率r分別定義為 查準率關心的是 出正例的正確率 即從正反例子中挑選出正例的問題。查...
機器學習中的PR曲線和ROC曲線
主要是我對周志華 機器學習 第二章模型估計與選擇中一些內容的總結 1.查準率 查全率和f1 對於二分類問題,可將樣例根據其真實類別與學習器 類別的組合劃分為真正例 tp 假反例 fn 假正例 fp 真反例 tn 具體分類結果如下 查準率p和查全率r分別定義為 查準率關心的是 出正例的正確率 即從正反...