日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习笔记--PR曲线和ROC曲线

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习笔记--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曲线的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。