首页 > 其他分享 >【机器学习300问】48、如何绘制ROC曲线?

【机器学习300问】48、如何绘制ROC曲线?

时间:2024-03-24 13:32:55浏览次数:29  
标签:ROC 48 阈值 300 样本 plt 曲线 概率

        ROC曲线(受试者工作特征曲线)是一种用于可视化评估二分类模型性能的指标。特别是在不同阈值情况下模型对正类和负类的区分能力。那么“阈值”到底是个什么呢?ROC曲线中的每一个点到底是什么意思?

一、ROC曲线的绘制【理论】

        二分类器(模型)输出的是预测样本的正类概率,模型在预测完所有样本的概率后会对其进行降序排序。假设一个样本被二分类器预测输出的概率是0.6,那么到底这个样本是正类还是负类呢?如果我们认为超过0.5的概率就是正类,那么显然该样本的预测标签为“正”。但如果我们认为超过0.6才算正类,那么样本的标签就成“负”的了。所以“阈值”就是人们判定预测结果到底正还是负的一个依据。

        阈值,预测概率大于该阈值样本判定为正,预测概率小于该阈值样本判定为负。ROC曲线绘制的过程,就是逐渐调整阈值,计算每次调整的阈值对应的(FPR,TPR),并在表格上绘制出该点的位置,最后把所有点连起来就得到了ROC曲线。

二、ROC曲线的绘制【实践】

(1)来点数据

序号真实标签模型输出概率(降序排列)
110.95
210.9
310.85
410.8
510.75
600.7
700.65
810.6
900.55
1000.5
1110.45
1200.4
1300.35
1400.3
1510.25
1600.2
1700.15
1800.1
1900.05
2010.0

        假设测试集中有20个样本,如上表所示按照概率降序排列。 分别列出了样本序号,样本真实的分类,模型预测输出的概率。

(2)文字演示

        当阈值为正无穷的时候,也就是说哪怕样本的概率是1,也没有一个样本被模型认为是正类,分类器认为全部都是负的,此时的FP=TP=0,显然FPR=TPR=0,在曲线上的坐标就是(0,0)

        当阈值设定为0.9的时候,上表中样本1和2都被预测为正。此时的P=9,TP=2得到TPR=2/9=0.22。此时没有预测错的样本FP=0算出FPR=0/11=0。最终的在曲线上的坐标就是(0,0.22)

        依次按照文字描述的过程,就可以计算得到所有阈值(这里我们将预测值的分度值设定成0.1,从1.0逐渐下降至0.0)坐标。将点连城线就得到了ROC曲线。

(3)代码演示

① 导入必要的库

import numpy as np
import pandas as pd
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt

② 构造测试集

# 假设我们有如上表格所示的数据存储在一个DataFrame中
sample_data = pd.DataFrame({
    '真实标签': [1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
    '模型输出概率': [0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6, 0.55, 0.5, 0.45, 0.4, 0.35, 
                     0.3, 0.25, 0.2, 0.15, 0.1, 0.05, 0.0]
})
# 可以输出查看一下sample_data

 ③ 绘制ROC曲线

# 将'真实标签'转化为二进制形式(通常真实标签会被编码为0和1)
true_labels = sample_data['真实标签'].astype(int)

# 获取'模型输出概率'
predicted_probs = sample_data['模型输出概率']

# 计算ROC曲线所需的各项指标
fpr, tpr, _ = roc_curve(true_labels, predicted_probs, pos_label=1)

# 计算曲线下面积(AUC)
roc_auc = auc(fpr, tpr)

# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], 'k--')  # 平行于坐标轴的直线,代表随机猜测的结果
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic Curve')
plt.legend(loc="lower right")
plt.show()

        如果我们在图中把0.1,0.2一直到1这十个阈值标出来的话,就是下面这个图:

        在我们文字演示时,设定当阈值=0.9的时候,对应的坐标(0.0.22)在图中很清晰的现实出来了。 上图的代码阈值刻度是sklearn.metrics.roc_curve 函数依据模型输出的概率得分y_score,以排序后从最小到最大的顺序依次作为阈值,计算出每个阈值下的真阳性率(TPR)和假阳性率(FPR),从而生成一系列坐标点绘制成ROC曲线。

标签:ROC,48,阈值,300,样本,plt,曲线,概率
From: https://blog.csdn.net/qq_39780701/article/details/136984755

相关文章

  • WPF initialization for opening and unitialization for closing process
    //xaml<Windowx:Class="WpfApp10.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • P5648 Mivik的神力
    P5648Mivik的神力卡常倍增或树状结构维护想了好久也没思路。首先很容易发现维护静态区间max是很容易的(st表),但是仍然不能快速维护前缀max和。考虑前缀max的性质。首先前缀max的值是单调递增的,对于前缀max序列,可以将其分成若干个内部相等的段。也就是对于每个数\(a_i\)......
  • 五、Spring源码学习之postProcessBeanFactory方法
    简介在应用程序上下文完成其标准初始化后,修改其内部的BeanFactory。此时,所有的bean定义都已经加载完成,但还没有任何bean被实例化。这允许在某些ApplicationContext实现中注册特殊的BeanPostProcessor等。在应用程序上下文的初始化过程中,会经历多个阶段。其中,一个关键阶段......
  • 2.5 如何绘制ROC曲线?
    2.5如何绘制ROC曲线?前情提要:2.4ROC曲线是什么?​事实上,ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的,通过下面的例子进一步来解释“截断点”的概念。​在二值分类问题中,模型的输出一般都是预测样本为正例的概率。假设测试集中有20个样本,表2.......
  • R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为
    全文链接:https://tecdat.cn/?p=35426原文出处:拓端数据部落公众号本文利用R语言,通过逐步逻辑回归模型帮助客户分析两个实际案例:麻醉剂用量对手术病人移动的影响以及汽车购买行为预测。通过构建模型并解释结果,我们探究了各自变量对因变量的影响程度。同时,借助ROC曲线可视化分析,评......
  • CF1948G MST with Matching 题解
    洛谷题面CF题面题目要求一个最小值加上一个最大值的最小值,不好直接做,考虑转化。发现树是二分图,而由柯尼希定理可知二分图的最大匹配等于其最小点覆盖。这样就把求\(\min(\min_{\text{生成树}}+\max_{匹配})\)转化为了\(\min(\min_{生成树}+\min_{覆盖})\)。直接\(\math......
  • CF1927F Microcycle
    环的权值为边权最小值,可以想到从大到小遍历权值,如果一条边加入后出现了环说明这条边的边权就是整个环的权值。类似Kruskal,我们把边权从大到小排序,然后用并查集维护连通情况,算出最小的权值。然后跑dfs找环输出方案。时间复杂度\(\mathcal{O}(m\log{m}+n)\)。#include<bits......
  • Amazon Bedrock 实践 | 动手玩转 Claude 3
    生成式AI和大模型在2024年已经进入落地实践阶段。因此,围绕开发者在生成式应用程序开发中的主要痛点和需求,我们组织了这个“AmazonBedrock实践”的系列,希望可以帮助开发者高效地上手生成式AI和大模型的应用开发,本篇为第一篇。亚马逊云科技开发者社区为开发者们提供全球......
  • C++ Qt开发:QProcess进程管理模块
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QProcess组件实现针对进程的控制管理等。当你在使用Qt进行跨平台应用程序开发时,经常需要......
  • leetcode148. 排序链表-归并法
    148.排序链表题干给你链表的头结点head,请将其按升序排列并返回排序后的链表。示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[]提示:链表中节点的数目在范围[0,5*104]内-105<=N......