机器学习笔记--PR曲线和ROC曲线
最近在看周志華老師的機器學習,本文主要是對PR圖和ROC曲線的整理。
一、PR圖
對于二分類問題,根據分類結果能形成“混淆矩陣”。
P是查準率,R是查全率,定義如下:
- 查準率P類似于,“檢索出的信息中有多少比例是用戶感興趣的”;
- 查準率R類似于,“用戶感興趣的信息中有多少被檢索出來了”;
一般來說,查準率和查全率是一對矛盾的度量,書上給出的“P-R圖”比較平滑,現實中局部波動較大。
二、ROC曲線
ROC全稱是“受試者工作特征”曲線,縱軸是“真正例率”TPR,橫軸是“假正例率”FPR,兩者同樣基于混淆矩陣,定義如下:
可以通過AUC(曲線下的面積)比較兩個分類器的性能。
三、如何畫PR圖和ROC曲線
我們要清楚的是,分類器做預測,是不會直接輸出類別符號,而是給出屬于某個類別的概率值,比如說預測當前西瓜是好瓜的概率是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 : schillerxu@qq.com @License : (C)Copyright 2020-2021, SchillerXu @Desc : None '''import random import numpy as np import matplotlib.pyplot as ptlist_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:list_fp.append(1)list_tp.append(0) else:list_tp.append(1)list_fp.append(0) list_p.append(list_tp[0]/(list_tp[0]+list_fp[0])) list_r.append(list_tp[0]/number_p) list_tpr.append(list_tp[0]/number_p) list_fpr.append(list_fp[0]/number_n)for i in range(1,number_p+number_n):if list_data[i][0]==1:list_tp.append(list_tp[i-1]+1)list_fp.append(list_fp[i-1])else:list_tp.append(list_tp[i-1])list_fp.append(list_fp[i-1]+1) list_p.append(list_tp[i]/(list_tp[i]+list_fp[i]))list_r.append(list_tp[i]/number_p)list_tpr.append(list_tp[i]/number_p)list_fpr.append(list_fp[i]/number_n)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曲线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度云虚拟主机
- 下一篇: python实现Excel中的数据透视表