【机器学习】ROC曲线

news2024/9/23 5:06:24

【机器学习】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.coloradmin.cn/o/2156625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cnn机器学习时python版本不兼容报错

在使用python执行CNN算法时&#xff0c;发生如下报错&#xff1a; A module that was compiled using NumPy 1.x cannot be run in NumPy 2.1.1 as it may crash. To support both 1.x and 2.x versions of NumPy, modules must be compiled with NumPy 2.0. Some module may …

网络高级day03(Http)

目录 【1】HTTP简介 【2】 HTTP特点 【3】 HTTP协议格式 1》客户端请求消息格式 1> 请求行 2> 请求头 3> 空行 4> 请求数据 2》服务器响应消息格式 【1】HTTP简介 HTTP协议是Hyper Text Transfer Protocol &#xff08;超文本传输协议&#xff09;的缩写&a…

低代码平台:数据筛选功能的全新变革

随着软件开发需求的不断增长&#xff0c;传统的开发方法因其复杂性和耗时性而逐渐无法满足市场对快速交付和迭代的需求。低代码开发平台作为一种新型的软件开发工具&#xff0c;以其高效、易用的特点受到了广泛的关注和应用。 在软件开发领域&#xff0c;数据筛选是一项基础且…

frpc内网穿透

官网地址&#xff1a;frp官网 本次用到的Liunx包&#xff1a; https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz下载&#xff1a; wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.g…

经典大语言模型解读(3):参数量更大、泛化性能更强的生成式模型GPT-2

概述 在GPT-1的基础上&#xff0c;OpenAI提出了包含15亿参数&#xff08;GPT-1参数量的10倍以上&#xff09;的GPT-2模型。该模型在一个更大规模的文本数据集WebText上进行预训练。与GPT-1依赖特定任务上的有监督微调来提升性能不同&#xff0c;GPT-2具备更强的零样本&#xf…

中小企业体系技术抽象沉淀-异地灾备篇

IT团队内部使用工具 系列文章&#xff1a;https://blog.csdn.net/caicongyang/article/details/136857045 DDL DML管控 https://github.com/hhyo/Archery/ flyway 文档编写 wiki 技术对外输出文档推荐gitbook 同城双活数据同步方案 总览&#xff1a; vivo 系列文章&#x…

脱离枯燥的CRUD,灵活使用Mybatis,根据mybatis动态的xml片段和接口规范动态生成代理类,轻松应付简单业务场景。

需求 需求是这样的&#xff0c;我们有一个数据服务平台的产品&#xff0c;用户先将数据源信息保存到平台上&#xff0c;一个数据源可以提供多个接口服务&#xff0c;而每个接口服务在数据库中存一个具有mybatis语法的sql片段。这样的话&#xff0c;对于一些简单的业务只需要编…

*C++:list

一.list简介 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素…

一文 学透 力扣—N数之和

题目一&#xff1a;1. 两数之和❤ 题目思路 当我们需要查询一个元素是否出现过&#xff0c;或者一个元素是否在集合里的时候&#xff0c;就要第一时间想到哈希法。 本题呢&#xff0c;我就需要一个集合来存放我们遍历过的元素&#xff0c;然后在遍历数组的时候去询问这个集合…

第一个NDK项目

新建项目 选择Native C的项目&#xff0c;我这里给项目的命名是NDKTest。 目录分析 新增了一个cpp目录&#xff0c;里面有一个CMakeLists和.cpp文件。 CMakeLists 文件是用来配置C编译过程的。 # Sets the minimum CMake version required for this project. cmake_minimum_…

[OpenCV] 数字图像处理 C++ 学习——16直方图均衡化、直方图比较 详细讲解+附完整代码

文章目录 前言1.直方图均衡化的理论基础(1)什么是直方图(2)直方图均衡化原理(3)直方图均衡化公式 2.直方图比较理论基础(1)相关性 (Correlation)——HISTCMP_CORREL(2)卡方 (Chi-Square)——HISTCMP_CHISQR(3)十字交叉性 (Intersection) ——HISTCMP_INTERSECT(4)巴氏距离 (Bha…

缓存的思考与总结

缓存的思考与总结 什么是缓存缓存命中率数据一致性旁路模式 Cache aside双写模式直写模式 write through异步写 Write Behind 旁路和双写 案例 新技术或中间的引入&#xff0c;一定是解决了亟待解决的问题或是显著提升了系统性能&#xff0c;并且这种改变所带来的增幅&#xff…

Mysql删库跑路,如何恢复数据?

问题 删库跑路&#xff0c;数据还能恢复吗&#xff1f; 我们经常听说某某被领导训斥了&#xff0c;对领导心生痛恨&#xff0c;然后登录 Mysql 删库跑路。对于闲聊中经常听说过的一个段子&#xff0c;在现实生活中是否真的发生过&#xff0c;如果发生了&#xff0c;我们该如何解…

基于单片机的智能小车的开发与设计

摘要&#xff1a;本文论述了基于 STC89C52 单片机的智能小车的开发与设计过程。该设计采用单片机、电机驱动及光电循迹等技术&#xff0c;保证小车在无人管理状态下&#xff0c;能按照预先设定的线路实现自动循迹功能。在电路结构设计中力求方便&#xff0c;可操作&#xff0c;…

go webapi上传文件

一、导入依赖 import "net/http" 我这里用到了Guid所以安装依赖 go get github.com/google/uuid 二、main.go package mainimport ("fmt""github.com/jmoiron/sqlx""github.com/tealeg/xlsx""log""path/filepath&q…

七彩云南文化旅游网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列

解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列 问题发现问题解决方法一&#xff1a;只监听死信队列&#xff0c;在死信队列里面处理业务逻辑方法二&#xff1a;修改预取值 问题发现 最近再学习RabbitMQ过程中&#xff0c;看到关于死信队列内容&#xff1a; 来自队…

计算机组成原理——存储系统

计算机组成原理——存储系统 存储器层次结构 存储器层次结构如下&#xff1a; 寄存器&#xff08;CPU&#xff09;Cache&#xff08;高速缓冲存储器&#xff09;主存磁盘磁带、光盘等 按照上述层次结构&#xff0c;自下而上速度依次增快、容量相对依次渐小、造价越来越高昂…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【文件系统】上

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

锂电池基础知识

1. 电池的发展史 电池是将化学能转变为电能的装置&#xff0c;通过电池内部的化学反应向外部提供直流电能 1800年Vote伏打电堆 1835年英国Daniel丹尼尔电池 1859年法国Plante铅酸蓄电池 1866年法国Leclanche锌锰电池 1899年瑞典Jungner镍镉电池 1950年Urry碱性电池 1990年索尼…