精确率(召回率)的权衡(Machine Learning研习十六)

精确率(召回率)的权衡

为了理解这种权衡,让我们看看 SGDClassifier如何做出分类决策。 对于每个实例,它根据决策函数计算分数。 如果该分数大于阈值,则将该实例分配给正类; 否则它会将其分配给负类。 图 3-4 显示了从左侧最低分数到右侧最高分数的几个数字。 假设决策阈值位于中心箭头(两个 5 之间):您会在该阈值右侧发现 4 个真阳性(实际为 5),以及 1 个假阳性(实际上为 6)。 因此,使用该阈值,精度为 80%(5 分之 4)。 但在 6 个实际的 5 中,分类器仅检测到 4 个,因此召回率为 67%(6 中的 4)。 如果提高阈值(将其移动到右侧的箭头),假阳性(6)会变成真阴性,从而提高精度(在本例中高达 100%),但一个真阳性会变成假阴性 ,将召回率降低至 50%。 相反,降低阈值会增加召回率并降低精确度。

在这里插入图片描述

Scikit-Learn 不允许您直接设置阈值,但它允许您访问它用于进行预测的决策分数。 您可以调用其decision_function()方法,而不是调用分类器的predict()方法,该方法返回每个实例的分数,然后使用您想要根据这些分数进行预测的任何阈值:

在这里插入图片描述

SGDClassifier 使用等于 0 的阈值,因此前面的代码返回与 Predict() 方法相同的结果(即 True)。 让我们提高门槛:

在这里插入图片描述

这证实了提高阈值会降低召回率。 该图像实际上代表的是 5,当阈值为 0 时分类器会检测到它,但当阈值增加到 3,000 时分类器会错过它。

y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,              method="decision_function")

有了这些分数,使用 precision_recall_curve() 函数计算所有可能阈值的精度和召回率(该函数添加最后精度 0 和最后召回率 1,对应于无限阈值):

from sklearn.metrics import precision_recall_curveprecisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores) 

最后,使用 Matplotlib将精度和召回率绘制为阈值的函数(见下图)。 让我们展示一下我们选择的阈值 3,000:

plt.plot(thresholds, precisions[:-1], "b--", label="Precision", linewidth=2) plt.plot(thresholds, recalls[:-1], "g-", label="Recall", linewidth=2) plt.vlines(threshold, 0, 1.0, "k", "dotted", label="threshold") [...]  # beautify the figure: add grid, legend, axis, labels, and circles plt.show()

在这里插入图片描述

在此阈值下,准确率接近 90%,召回率约为 50%。 选择良好的精度/召回率权衡的另一种方法是直接针对召回率绘制精度图,如图 3-6 所示(显示了相同的阈值):

plt.plot(recalls, precisions, linewidth=2, label="Precision/Recall curve") [...]  # beautify the figure: add labels, grid, legend, arrow, and text plt.show()

在这里插入图片描述

您可以看到,当召回率达到 80% 左右时,准确率确实开始急剧下降。 您可能希望在该下降之前选择精确率/召回率权衡,例如,召回率约为 60%。 但当然,选择取决于您的项目。

假设您决定以 90% 的精度为目标。 您可以使用第一个图来找到需要使用的阈值,但这不是很精确。 或者,您可以搜索可提供至少 90% 精度的最低阈值。 为此,您可以使用 NumPy数组的 argmax() 方法。 这将返回最大值的第一个索引,在本例中意味着第一个 True 值:

在这里插入图片描述

要进行预测(目前在训练集上),您可以运行以下代码,而不是调用分类器的 Predict() 方法:

y_train_pred_90 = (y_scores >= threshold_for_90_precision)

让我们检查这些预测的精确度和召回率:

在这里插入图片描述

太棒了,你有一个 90% 精度的分类器! 正如您所看到的,创建具有几乎任何您想要的精度的分类器相当容易:只需设置足够高的阈值,就可以了。 但是等等,不要这么快——如果召回率太低,高精度分类器就不是很有用! 对于许多应用程序来说,48% 的召回率根本就不够好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762140.shtml

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

相关文章

独孤思维:伪造收益图,进行副业收割

01 早年独孤混群。 刚开始只会发自己的副业项目资料。 资料里面全是钩子。 所以被群主踢了。 刚开始很生气,后来发现自己的社群也有人打广告。 才慢慢理解那种感受。 随后混的群,都是以价值分享和副业心得为主。 给社群的其他小伙伴,…

软考高级:软件架构评估:质量属性 - 易用性 和可测试性概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

什么是Scala语言?

Scala 是一种多范式的编程语言,集面向对象编程和函数式编程的特性于一身,运行在 Java 虚拟机(JVM)上,并兼容现有的 Java 程序。Scala 的名字来源于 Scalable Language,意味着它是为了适应大型复杂软件系统的…

基于Springboot+vue的在线试题题库管理系统+数据库+报告+免费远程调试

项目介绍: Springbootvue的在线试题题库管理系统,Javaee项目,springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的在线试题题库管理系统,采用M(model)V(view)C&#x…

Github 2024-03-22 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-22统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10Swift项目1Python项目1Java生态系统中的Spring框架教程集合 创建周期:3980 天开发语言:Java协议类型:MIT LicenseStar数量:35802…

git tag标签使用

创建标签 git checkout test git tag -a v1.0.0 -m v1.0.0里程碑版本 git push origin v1.0.0 删除标签 git tag -d v1.0.0 git push origin :refs/tags/v1.0.0远程分支可以直接在页面删除

【MySQL】3.1MySQL索引的介绍

目录 一、索引的概念 数据库索引 索引的作用 索引的副作用 索引创建的原则(应用场景) 适合建立索引 二、索引的分类和创建 1.普通索引 创建普通索引 1.1直接创建 1.2修改表结构的方式创建普通索引 1.3创建表时创建普通索引 2.唯一索引 2.1…

[python]bar_chart_race绘制动态条形图

最近在 B 站上看到了一个宝藏 up 主,名叫 "Jannchie见齐",专门做动态条形图相关的数据可视化。 可以看到做出的效果还是很不错的,但工具使用的是 JS,不是 Python,于是尝试搜索了一下,看看 Python…

100个openharmony开源demo:1.日历

准备用开发者手机写100个开源的demo不知道能不能实现,日拱一卒,期待蜕变。 第一个demo:日历,借鉴了网上的日历算法,自己用arkts写了界面和点击事件,各位可根据此demo写自己的日历选择器等组件。 1.目录结…

Vue3、element-plus和Vue2、elementUI的一些转换

插槽 Vue3<template #default"scope"></template> <template #footer></template>Vue2<template slot-scope"scope"></template> <template slot"footer"></template>JS定义 Vue3 <script…

【5G NR 协议解读】3GPP TS 38.212 (R18) 复用和信道编码(二)

前言 本文基于3GPP TS 38.212 (R18) 复用和信道编码协议。 本文档规定了5G NR的编码、多路复用和物理信道映射。 5 总体流程 来自/去往MAC层的数据流和控制流会进行编码/解码&#xff0c;以便通过无线传输链路提供传输和控制服务。信道编码方案是错误检测、错误纠正、速率匹配…

ISO 8601:日期和时间的国际标准

ISO 8601 介绍 ISO 8601&#xff0c;介绍一下 ISO 8601 是由国际标准化组织&#xff08;International Organization for Standardization&#xff0c;ISO&#xff09;发布的国际标准&#xff0c;其全称为《数据存储和交换形式信息交换日期和时间的表示方法》。 这一标准提供了…

【网站项目】293学生用品采购系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

供应链投毒预警 | 恶意Py组件tohoku-tus-iot-automation开展窃密木马投毒攻击

概述 上周&#xff08;2024年3月6号&#xff09;&#xff0c;悬镜供应链安全情报中心在Pypi官方仓库&#xff08;https://pypi.org/&#xff09;中捕获1起新的Py包投毒事件&#xff0c;Python组件tohoku-tus-iot-automation 从3月6号开始连续发布6个不同版本恶意包&#xff0c…

【Docker】常用命令 docker search

文章目录 什么是docker search命令基本用法实际示例在Docker Hub搜索名为nginx的镜像搜索包含Python的镜像 常用选项--filter&#xff1a;过滤搜索结果--limit&#xff1a;限制搜索结果数量 总结 在Docker中&#xff0c; docker search命令是用于从Docker Hub或其他镜像仓库搜…

【Python 48小时速成 12】类和对象

在 Python 中&#xff0c;类是一种用于创建对象的蓝图或模板&#xff0c;而对象是根据类创建的实例。类定义了对象的属性和方法。下面是一个简单的类和对象的示例代码&#xff1a; # 定义一个名为 Person 的类 class Person:# __init__ 方法用于初始化对象的属性def __init__(…

sentinel系统负载自适应流控

系统负载自适应流控 规则配置 规则创建 public class SystemRule extends AbstractRule {private double highestSystemLoad -1;private double highestCpuUsage -1;private double qps -1;private long avgRt -1;private long maxThread -1; }SystemRule类包含了以下几…

数据机构-2(顺序表)

线性表 概念 顺序表 示例&#xff1a;创建一个存储学生信息的顺序表 表头&#xff08;Tlen总长度&#xff0c; Clen当前长度&#xff09; 函数 #include <seqlist.c> #include <stdio.h> #include <stdlib.h> #include "seqlist.h" #include &…

Arcade绘制各种各样的文本

""" Example showing how to draw text to the screen.If Python and Arcade are installed, this example can be run from the command line with: python -m arcade.examples.drawing_text """ import arcade# 设置屏幕参数 SCREEN_WIDTH 12…

C/C++ 设置Socket的IP_TOS选项

IP TOS选项是指示IP报文转发的优先级&#xff0c;QOS控制的一种&#xff0c;常规的IP协议TOS都为0&#xff0c;就是普通报文。 设置&#xff1a; IPV4/TOS设置&#xff08;Socket&#xff09;&#xff0c;IPTOS_LOWDELAY 表示FLASH优先级&#xff08;一般用在游戏&#xff0c;…