如何画ROC曲线

假设我们现在要画一个已经训练好的二分类模型A的ROC曲线。

如下是20个测试样本,第一列代表样本id,第二列代表他们的真实类别(p表示正样本,n表示负样本),最后一列代表训练好的模型A认为每个样本是正样本的概率。
在这里插入图片描述

下面就是此训练好的模型A的ROC曲线的画法:

第一步:按照属于‘正样本’的概率将所有样本排序(如上图所示)
第二步:把分类阈值设为最大,即把所有样例均预测为反例,所以此时得到P和R均为0,即(0,0)
第三步:让我们依次来看每个样本。
对于样本1,如果我们将他的score值做阈值,也就是说,只有score大于等于0.9时,我们才把样本归类到正样本,这么一来, 在ROC曲线图中,样本1对应的混淆矩阵(confusion matrix)为:

*预测结果*
真实情况正例反例
正例19
反例010

第一个样本score=0.9,所以预测为正样本,其本身也为正样本,其他样本score都<0.9,所以都预测为负样本,从混淆矩阵中,我们可以算出X轴坐标(false positive rate)= 0/(0+10)= 0 和Y轴坐标(true positive rate)= 1/(1+9)= 0.1,所以第一个点为(0,0.1)

对于样本2,如果我们将他的score值做阈值,也就是说,只有score大于等于0.8时,我们才把样本归类到正样本,这么一来, 在ROC曲线图中,样本2对应的混淆矩阵(confusion matrix)为:

*预测结果*
真实情况正例反例
正例28
反例010

第一个和第二个样本score>=0.8,所以预测为正样本,其本身也为正样本,其他样本score都<0.9,所以都预测为负样本,从混淆矩阵中,我们可以算出X轴坐标(false positive rate)= 0/(0+10)= 0 和Y轴坐标(true positive rate)= 2/(2+8)= 0.2,所以第二个点为(0,0.2)

对于样本3,如果我们将他的score值做阈值,也就是说,只有score大于等于0.7时,我们才把样本归类到正样本,这么一来, 在ROC曲线图中,样本3对应的混淆矩阵(confusion matrix)为:

*预测结果*
真实情况正例反例
正例28
反例19

第一、二、三个样本score>=0.7,所以预测为正样本,第一、二个样本其本身也为正样本,第三个样本其本身为负样本,其他样本score都<0.7,所以都预测为负样本,从混淆矩阵中,我们可以算出X轴坐标(false positive rate)= 1/(1+9)= 0.1 和Y轴坐标(true positive rate)= 2/(2+8)= 0.2,所以第二个点为(0.1,0.2)

后面都类似,依次将分类阈值设为每个样例的预测值,即依次将每个样例划分为正确。一共可以得到20个点,所画的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]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值