如何画ROC曲线?

在机器学习和深度学习里,常用ROC曲线表征系统性能。本文分享初步学习的ROC曲线绘制方法,介绍了ROC曲线横纵坐标FPR和TPR的计算公式,说明了绘制所需的TP、FN、FP和TN的含义,还给出简单示例展示绘制步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在机器学习和深度学习中往往使用ROC曲线(receiver operating characteristic curve,简称ROC曲线)来表征系统的性能。最近初步学了一下如何plot,记录分享一下~

ROC的横纵坐标分别是FPR和TPR,这两个指标计算公式如下:

TPR=TP/(TP+FN)

FPR=FP/(FP+TN)

从公式中可以看出要画ROC曲线需要知道TP、FN、FP和TN。TP和FP分别代表:tp代表得分高于阈值,而且实际中就是同一个人,fp是高于阈值,但不是同一个人。所以TPR代表了正确接受率,而FPR代表了错误拒绝率

用一个图来更加直观的表示TP、FN、FP和TN,便于理解(此处盗图)。


下面举个简单的例子(example):

step1:得到注册和测试者之间的打分。

step2:分别以9个值为阈值,每个值对应四个TP、FN、FP和TN,同时根据这四个值计算TPR和FPR。

step3:计算完step2,得到9个点(每个阈值对应的TPR和FPR为一个点),将9个点连接就是ROC曲线了~

ROC曲线还未出炉,出炉再展示~~

 

若有错误,欢迎指正!

<think>我们被要求使用Python绘制ROC曲线ROC曲线是评估分类模型性能的重要工具,它展示了在不同阈值下真阳性率(TPR)与假阳性率(FPR)之间的关系。绘制ROC曲线通常涉及以下步骤: 1. 训练一个分类模型(这里假设已经训练好)。 2. 使用模型对测试集进行预测,得到预测概率(通常取正类的概率)。 3. 根据不同的阈值计算TPR和FPR。 4. 绘制ROC曲线,并计算AUC值。 引用中提供了多个示例代码,我们可以综合这些示例来编写代码。同,我们需要注意,如果处理多分类问题,可以采用宏平均方法(如引用[3]所示)或二值化处理(如引用[1]所述)。但用户问题中没有明确是多分类还是二分类,我们先以二分类为例。 步骤: 1. 导入必要的库:numpy, matplotlib, sklearn中的roc_curve和auc。 2. 假设我们已有真实标签(y_test)和模型预测的概率(y_score,即属于正类的概率)。 3. 使用roc_curve计算fpr, tpr, thresholds。 4. 使用auc计算曲线下面积。 5. 绘制ROC曲线,并添加参考线(随机猜测的直线)。 下面我们编写一个二分类的ROC曲线绘制代码。如果是多分类,我们可以采用“一对多”策略,为每个类别绘制一条曲线,然后计算宏平均(macro-average)的ROC曲线(如引用[3]所示)。 由于用户问题没有提供具体数据,我们将使用一个示例数据集(比如sklearn自带的鸢尾花数据集)来演示二分类和多分类的情况。 我们先从二分类开始:</think>### 如何使用Python绘制ROC曲线 绘制ROC曲线是评估分类模型性能的重要方法,以下是详细步骤和代码示例: #### 一、核心概念 - **真阳性率(TPR)**:$TPR = \frac{TP}{TP+FN}$,表示实际为正例的样本中被正确预测的比例 - **假阳性率(FPR)**:$FPR = \frac{FP}{FP+TN}$,表示实际为负例的样本中被错误预测的比例 - **AUC值**:曲线下面积,取值范围$[0,1]$,值越大表示模型性能越好 #### 二、二分类任务绘制步骤 ```python # 1. 导入必要库 import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import roc_curve, auc from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression # 2. 生成示例数据 X, y = make_classification(n_samples=1000, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 3. 训练模型并获取预测概率 model = LogisticRegression() model.fit(X_train, y_train) y_score = model.predict_proba(X_test)[:, 1] # 取正类概率 # 4. 计算ROC曲线数据 fpr, tpr, thresholds = roc_curve(y_test, y_score) roc_auc = auc(fpr, tpr) # 5. 绘制ROC曲线 plt.figure(figsize=(8, 6)) plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC曲线 (AUC = {roc_auc:.2f})') plt.plot([0, 1], [0, 1], 'k--', lw=2) # 随机猜测参考线 plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('假阳性率 (FPR)') plt.ylabel('真阳性率 (TPR)') plt.title('ROC曲线示例') plt.legend(loc="lower right") plt.grid(True) plt.savefig('roc_curve.png', dpi=300) plt.show() ``` #### 三、多分类任务绘制方法(宏平均) ```python # 1. 导入多分类专用库 from sklearn.preprocessing import label_binarize from sklearn.multiclass import OneVsRestClassifier from sklearn.metrics import roc_auc_score # 2. 数据预处理(以3分类为例) y_bin = label_binarize(y, classes=[0, 1, 2]) # 二值化标签 n_classes = y_bin.shape[1] # 3. 训练多分类模型 model = OneVsRestClassifier(LogisticRegression()) y_score = model.fit(X_train, y_train).predict_proba(X_test) # 4. 计算各类别ROC数据 fpr, tpr, roc_auc = {}, {}, {} for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_bin[y_test][:, i], y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # 5. 计算宏平均ROC fpr["macro"], tpr["macro"], _ = roc_curve(y_bin[y_test].ravel(), y_score.ravel()) roc_auc["macro"] = auc(fpr["macro"], tpr["macro"]) # 6. 绘制宏平均ROC曲线 plt.plot(fpr["macro"], tpr["macro"], label=f'宏平均ROC (AUC={roc_auc["macro"]:.2f})', color='navy', linestyle=':', linewidth=4) ``` #### 四、关键参数说明 1. **`roc_curve`参数**: - `y_true`:真实标签(需为二进制格式) - `y_score`:模型预测的正类概率值 - `pos_label`:指定正类标签(默认为1) 2. **图形优化技巧**: - 调整`lw`参数控制曲线粗细 - 使用`color`参数设置颜色 - 添加`grid(True)`显示网格线 - 设置`dpi=300`保存高清图像 #### 五、结果解读要点 1. 曲线越靠近**左上角**($FPR=0, TPR=1$)性能越好 2. AUC>0.9表示优秀模型,0.8-0.9表示良好,0.7-0.8表示一般 3. 对角线($AUC=0.5$)代表随机猜测水平 4. 多分类任务中宏平均平等对待所有类别[^3] > 提示:对于不平衡数据集,建议同绘制PR曲线作为补充评估[^1]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值