绘制ROC曲线及P-R曲线

绘制ROC曲线及P-R曲线

描述

ROC曲线(Receiver Operating Characteristic Curve)以假正率(FPR)为X轴、真正率(TPR)为y轴。曲线越靠左上方说明模型性能越好,反之越差。ROC曲线下方的面积叫做AUC(曲线下面积),其值越大模型性能越好。P-R曲线(精确率-召回率曲线)以召回率(Recall)为X轴,精确率(Precision)为y轴,直观反映二者的关系。两种曲线都是分类模型常用的可视化评估工具。

本任务使用乳腺癌数据集(breast_cancer),主要实践内容:

1、 基于支持向量机(SVM)建立肿瘤预测模型,并绘制ROC曲线。

2、 基于逻辑回归建模,并绘制PR曲线。

源码下载

环境

  • 操作系统:Windows10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    matplotlib		  3.3.4
    numpy 	        1.19.5
    scikit-learn	  0.24.2
    

分析

本任务涉及以下环节:

1)分别使用支持向量机和逻辑回归建立肿瘤预测模型

2)绘制ROC曲线,计算AUC面积

3)绘制P-R曲线

实施

步骤1、加载、拆分breast_cancer数据集

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np

# 加载breast_cancer数据集
cancer = load_breast_cancer() 

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, 
                                                    random_state=0)

步骤2、建立SVM分类模型,绘制ROC曲线

from sklearn.svm import SVC
from sklearn.metrics import roc_curve, auc

model = SVC(gamma='scale').fit(X_train, y_train) # 创建SVC模型,拟合训练数据

y_score = model.decision_function(X_test) # 计算样本点到分割面的函数距离
fpr, tpr, threshold = roc_curve(y_test, y_score) # 计算假正率、真正率、阈值
auc2 = auc(fpr, tpr) # 计算auc面积,auc值越接近1模型性能越好
# 绘制ROC曲线
plt.title('ROC Curve') # 标题
plt.xlabel('FPR', fontsize=14) # x轴标签
plt.ylabel('TPR', fontsize=14) # y轴标签
plt.plot(fpr, tpr, label='AUC = %0.4f'%auc2, c='r') # 划线
plt.legend(fontsize=12) # 图例

plt.show()

输出结果:

绘制ROC曲线及P-R曲线_第1张图片

说明:

1、ROC曲线越靠近左上角,模型性能越好,相应的,AUC面积越大则模型性能越好。

2、在同一数据集上不同分类模型的ROC曲线,如果一个模型的ROC曲线可以将另一个包住,则前者性能更好。

步骤3、 不同模型的ROC曲线比较 (选做)

  • 使用不同的参数定义三个模型,比较其ROC曲线
  • ROC曲线越靠近左上角(auc面积越大),模型性能越好
model_1 = SVC(gamma='scale').fit(X_train, y_train) # 创建SVC模型,拟合训练数据
model_2 = SVC().fit(X_train, y_train) 
model_3 = SVC(kernel='linear').fit(X_train, y_train) 
models = [model_1, model_2, model_3]

# 绘制ROC曲线
plt.title('ROC Curve') # 标题
for m in models:
    y_score = m.decision_function(X_test) # 计算样本点到分割面的函数距离
    fpr, tpr, threshold = roc_curve(y_test, y_score) # 计算假正率、真正率、阈值
    plt.xlabel('FPR', fontsize=14) # x轴标签
    plt.ylabel('TPR', fontsize=14) # y轴标签
    plt.plot(fpr, tpr, label='AUC=%0.4f'%auc(fpr, tpr)) # 划线
    

plt.legend(fontsize=12) # 图例
plt.show()

输出结果:

绘制ROC曲线及P-R曲线_第2张图片

步骤4、绘制P-R曲线(精确率-召回率曲线)

P-R曲线(精确率-召回率曲线)以召回率(Recall)为X轴,精确率(Precision)为y轴,直观反映二者间的关系。

  • P-R曲线反映了精确率和召回率之间的关系
  • P-R曲线越凸向右上方,表示模型性能越好
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_recall_curve # P-R曲线计算函数

model = LogisticRegression().fit(X_train, y_train) # 创建LR模型,拟合训练数据

y_score = model.decision_function(X_test) # 计算样本点到分割面的函数距离

# PR曲线计算函数(返回值为精确率、召回率、阈值,参数为测试集和上述距离)
precisions, recalls, thresholds = precision_recall_curve(y_test, y_score)

plt.title('P-R Curve') # 标题
plt.xlabel('Recalls', fontsize=14) # x轴标签
plt.ylabel('Precisions', fontsize=14) # y轴标签
plt.plot(recalls, precisions) # 画线
plt.show()

输出结果:

绘制ROC曲线及P-R曲线_第3张图片

说明:

1、模型的精确度和召回率互相制约,P-R曲线越向右上凸,表示模型性能越好。

2、在正负样本数量均衡的情况下,P-R曲线和ROC曲线的趋势差不多,但由于精确率和召回率更关注正样本的情况,当负样本比较多时P-R曲线的反映效果一般,此时使用ROC曲线更合适。

你可能感兴趣的:(机器学习,r语言,机器学习,python)