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曲线
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)
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()
输出结果:
说明:
1、ROC曲线越靠近左上角,模型性能越好,相应的,AUC面积越大则模型性能越好。
2、在同一数据集上不同分类模型的ROC曲线,如果一个模型的ROC曲线可以将另一个包住,则前者性能更好。
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()
输出结果:
P-R曲线(精确率-召回率曲线)以召回率(Recall)为X轴,精确率(Precision)为y轴,直观反映二者间的关系。
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()
输出结果:
说明:
1、模型的精确度和召回率互相制约,P-R曲线越向右上凸,表示模型性能越好。
2、在正负样本数量均衡的情况下,P-R曲线和ROC曲线的趋势差不多,但由于精确率和召回率更关注正样本的情况,当负样本比较多时P-R曲线的反映效果一般,此时使用ROC曲线更合适。