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

一文彻底理解机器学习 ROC-AUC 指标

在机器学习和数据科学的江湖中,评估模型的好坏是非常关键的一环。而 ROC(Receiver Operating Characteristic)曲线和 AUC(Area Under Curve)正是评估分类模型性能的重要工具。

这个知识点在面试中也很频繁的出现。尽管理解这些概念本身不难,但许多人在复习时容易混淆,或在面试紧张时忘记,影响回答效果。

本篇文章将会从基础概念入手,逐步深入到实际操作。我们会详细解释 ROC 曲线和 AUC 的定义和意义,通过实例和代码示范帮助大侠掌握这些工具的使用方法,最后通过一些实际应用案例和相关概念的对比,力求全面理解并灵活运用 ROC 和 AUC。
在这里插入图片描述

  1. 基础概念介绍
    1.1 什么是 ROC 曲线
    ROC 曲线,即接收者操作特征曲线,ROC曲线产生于第二次世界大战期间,最早用在信号检测领域,侦测战场上的敌军载具(飞机、船舰)。现在是是用来评价二分类模型性能的常用图形工具。它通过显示真阳性率(True Positive Rate,简称 TPR)与假阳性率(False Positive Rate,简称 FPR)之间的权衡来帮助我们理解模型的分类能力。

1.2 什么是 AUC
AUC,即曲线下面积(Area Under Curve),是 ROC 曲线下面积的一个数值表示。它提供了一个定量的指标,用来衡量分类模型的整体表现。AUC 值范围从 0 到 1,值越大表示模型性能越好。

1.3 为何需要 ROC/AUC
在分类任务中,特别是当数据集类别不平衡时,单纯依赖准确率(Accuracy)可能会造成误导。为了更好地理解这一点,让我们通过一个例子来说明。

例子说明
假设我们有一个武侠元素的数据集,其中 95% 的样本是普通弟子,5% 的样本是高手。

让我们通过代码示例来演示这一点(代码供复现使用,可直接跳过下滑到解释部分):

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, roc_auc_score, accuracy_score, confusion_matrix

生成一个极度不平衡的武侠数据集

假设特征表示武功修炼时间、战斗胜率等,标签表示是否为高手

X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, weights=[0.95, 0.05], random_state=42)

将数据集分为训练集和测试集

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

创建一个总是预测普通弟子的模型

class AlwaysNegativeModel:
def predict(self, X):
return np.zeros(X.shape[0])

训练和预测

model = AlwaysNegativeModel()
y_pred = model.predict(X_test)

计算混淆矩阵和准确率

cm = confusion_matrix(y_test, y_pred)
accuracy = accuracy_score(y_test, y_pred)

计算 ROC 曲线和 AUC

在这里我们需要一个概率预测来计算 ROC 曲线和 AUC,为了演示,我们假设模型输出的是一个常量概率

y_pred_prob = np.zeros(X_test.shape[0])
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)
auc = roc_auc_score(y_test, y_pred_prob)

可视化结果

plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)
plt.title(“混淆矩阵”)
plt.imshow(cm, interpolation=‘nearest’, cmap=plt.cm.Blues)
plt.colorbar()
plt.xlabel(“预测标签”)
plt.ylabel(“真实标签”)
plt.xticks([0, 1], [“普通弟子”, “高手”])
plt.yticks([0, 1], [“普通弟子”, “高手”])
for i in range(2):
for j in range(2):
plt.text(j, i, cm[i, j], ha=“center”, va=“center”, color=“red”)

print(f"准确率: {accuracy:.2f}“)
print(f"AUC: {auc:.2f}”)
结果分析
如果我们使用一个简单的分类器,它总是预测所有样本为普通弟子。

这个模型的准确率为 95%,看起来表现很好,但实际上它根本无法识别高手,是一个毫无用处的分类器。

这个分类器没有任何实际的分类能力,因为它无法识别出真正的高手。
在这里插入图片描述
ROC 曲线和 AUC:通过绘制 ROC 曲线并计算 AUC,我们可以看到 AUC 为 0.50,这表明模型没有任何区分能力。ROC 曲线是一条对角线,显示模型在随机猜测。

准确率只告诉我们模型整体预测正确的比例,但在类别不平衡的情况下,这个指标可能会误导我们。ROC 曲线和 AUC 提供了更全面的视角,展示了模型在不同阈值下的性能,帮助我们更准确地评估模型的分类能力。
2. 详细解释
2.1 TPR(True Positive Rate)和 FPR(False Positive Rate)的定义
要理解 ROC 曲线,首先需要明白 TPR 和 FPR 的概念:

TPR(True Positive Rate):也称为灵敏度(Sensitivity)或召回率(Recall),表示的是在所有真实为正的样本中,被正确预测为正的比例。其计算公式为:
在这里插入图片描述
其中,TP(True Positives)是将正类正确分类为正类的样本数,FN(False Negatives)是将正类错误分类为负类的样本数。
FPR(False Positive Rate):表示的是在所有真实为负的样本中,被错误预测为正的比例。其计算公式为:

在这里插入图片描述
其中,FP(False Positives)是将负类错误分类为正类的样本数,TN(True Negatives)是将负类正确分类为负类的样本数。

2.2 AUC 的数学定义
AUC(Area Under Curve)是 ROC 曲线下的面积,用于评估分类模型的性能。AUC 值的范围从 0 到 1,值越大表示模型的性能越好。

数学上,AUC 可以通过积分计算:
在这里插入图片描述
在离散情况下,AUC 可以通过梯形法则近似计算:
在这里插入图片描述
3 绘制 ROC 曲线的步骤
绘制 ROC 曲线的步骤如下:

选择阈值:从 0 到 1 的不同阈值。

计算 TPR 和 FPR:对于每个阈值,计算相应的 TPR 和 FPR。

绘制曲线:以 FPR 为横轴,TPR 为纵轴,绘制 ROC 曲线。
在这里插入图片描述
选择阈值:从 0 到 1 的不同阈值
from sklearn.metrics import roc_curve

预测测试集概率

y_pred_prob = model.predict_proba(X_test)[:, 1]

计算 ROC 曲线

fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)

输出部分阈值

print("阈值: ", thresholds[:10]) # 仅展示前10个阈值
计算 TPR 和 FPR:对于每个阈值,计算相应的 TPR 和 FPR

输出部分阈值对应的 TPR 和 FPR

for i in range(10): # 仅展示前10个阈值的对应值
print(f"阈值: {thresholds[i]:.2f} -> 假阳性率 (FPR): {fpr[i]:.2f}, 真阳性率 (TPR): {tpr[i]:.2f}")
绘制曲线:以 FPR 为横轴,TPR 为纵轴,绘制 ROC 曲线
import matplotlib.pyplot as plt

可视化 ROC 曲线

plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color=‘blue’, lw=2, label=‘ROC 曲线’)
plt.plot([0, 1], [0, 1], color=‘gray’, lw=1, linestyle=‘–’, label=‘随机猜测’)
plt.xlabel(“假阳性率 (FPR)”)
plt.ylabel(“真阳性率 (TPR)”)
plt.title(“ROC 曲线”)
plt.legend(loc=“lower right”)

在曲线上标出几个阈值点

threshold_points = [0.2, 0.5, 0.8]
for threshold in threshold_points:
idx = np.where(thresholds >= threshold)[0][0]
plt.scatter(fpr[idx], tpr[idx], marker=‘o’, color=‘red’)
plt.text(fpr[idx], tpr[idx], f"阈值={threshold:.2f}", fontsize=12)

plt.show()

plt.subplot(1, 2, 2)
plt.title(“AUC 值示意”)
plt.fill_between(fpr, tpr, color=‘blue’, alpha=0.3)
plt.plot(fpr, tpr, color=‘blue’, lw=2, label=f"AUC = {auc:.2f}")
plt.xlabel(“假阳性率”)
plt.ylabel(“真阳性率”)
plt.legend(loc=“lower right”)

plt.tight_layout()
plt.show()

print(f"AUC: {auc:.2f}")

那么,我们该如何学习大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、大模型全套的学习路线

学习大型人工智能模型,如GPT-3、BERT或任何其他先进的神经网络模型,需要系统的方法和持续的努力。既然要系统的学习大模型,那么学习路线是必不可少的,下面的这份路线能帮助你快速梳理知识,形成自己的体系。

L1级别:AI大模型时代的华丽登场

L2级别:AI大模型API应用开发工程

L3级别:大模型应用架构进阶实践

L4级别:大模型微调与私有化部署

一般掌握到第四个级别,市场上大多数岗位都是可以胜任,但要还不是天花板,天花板级别要求更加严格,对于算法和实战是非常苛刻的。建议普通人掌握到L4级别即可。

以上的AI大模型学习路线,不知道为什么发出来就有点糊,高清版可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

相关文章:

  • QT向已有ZIP中追加文件
  • (55)MOS管专题--->(10)MOS管的封装
  • WBTC与BTC的主要区别
  • 内网安全【2】-域防火墙
  • C++链表相关内容温习回顾——移除链表元素
  • 线程池吞掉异常的case:源码阅读与解决方法
  • 【Python支持多种数据类型及案列】
  • ROS系统中解析通过CAN协议传输的超声波传感器数据
  • nginx安装环境部署(完整步骤)
  • java如何截取字符串
  • 【亲测可用】docker进入正在运行的容器
  • 【代码随想录训练营】【Day 50】【动态规划-9】| Leetcode 198, 213, 337
  • 访问jlesage/firefox镜像创建的容器中文乱码问题
  • Mac 终端报错 zsh: command not found: brew 解决方案
  • JVM 三色标记算法
  • JS 中的深拷贝与浅拷贝
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Docker: 容器互访的三种方式
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • MySQL QA
  • MySQL用户中的%到底包不包括localhost?
  • MySQL主从复制读写分离及奇怪的问题
  • Spark学习笔记之相关记录
  • Vim Clutch | 面向脚踏板编程……
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 编写符合Python风格的对象
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 写代码的正确姿势
  • 因为阿里,他们成了“杭漂”
  • 【云吞铺子】性能抖动剖析(二)
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​io --- 处理流的核心工具​
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (0)Nginx 功能特性
  • (2)(2.10) LTM telemetry
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (4)logging(日志模块)
  • (rabbitmq的高级特性)消息可靠性
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (独孤九剑)--文件系统
  • (三)elasticsearch 源码之启动流程分析
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (图)IntelliTrace Tools 跟踪云端程序
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .NET 4.0中的泛型协变和反变
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET项目中存在多个web.config文件时的加载顺序