Python如何用鸢尾花数据绘制ROC和AUC曲线

发布时间:2023-02-09 09:13:34 作者:iii
来源:亿速云 阅读:186

Python如何用鸢尾花数据绘制ROC和AUC曲线

引言

在机器学习中,评估分类模型的性能是非常重要的。ROC(Receiver Operating Characteristic)曲线和AUC(Area Under Curve)是常用的评估指标之一。ROC曲线通过绘制真正例率(True Positive Rate, TPR)和假正例率(False Positive Rate, FPR)之间的关系来展示模型的分类性能,而AUC则是ROC曲线下的面积,用于量化模型的整体性能。

本文将详细介绍如何使用Python中的scikit-learn库和matplotlib库,基于经典的鸢尾花(Iris)数据集,绘制ROC曲线并计算AUC值。

1. 准备工作

1.1 安装必要的库

在开始之前,确保你已经安装了以下Python库:

你可以使用以下命令安装这些库:

pip install scikit-learn matplotlib numpy pandas

1.2 导入必要的库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc

2. 加载和准备数据

2.1 加载鸢尾花数据集

鸢尾花数据集是scikit-learn库中的一个经典数据集,包含150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),并且每个样本属于3个类别之一(Setosa、Versicolor、Virginica)。

iris = load_iris()
X = iris.data
y = iris.target

2.2 数据预处理

由于ROC曲线和AUC通常用于二分类问题,而鸢尾花数据集是一个多分类问题,我们需要将多分类问题转化为二分类问题。我们可以使用label_binarize函数将标签二值化。

y = label_binarize(y, classes=[0, 1, 2])
n_classes = y.shape[1]

2.3 划分训练集和测试集

为了评估模型的性能,我们需要将数据集划分为训练集和测试集。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)

3. 训练模型

我们将使用逻辑回归模型作为分类器,并使用OneVsRestClassifier来处理多分类问题。

classifier = OneVsRestClassifier(LogisticRegression())
y_score = classifier.fit(X_train, y_train).decision_function(X_test)

4. 计算ROC曲线和AUC

4.1 计算每个类别的ROC曲线和AUC

fpr = dict()
tpr = dict()
roc_auc = dict()

for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

4.2 计算微平均ROC曲线和AUC

微平均ROC曲线是通过将所有类别的预测结果合并后计算的。

fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

4.3 计算宏平均ROC曲线和AUC

宏平均ROC曲线是通过对每个类别的ROC曲线取平均后计算的。

all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))

mean_tpr = np.zeros_like(all_fpr)
for i in range(n_classes):
    mean_tpr += np.interp(all_fpr, fpr[i], tpr[i])

mean_tpr /= n_classes

fpr["macro"] = all_fpr
tpr["macro"] = mean_tpr
roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])

5. 绘制ROC曲线

5.1 绘制每个类别的ROC曲线

plt.figure()
lw = 2
colors = ['aqua', 'darkorange', 'cornflowerblue']
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} (area = {1:0.2f})'
             ''.format(i, roc_auc[i]))

5.2 绘制微平均和宏平均ROC曲线

plt.plot(fpr["micro"], tpr["micro"],
         label='micro-average ROC curve (area = {0:0.2f})'
               ''.format(roc_auc["micro"]),
         color='deeppink', linestyle=':', linewidth=4)

plt.plot(fpr["macro"], tpr["macro"],
         label='macro-average ROC curve (area = {0:0.2f})'
               ''.format(roc_auc["macro"]),
         color='navy', linestyle=':', linewidth=4)

5.3 添加图例和标签

plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([0.0, 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')
plt.legend(loc="lower right")
plt.show()

6. 结果分析

通过上述步骤,我们成功绘制了鸢尾花数据集的ROC曲线,并计算了每个类别的AUC值以及微平均和宏平均的AUC值。从图中可以看出,模型的分类性能较好,AUC值接近1,说明模型能够很好地区分不同类别的鸢尾花。

7. 总结

本文详细介绍了如何使用Python中的scikit-learn库和matplotlib库,基于鸢尾花数据集绘制ROC曲线并计算AUC值。通过本文的学习,你应该能够掌握如何在实际项目中评估分类模型的性能,并理解ROC曲线和AUC的含义。

希望本文对你有所帮助,祝你在机器学习的道路上越走越远!

推荐阅读:
  1. 如何在Python 中计算N的阶乘
  2. 怎么在Python中使用OpenCV标记图像区域轮廓

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python auc roc

上一篇:在SpringBoot怎么优雅的使用多线程

下一篇:MyBatis传入List集合查询数据问题怎么解决

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》