当前位置: 首页 > article >正文

【机器学习】ROC曲线

【机器学习】ROC曲线

  • 1、ROC曲线简介
  • 2、ROC曲线和AUC值
    • 2.1 ROC曲线
    • 2.2 AUC值
  • 3、实验内容
    • 3.1 准备数据集
    • 3.2 特征提取
    • 3.3 数据集划分
    • 3.4 模型训练与预测
    • 3.5 计算和绘制ROC曲线
    • 3.6 绘制混淆矩阵
    • 3.7 三分类混淆矩阵
  • 4 源代码
    • 4.1 实现ROC二分类
    • 4.2 三分类混淆例子


1、ROC曲线简介

       接受者操作特性曲线(receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve)。在二战期间,雷达系统被广泛应用于检测敌方飞机。为了优化雷达系统的性能,研究人员需要找到一种评估雷达系统的性能的方法。他们引入了信号检测理论中的TPR(真阳性率)和FPR(假阳性率)的概念。TPR表示在所有实际存在目标的情况下,系统正确检测到目标的比例。FPR则表示在所有实际不存在目标的情况下,系统错误地报告目标存在的比例。
       随着计算机技术的进步,ROC曲线在机器学习和模式识别领域得到了广泛应用。它成为了评估分类器性能和选择最佳阈值的重要工具。历史上,统计学家和研究人员对于ROC曲线和AUC的研究也不断深入。他们提出了数学模型和统计方法来解释和推导ROC曲线的性质,并在医学诊断、生物信息学、金融风险评估等领域得到了广泛应用。


2、ROC曲线和AUC值

2.1 ROC曲线

       以鸢尾花的两个种类为标准的分类就是一个二分类问题。判断预测的结果有下面四种结局,见表。

判断结果和实际结果
真阳性(True Positive, TP)判断为Setosa,实际上确实是Setosa
伪阳性(False Positive, FP)判断为Setosa,但实际上是Versicolor
真阴性(True Negative, TN)判断为Versicolor,实际上确实是Versicolor
伪阴性(False Negative, FN)判断为Versicolor,但实际上是Setosa

相关术语
阳性 (P, Positive) 正样本。
阴性 (N, Negative) 负样本。
真阳性 (TP, True Positive) 表明实际是正样本预测成正样本的样本。
真阴性 (TN, True Negative) 表明实际是负样本预测成负样本的样本。
伪阳性 (FP, False Positive) 表明实际是负样本预测成正样本的样本。
伪阴性 (FN, False Negative) 表明实际是正样本预测成负样本的样本。
伪阳性率(False Positive Rate,FPR) 在所有实际为阴性的样本中,被错误地判断为阳性之比率。又称:错误命中率,假警报率 (false alarm rate)。计算公式为:FPR = FP / N = FP / (FP + TN)
真阳性率(True Positive Rate,TPR) 在所有实际为阳性的样本中,被正确地判断为阳性之比率。又称:命中率 (hit rate)、敏感度(sensitivity)。计算公式为:TPR = TP / P = TP / (TP + FN)
       ROC曲线提供了评估分类模型性能的一个直观可视化工具,可以帮助我们了解模型在不同决策阈值下的表现,并根据需求调整模型的分类策略。


2.2 AUC值

       AUC(Area Under the Curve)值是ROC曲线下的面积,它用于评估分类器(或模型)在不同阈值下的性能。AUC值通常被用作衡量二分类问题中分类器的准确性的标准。在绘制ROC曲线时,横轴代表False Positive Rate(FPR),纵轴代表True Positive Rate(TPR)。AUC值表示了ROC曲线下的面积大小,范围从0到1之间,数值越大表示分类器性能越好。
       当AUC值接近1时,说明分类器能够很好地区分正样本和负样本,具有高准确性。相反,AUC值接近0.5时,说明分类器的性能与随机猜测相当;而AUC值小于0.5时,则表示分类器的性能不佳,实际上与随机猜测相反。
       AUC是一个用来评估分类模型性能的常见指标,优点是:适用于正负样本分布不一致的场景;对于分类器性能的评价,不限定单一的分类阈值。


3、实验内容

3.1 准备数据集

       首先使用 load_iris() 函数加载鸢尾花数据集,并将特征矩阵存储在 X 中,分类值存储在 y 中。
       数据集里面的特征依次为花萼长、宽和花瓣长、宽; 而类别标签为0,1,2分别表示山鸢尾(setosa),变色鸢尾(versicolor)和维吉尼亚鸢尾(virginica)
       然后,通过索引操作从 X 中提取了前5条数据,即 X[0:5],以及第二个品种对应的前5条数据: X[50:55]。使用 np.concatenate 函数将这两组数据合并为一个新的特征矩阵 X1。接下来,同样的操作也应用于目标值 y,提取了相应的标签并存储在 y1 中。


3.2 特征提取

       将包含鸢尾花数据集的特征和目标变量按照类别为0和1进行筛选并分离。选择类别为0和1的样本,并将其存储在一个名为iris_new的新数据集中。这是为了将原始的鸢尾花数据集转换为一个二分类任务的数据集。通过这段代码的处理,我们得到了一个包含特征变量X和目标变量Y的数据集,可以用于二分类任务的建模和训练。


3.3 数据集划分

       将特征变量X和目标变量Y按照指定的比例划分为训练集和测试集,并将划分后的结果分别赋值给Xtrain、Xtest、Ytrain和Ytest。

参数解释:

X:特征变量的数据集
Y:目标变量的数据集
test_size:测试集所占的比例,这里设置为0.3,表示测试集占总数据集的30%
random_state:随机种子,用于保证每次划分结果的一致性,设置为420

3.4 模型训练与预测

       创建了一个SVM分类器对象clf,使用线性核函数(kernel=‘linear’)进行分类。然后使用训练集Xtrain和Ytrain对分类器进行训练。接着使用测试集Xtest和Ytest对训练好的模型进行评估,并输出准确率(accuracy)。最后对测试集Xtest进行预测,将预测结果存储在result中。


3.5 计算和绘制ROC曲线

       使用真实标签Ytest和预测结果result计算了真阳性率(True Positive Rate,TPR)、假阳性率(False Positive Rate,FPR)以及阈值(thresholds),然后通过计算得到了AUC值(Area Under Curve,曲线下面积)并将其打印输出。使用plt.plot()函数绘制了ROC曲线,其中真阳性率(TPR)作为纵轴,假阳性率(FPR)作为横轴,并在图例中显示了AUC值。通过plt.plot([0, 1], [0, 1], color=‘navy’, lw=2, linestyle=‘–’)绘制了随机猜测曲线。其他代码用于设置横轴纵轴的取值范围、标签、标题、图例、网格线,并最后显示图表。绘制出的图如图1所示:

在这里插入图片描述


3.6 绘制混淆矩阵

       使用ConfusionMatrixDisplay.from_predictions()函数根据预测结果result和真实结果Ytest绘制了混淆矩阵,设置了颜色条、标签、颜色映射等。其他代码用于设置标题,并最后显示图表。绘制出的图如图2所示:

在这里插入图片描述


3.7 三分类混淆矩阵

       计算和绘制混淆矩阵,并使用seaborn库和matplotlib库进行可视化。首先,我们导入了seaborn、confusion_matrix和matplotlib.pyplot模块。然后,我们设置了seaborn的主题样式。接下来,创建了一个图表对象f和一个子图对象ax。定义了真实标签y_true和预测标签y_pred。使用confusion_matrix函数计算了混淆矩阵C2,并通过指定labels参数设置了类别标签。打印了计算得到的混淆矩阵。使用sns.heatmap函数绘制了热力图,将混淆矩阵中的每个元素以颜色的形式显示出来,并在图表上方加上了注解,注解内容为每个元素的数值。通过plt.title、plt.xlabel和plt.ylabel设置了图表的标题、x轴标签和y轴标签。最后,使用plt.show显示了图表。绘制出的图如图3所示:

在这里插入图片描述


4 源代码

4.1 实现ROC二分类

# 导入模块
from sklearn.datasets import load_iris  # 导入鸢尾花数据集
from sklearn.svm import SVC  # 导入支持向量机分类器
import pandas as pd  # 导入pandas库,用于数据处理和分析
import matplotlib.pyplot as plt  # 导入matplotlib库,用于数据可视化
import numpy as np  # 导入numpy库,用于数值计算
from sklearn.metrics import classification_report, roc_auc_score, confusion_matrix, accuracy_score, roc_curve, auc, \
    ConfusionMatrixDisplay  # 导入一些评估指标和绘图函数
from sklearn.model_selection import train_test_split  # 导入数据集划分函数

# 加载数据集
iris = load_iris()  # 加载鸢尾花数据集
iris_data = pd.DataFrame(iris.data, columns=iris.feature_names)  # 将特征数据转换为DataFrame格式
iris_data['class'] = iris.target  # 添加目标变量到DataFrame中

# 数据预处理
iris_new = iris_data[iris_data['class'] < 2]  # 选择类别为0和1的样本作为二分类任务的数据集
X = iris_new.iloc[:, :-1]  # 特征变量
Y = iris_new.iloc[:, -1]  # 目标变量

# 数据集划分
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y, test_size=0.3, random_state=420)  # 划分训练集和测试集

# 模型训练与预测
clf = SVC(C=1, gamma='auto', kernel='linear')  # 创建SVM分类器对象
clf.fit(Xtrain, Ytrain)  # 使用训练集进行模型训练
clf.score(Xtest, Ytest)  # 使用测试集对模型进行评估,输出准确率
result = clf.predict(Xtest)  # 对测试集进行预测
print(result)

# 计算ROC曲线的参数
fpr, tpr, thresholds = roc_curve(Ytest, result)  # 计算真阳性率、假阳性率和阈值
roc_auc = auc(fpr, tpr)  # 计算AUC值
print(roc_auc)

# 绘制ROC曲线
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)  # 绘制ROC曲线
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')  # 绘制随机猜测曲线
plt.xlim([0.0, 1.0])  # 设置x轴的取值范围
plt.ylim([0.0, 1.05])  # 设置y轴的取值范围
plt.xlabel('False Positive Rate')  # 设置x轴标签
plt.ylabel('True Positive Rate')  # 设置y轴标签
plt.title('Receiver operating characteristic example')  # 设置图表标题
plt.legend(loc="lower right")  # 添加图例
plt.grid(color='purple', linestyle='--')  # 添加网格线
plt.show()  # 显示图表

# 绘制混淆矩阵
ConfusionMatrixDisplay.from_predictions(Ytest, result, colorbar=True, display_labels=["0", "1"],
                                         cmap=plt.cm.Reds)  # 根据预测结果和真实结果绘制混淆矩阵
plt.title("Confusion Matrix")  # 设置图表标题
plt.show()  # 显示图表


4.2 三分类混淆例子

import seaborn as sns
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt

sns.set()  # 设置seaborn主题
f, ax = plt.subplots()  # 创建一个图表和子图对象
y_true = [0, 0, 1, 2, 1, 2, 0, 2, 2, 0, 1, 1]  # 真实标签
y_pred = [1, 0, 1, 2, 1, 0, 0, 2, 2, 0, 1, 1]  # 预测标签
C2 = confusion_matrix(y_true, y_pred, labels=[0, 1, 2])  # 计算混淆矩阵
print(C2)  # 打印混淆矩阵

sns.heatmap(C2, annot=True, ax=ax)  # 绘制热力图,显示混淆矩阵中的每个元素并在图表上方加注解

plt.title("confusion matrix")  # 设置图表标题
plt.xlabel("predict")  # 设置x轴标签
plt.ylabel("true")  # 设置y轴标签
plt.show()  # 显示图表



http://www.kler.cn/a/320381.html

相关文章:

  • SpringBoot中Maven的定义及国内源配置教程,实现自动获取Jar包
  • 使用Python编写一个简单的网页爬虫,从网站抓取标题和内容。
  • 大模型呼叫中心,如何建设呼入机器人系统?
  • Java多线程回顾总结
  • 微博短链接平台-项目测试用例设计(Xmind)
  • 【微信小程序】访客管理
  • AtCoder Beginner Contest 372
  • 抓机遇,促发展——2025第十二届广州国际汽车零部件加工技术及汽车模具展览会
  • MySQL的基础用法一
  • 【论文阅读】视觉里程计攻击
  • 【机器学习】Zygote.jl
  • ollydbg 小记
  • 每天一道面试题(17):服务网格学习笔记
  • 社区团购的创新与变革——融合开源链动 2+1 模式、AI 智能名片及 S2B2C 商城小程序
  • 2024一线大厂网络安全面试题+答案,看完offe拿到手软!
  • .NET 反序列化加载哥斯拉内存马的工具
  • 计算机毕业设计 基于Python医院预约挂号系统 Django+Vue 前后端分离 附源码 讲解 文档
  • 大语言模型之LlaMA系列- LlaMA 2及LLaMA2_chat(上)
  • 【OSS安全最佳实践】对OSS表格文件中的敏感数据进行脱敏
  • 3分钟,教你判断自己适不适合做项目管理!
  • 前端开发之原型模式
  • FPGA题目记录2
  • 【RDMA】mlxconfig修改和查询网卡(固件)配置--驱动工具
  • 双十一好货推荐有哪些?五大双十一种草好物推荐!
  • chatgpt复旦大学张奇老师《自然语言处理导论》AI好书PDF分享,不看后悔一辈子!
  • 【计算机网络 - 基础问题】每日 3 题(二十三)