二分类及多分类ROC和PR曲线绘制
目录
1.二分类曲线
1.1 二分类ROC曲线
1.2 二分类PR曲线
2.多分类曲线
2.1多分类ROC曲线
2.2 多分类PR曲线
前两天2022年第二届全国高校大数据竞赛已经落下帷幕,比赛中也用到了一些分类预测模型,同时也要对这些模型的性能进行评估,那么肯定就少不了ROC曲线以及PR曲线,下面就比赛过程中用到的一些模型及相应的曲线绘制做一个简单的总结。
1.二分类曲线
在绘制曲线之前,首先来看一下混淆矩阵。
其中TP(True positive)为真正类,即真实值是正类,预测值也是正类的样本;FN(False negative)为假负类,即真实值是正类,预测值是负类的样本;FP(False positive)为假正类,即真实值是负类,预测值是正类的样本;TN(True negative)为真负类,即真实值是负类,预测值也是负类的样本。
本文中二分类曲线是将四种模型的曲线绘制在一起进行对比,观察模型性能差异。
1.1 二分类ROC曲线
#绘制ROC曲线
probas_dtc=dtc.predict_proba(x_test)#决策树
probas_rfc=rfc.predict_proba(x_test)#随机森林
probas_gbc=gbc.predict_proba(x_test)#梯度提升树
probas_xgbc=xgbc.predict_proba(x_test)#XGBoost
fpr_dtc,tpr_dtc,thresholds_dtc=roc_curve(y_test,probas_dtc[:,1])
fpr_rfc,tpr_rfc,thresholds_rfc=roc_curve(y_test,probas_rfc[:,1])
fpr_gbc,tpr_gbc,thresholds_gbc=roc_curve(y_test,probas_gbc[:,1])
fpr_xgbc,tpr_xgbc,thresholds_xgbc=roc_curve(y_test,probas_xgbc[:,1])
dtc_auc=auc(fpr_dtc,tpr_dtc)
rfc_auc=auc(fpr_rfc,tpr_rfc)
gbc_auc=auc(fpr_gbc,tpr_gbc)
xgbc_auc=auc(fpr_xgbc,tpr_xgbc)
plt.rcParams['font.family']=['Times New Roman']
plt.rcParams['figure.figsize']=(8,6)
plt.plot(fpr_dtc,tpr_dtc,color='k',label='dtc_AUC=%0.3f'%dtc_auc)
plt.plot(fpr_rfc,tpr_rfc,color='b',label='rfc_AUC=%0.3f'%rfc_auc)
plt.plot(fpr_gbc,tpr_gbc,color='g',label='gbc_AUC=%0.3f'%gbc_auc)
plt.plot(fpr_xgbc,tpr_xgbc,color='y',label='xgbc_AUC=%0.3f'%xgbc_auc)
plt.title('Receiver Operating Characteristic')
plt.legend(loc='lower right')
plt.plot([0,1],[0,1],'r--')
plt.xlim([-0.05,1.05])
plt.ylim([-0.05,1.05])
plt.ylabel('True positive Rate')
plt.xlabel('False positive Rate')
plt.grid(linestyle='-.')
plt.grid(True)
plt.show()
4种模型的ROC曲线:
其中,横坐标为假正率(FPR),即预测为正例但实际为负例的样本占所有负例样本的比例;纵坐标为真正率(TPR),即预测为正例且实际为正例的样本占所有正例样本的比例。计算公式分别如下:
在ROC曲线中,模型的曲线越靠近左上角说明该模型的性能越好,如果曲线发生交叉不太好判断时,可以通过曲线与下方坐标轴围成的面积大小即AUC值来判断,一般曲线都是在对角线的上方,因此AUC的值一般在0.5到1之间,AUC值越大,说明该曲线性能越好。
1.2 二分类PR曲线
#绘制PR曲线
probas_dtc=dtc.predict_proba(x_test)#决策树
probas_rfc=rfc.predict_proba(x_test)#随机森林
probas_gbc=gbc.predict_proba(x_test)#梯度提升树
probas_xgbc=xgbc.predict_proba(x_test)#XGBoost
precision_dtc,recall_dtc,thresholds_dtc=precision_recall_curve(y_test,probas_dtc[:,1])
precision_rfc,recall_rfc,thresholds_rfc=precision_recall_curve(y_test,probas_rfc[:,1])
precision_gbc,recall_gbc,thresholds_gbc=precision_recall_curve(y_test,probas_gbc[:,1])
precisione_xgbc,recall_xgbc,thresholds_xgbc=precision_recall_curve(y_test,probas_xgbc[:,1])
plt.rcParams['font.family']=['Times New Roman']
plt.rcParams['figure.figsize']=(8,6)
plt.plot(precision_dtc,recall_dtc,color='k',label='DecisionTreeClassifier')
plt.plot(precision_rfc,recall_rfc,color='b',label='RandomForestClassifier')
plt.plot(precision_gbc,recall_gbc,color='g',label='GradientBoostingClassifier')
plt.plot(precisione_xgbc,recall_xgbc,color='y',label='XGBoost')
plt.title('Precision-recall curve')
plt.legend(loc='lower left')
plt.plot([1,0],[0,1],'r--')
plt.xlim([-0.05,1.05])
plt.ylim([-0.05,1.05])
plt.ylabel('Precision')
plt.xlabel('Recall')
plt.grid(linestyle='-.')
plt.grid(True)
plt.show()
4种模型的PR曲线:
其中,横坐标为召回率(Recall),纵坐标为准确率(Precision), 计算公式分别如下:
PR曲线代表的是准确率和召回率的关系,曲线越靠近右上角则说明模型训练效果越好。如果曲线发生交叉不太好判断,可以再根据模型的F1得分判断模型性能的好坏,其计算公式如下:
2.多分类曲线
对于多分类曲线,这里是根据模型准确性得分选取得分最高的模型,然后绘制其每一个类别的曲线。
在绘制多分类曲线之前,首先要对数据类别进行编码操作,然后构建模型进行训练。
#编码
from sklearn.preprocessing import label_binarize
y_test1=label_binarize(y_test,classes=[1,2,3,4,5])
n_classes=y_test1.shape[1]
#训练模型
from sklearn.multiclass import OneVsRestClassifier
rfc1=OneVsRestClassifier(DecisionTreeClassifier())
clf=xgbc.fit(x_train,y_train)
y_prob=clf.predict_proba(x_test)
2.1多分类ROC曲线
#绘制多分类ROC曲线
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):fpr[i], tpr[i], _ = roc_curve(y_test1[:, i], y_prob[:, i])roc_auc[i] = auc(fpr[i], tpr[i])
plt.rcParams['font.family']=['Times New Roman']
plt.figure()
lw = 1
colors = ['blue', 'red', 'green', 'black', 'yellow']
for i, color in zip(range(n_classes), colors):plt.plot(fpr[i], tpr[i], color=color, lw=lw,label='ROC curve of class {0} (AUC = {1:0.3f})'''.format(i+1, roc_auc[i]))plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([-0.05, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic for multi-class data')
plt.legend(loc="lower right")
plt.show()
XGBoost模型5种类型的ROC曲线:
这里比较的是五个列表的分类好坏,可以看出第3类的分类效果是最好的;第五类的曲线在对角线下方是由于样本数量太少,导致分类准确性不高。
2.2 多分类PR曲线
#绘制多分类PR曲线
precision = dict()
recall = dict()
for i in range(n_classes):precision[i], recall[i], _ = precision_recall_curve(y_test1[:, i], y_prob[:, i])
plt.rcParams['font.family']=['Times New Roman']
plt.figure()
lw = 1
colors = ['blue', 'red', 'green', 'black', 'yellow']
for i, color in zip(range(n_classes), colors):plt.plot(precision[i], recall[i], color=color, lw=lw+0.5,label='PR curve of class {0}'.format(i+1))plt.plot([1, 0], [0, 1], 'k--', lw=lw)
plt.xlim([-0.05, 1.05])
plt.ylim([0, 1])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Precision recall curve for multi-class data')
plt.legend(loc="lower left")
plt.show()
XGBoost 模型5种分类的PR曲线:
将PR曲线与ROC曲线对比,多分类情况下还是用ROC曲线进行判断比较合适,PR曲线明显不如ROC曲线那么好看,另一个原因也是由于样本数量比较少,在样本数量比较多的情况下,使用PR曲线还是比较不错的。
好啦,总结就到这里!也希望参加比赛的小伙伴可以取得好成绩哦!
二分类及多分类ROC和PR曲线绘制相关推荐
- 【机器学习】scikitLearn分类任务以mnist为例,训练二分类器并衡量性能指标:ROC及PR曲线
分类相关导航: [机器学习]分类任务以mnist为例,数据集准备及预处理 [机器学习]scikitLearn分类任务以mnist为例,训练二分类器并衡量性能指标:ROC及PR曲线 [机器学习]scik ...
- PR详解及二分类的PR曲线绘制
PR详解及二分类的PR曲线绘制 从混淆矩阵可见: 要提高Precesion,只要让预测为正样本的阈值尽可能高(最高为1,即只有当100%认为是正样本时才会被预测为正),即只有极大概率为正才会被预测为正 ...
- 机器学习之类别不平衡问题 (2) —— ROC和PR曲线
机器学习之类别不平衡问题 (1) -- 各种评估指标 机器学习之类别不平衡问题 (2) -- ROC和PR曲线 完整代码 ROC曲线和PR(Precision - Recall)曲线皆为类别不平衡问题 ...
- 【论文精读】ROC和PR曲线的关系(The relationship between Precision-Recall and ROC curves)
近期复习机器学习的一些基本知识,专门精读了一篇关于讲 ROC曲线的PR曲线关系的文章. 文章的title为<The relationship between Precision-Recall a ...
- 机器学习()PR曲线绘制
目录 P-R 曲线绘制 Ground Truth P-R 曲线绘制 Precision-查准率-预测出来的正例中正确的比例---找得对-(查准率高-宁缺毋滥 Recall-查全率-衡量正例被预测出来的 ...
- yolov3--25--Detectron目标检测可视化-P-R曲线绘制-Recall-TP-FP-FN等评价指标
Detectron目标检测平台 评估训练结果(生成mAP) CUDA_VISIBLE_DEVICES=4 python tools/test_net.py --cfg experiments/2gpu ...
- sklearn决策树/随机森林多分类绘制ROC和PR曲线
有篇讲解原理的博文/论文(可看可不看):<为什么Decision Tree可以绘制出ROC曲线?> 一.数据,并要先one-hot多分类标签 from sklearn.preprocess ...
- 分类算法中的ROC与PR指标
本文转自:http://blog.csdn.net/xiahouzuoxin/article/details/43165253 做过图像识别.机器学习或者信息检索相关研究的人都知道,论文的实验部分都要 ...
- Python多分类问题pr曲线绘制(含代码)
研究了三天的多分类pr曲线问题终于在昨天晚上凌晨一点绘制成功了!! 现将所学所感记录一下,一来怕自己会忘可以温故一下,二来希望能给同样有疑惑的铁子们一些启迪! 下图为我画的pr曲线,因为准确度超过了9 ...
最新文章
- Scala implement Comb Sort
- SQL Server 重置SA密码语句
- oracle用户锁定及修改密码
- JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令
- LeetCode 1599. 经营摩天轮的最大利润(模拟)
- python中的参数函数_python中函数与参数的简介
- BZOJ 4421: [Cerc2015] Digit Division 排列组合
- from rfc 2068 hypertext怎么解决_“饮水思源”英语怎么翻译
- eclipse xhtml文件 标签自动提示 问题解决
- 二、噪音大小对使用的影响
- 华为新系统鸿蒙和ios,鸿蒙系统呼之欲出 华为上线新功能和苹果iOS相比如何
- IntelliJ IDEA中使用git
- 【每日一读】EMNLP2020: 面向多跳问答的分层图网络
- 亲戚问我工资多少钱,该说实话吗?
- ORK FrameWork - 自定义存储数据ISaveData接口
- Spring的Bean生命周期
- flashfxp链接Linux
- 网页设计 基础知识汇总
- RFM用户分层模型简介
- 从外包测试到阿里巴巴,一位三本女生逆袭之路