机器学习模型监控的 9 个技巧
机器学习 (ML) 模型是非常敏感的软件;它们的成功使用需要进行仔细监控以确保它们可以正常工作。
当使用所述模型的输出自动做出业务决策时尤其如此。这意味着有缺陷的模型通常会对终端客户的体验产生真正的影响。
因此,监控输入数据(和输出)对于模型实现其真正目标至关重要:有助于推动企业进行良好的决策并帮助企业实现其目标。
在生产环境中使用机器学习模型时,您可以使用以下一些可行的、与框架无关的技巧来制定更强大的监控策略。(许多技巧彼此之间有一些重叠——这是因为它们应该被用作综合策略的一部分,而不是一次性的解决方法)
一、平均值并不能说明全部情况
背景
您可以监控所使用模型中数值特征的平均值。您这样做是因为您想检测数据问题,了解何时特征和标签分布发生变化等。
说明
平均值监控并不能告诉您全部情况,因为它带有一些不一定符合现实的假设。例如:
如果缺少数据,大多数数值工具会忽略这些数据并计算剩余(非空)数据的平均值;
它假设数据问题将大到足以显着移动平均值。或者,特征变化也可能使平均值移动很多,但不会影响更高的百分位数——这通常是做出模型决策的地方。
它假设模型分数的变化与基于它的动作具有线性关系。
简而言之,可能存在严重影响数据的问题,但特征的平均值可能根本不会移动,这就是为什么除了它之外还应该包括其他角度的一些原因。
建议
监控数字特征值的百分位数——例如:第 99、95、90 和 10、5、1 个百分位数。这样,即使平均特征值没有变化,您也可以检测尾部示例发生变化的情况。这对于数据分布偏斜或不平衡的情况特别有用。
监控所有特征的缺失值率。这需要单独监控,因为很大比例的缺失值是一个大问题——即使非缺失值的平均值没有太大变化。
将监控拆分为子群体,以检测仅影响总得分样例子集的问题。
二、策略/决策层需要额外的监控
背景
该模型用于使用某种策略做出决策(拒绝/批准贷款,显示/不显示广告片等)。
您从技术角度(特征值、精度、准确性等)监控模型,但从中做出什么决策并不明显(这是策略/决策层)。
说明
从技术角度监控模型是不够的,因为这并不能让其他利益相关者清楚地了解业务受到的影响。
您还应该监控使用模型做出的决策,以确保模型交付预期的业务价值。
建议
监控使用模型做出的决策。例如:每天有多少人获得风险模型批准的贷款?每天有多少人的账户被欺诈?在这里监视绝对值和相对值通常很有用。
请注意根据目标受众调整粒度级别:如果您的模型多次为给定客户评分,那么您的目标受众可能对客户汇总的指标比对单个实体评分更感兴趣。
如果您正在运行实时模型,由于训练/服务偏差不匹配而做出了多少错误决策?您还应该对此进行监控。
三、将监控分解为亚群以获得更好的洞察力
背景
您负责维护大量使用的机器学习模型,这些模型用于每天对许多单独的样例进行评分。
您通过仪表板监控特征,并且您想要调查几个“有趣”的模式,但通常需要花费大量时间来追踪这些问题的原因。
说明
一种更容易理解数据或模型问题的方法是将监控数据拆分为子群体(模型评分的数据子集)并分别监控。
这样做的原因是,许多数据问题对样例的某些子集具有关键影响,但它们在整个数据集的影响可能会“消失”,因为当您查看整个数据集的聚合值时,它们的绝对影响不足以感受到。
建议
与其查看整个数据集的聚合特征/分值,不如将其分解为子群体并监控它们。
例如:如果您有欺诈模型,则可能值得根据每个得分示例中使用的设备类型(网络、移动设备等)来拆分监控。
还要监控不同人群的原始计数(每天对每个样本评分的数量、百分比是多少等)
四、适当的特征编码使监控更容易
背景
模型中使用的特征通常经过预处理或编码,以使其能够在某些分类器中使用。这有时是一个问题,因为很难以可视化或程序化的方式监控复杂的、精心设计的特征,而这些特征在第一眼看起来并不明显。
说明
通过仔细编码(或解码)特征,您可以更轻松地进行监控。这是因为大多数监控框架更适合数值和分类值。如果您使用不同类型的特征(例如:词嵌入、地理位置坐标),您可能需要将它们解码(例如:分别解码为字符串和城市名称),以便您可以更轻松地分析报表和在绘图中的展示这些特征。
此外,您可能希望监控原始(非预处理、非编码)值,因为这样可以更轻松地与其他团队沟通并在出现问题时进行故障排除。
建议
除了特征本身之外,还监控输入值(即不一定是特征本身,而是用于构建特征的信息)。当您对它们应用多个数字转换时,这很有用。
只要有可能,将布尔特征值编码为浮点数(1.0、0.0 和 null),以便像常规数值变量(提取平均值和其他数值属性等)一样更容易监控它们,并重用为这些变量制作的所有工具。
对于使用 one-hot-encoding 或 target-encoding 等策略编码的分类特征,您可能希望将它们解码回其原始值,以便您可以监控实际的类,而不是编码的类别。
五、通过一致性减轻监控的负担
背景
你负责维护/运营一个或多个机器学习模型,每个模型都有几个特性,以不同的方式使用,等等。
您有多个仪表板和报告正在生成;但是,它们所需的工作量太大并且需要大量时间。
说明
可以减少负担和通过仪表板和监控报告所需的时间。做到这一点的一种方法是促进一致性和标准化,从而最大限度地降低上下文切换成本,并使您的团队更加高效/有效。
建议
使用单一工具监控一切。如果可能的话,使用单一工具/供应商监控所有模型。这使得在多个模型之间共享配置变得更加容易。
一致地排序特征。例如:根据特征重要性对特征图进行排序,以便您可以快速查看是否存在需要调查的严重问题(或仅按字母顺序排列)
统一命名:如果您需要命名文件、数据集、仪表板、表格等,请确保遵循某种模式(如:<team-name>-<model-name>-<date>),以便为整个团队自动化和配置这些更容易。
六、监控监控作业(元监控)
背景
您使用辅助例行程序、批处理作业或临时脚本来处理模型日志数据。您可以使用这些例行程序来分析模型特征和分数并输出聚合值。您还可以使用这些工具在特定条件下生成警报。
声明
模型监控批处理作业/例行程序只是另一个软件,它们通常会不时停止工作(有人更改了表的名称,脚本中断,您的凭据过期等)。
如果您指望监视作业/例行程序/脚本来运行并发出问题信号,那么缺少警报可能会导致您认为一切正常,而实际上监视作业只是没有运行或它们存在一些问题。
您需要自己监控监控作业以防止这种情况(元监控)。
建议
监控作业的执行时间。稳步增加的执行时间可能表明您很快将不得不改变策略。执行时间太短可能表明作业中存在其他问题。
使用心跳式警报。您可以在每个作业/脚本的末尾添加一个步骤,以向其他系统发送 ping。当某些事情没有发生时,心跳警报就会响起,例如,如果后端超过 24 小时没有收到 ping。
七、批量监控模式
背景
您有批处理作业来分析模型日志数据并计算这些数据的聚合(每天的平均特征值、平均分数等),但实际上需要有人去查看数据以查看是否一切正常。
说明
创建被忽略的监控报告很容易,因为没有人有时间主动去仪表板/笔记本并查看结果。以下是一些使它们更有用和更有效的方法。
建议
让作业在每次运行结束时主动将结果(图表、表格等)作为消息发送到您的电子邮件。在消息正文中,只包含最重要的信息。
这里的想法是拥有足够的信息,以便您可以快速查看是否有任何问题。
在消息正文中,添加指向完整仪表板/报告数据的链接,以便人们可以在需要时查看整个内容。
编写可以默认处理历史数据的代码:这样可以更轻松地重用代码进行历史分析和增量(例如每日)监控。
尽可能使用业务语言,以便所有利益相关者(不仅仅是技术人员)都能理解模型对业务决策的影响。
八、训练/服务偏差监控(仅限实时模型)
背景
用于实时推理的模型通常以批量方式对从数据库中检索的历史数据进行训练。
这会产生用于训练的数据路径与用于推理的数据路径不完全匹配的风险(通常是 HTTP 调用外部服务以获取特征)。这称为训练/服务偏差。
说明
训练/服务偏差是部署实时模型时应考虑的主要风险。只要模型在使用中,就必须持续监控。
这里不匹配的最常见原因是模型依赖于实时获取特征数据的外部服务的变化。
建议
监控批处理/实时流之间的精确匹配率(即,如果两个流之间存在精确匹配,则为 1,如果没有精确匹配,则为 0)并像监控其他特征一样监控此值。这样你就可以看到每个特征有多少偏差。
监控偏差的大小:对于批处理和实时数据路径之间不匹配的情况,它有多严重?这只是一个小差异还是一个大差异?
监控计数:监控给定日期的每个数据路径中有多少示例。这很重要,因为未知的变化可能会导致更多示例被您预期的实时模型评分。
九、警报模式(仅限实时模型)
背景
您创建了一些实时警报(电子邮件、移动推送通知等),以在模型以意想不到的方式表现时提醒您,例如奇怪的特征值、缺失的特征、分数太高/太低,等等。
说明
很容易导致警报过于嘈杂(经常发出警报,人们不再认真对待它们)或根本不敏感(警报从不发出,即使它们应该发出)。
您应该尝试使警报保持相关且易于操作(包括足够的信息,以便人们快速判断警报是否表明存在实际问题)。
建议
注意奇怪的时间段,如清晨、周末等。由于在这些时间段,模型评分的示例可能会少得多,警报可能会因为样本量太小而发出。
始终包括用于警报的时间范围和特定数据点,以便人们评估它是否是误报: 坏:“模型 Y 中的特征 X 太高了”。好:“过去 15 分钟模型 Y 中的特征 X 的平均值太高(预期在 0.4 和 0.5 之间,但实际上是 100.0)”
如果可能,请包含指向完整仪表板的链接或可以查看更完整数据并决定是否应该进一步调查的地方。
如果可能,手头有一些故障排除指南,以便新的团队成员可以轻松地对警报采取行动。
结论
这些是我们在 Nubank 监控多个 ML 模型时发现的一些有用的技巧。它们用于各种业务环境(信用、欺诈、CX、运营等),我们相信它们足够通用,也适用于其他公司。
原文:https://building.nubank.com.br/ml-model-monitoring-9-tips-from-the-trenches/
相关文章:
机器学习模型监控的 9 个技巧
机器学习 (ML) 模型是非常敏感的软件;它们的成功使用需要进行仔细监控以确保它们可以正常工作。当使用所述模型的输出自动做出业务决策时尤其如此。这意味着有缺陷的模型通常会对终端客户的体验产生真正的影响。因此,监控输入数据(和输出&…...
Linux 实现鼠标侧边键实现代码与网页的前进、后退
前言 之前一直是使用windows进行开发,最近转到linux后使用VsCode编写代码。 但是不像在win环境下,使用鼠标侧边键可以实现代码的前向、后向跳转。浏览网页时也不行(使用Alt Left可以后退)。 修改键盘映射实在没有那么方便&…...
健身蓝牙耳机推荐,推荐五款适合健身的蓝牙耳机
出门运动健身,有音乐的陪伴是我们坚持运动的不懈动力,在健身当中佩戴的耳机,佩戴舒适度以及牢固程度是我们十分需要注意的,还不知道如何选择健身蓝牙耳机,可以看看下面这些运动蓝牙耳机分享。 1、南卡Runner Pro4骨传…...
Type-c诱骗取电芯片大全
随着Type-C的普及和推广,目前市面上的电子设备正在慢慢淘汰micro-USB接口,逐渐都更新成了Type-C接口,micro-USB接口从2007年上市,已经陪伴我们走过十多个年头,如今也慢慢退出舞台。 今天我们评测的产品是市面上Type-C…...
Scala模式匹配详解(第八章:基本语法、模式守卫、模式匹配类型)(尚硅谷笔记)
模式匹配第 8 章 模式匹配8.1 基本语法8.2 模式守卫8.3 模式匹配类型8.3.1 匹配常量8.3.2 匹配类型8.3.3 匹配数组8.3.4 匹配列表8.3.5 匹配元组8.3.6 匹配对象及样例类8.4 变量声明中的模式匹配8.5 for 表达式中的模式匹配8.6 偏函数中的模式匹配(了解)第 8 章 模式匹配 Scal…...
Linux:基于libevent读写管道代码
基于libevent读写管道代码: 读端: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <event2/event.h> #include…...
2022年中职网络安全逆向题目整理合集
中职网络安全逆向题目整理合集逆向分析:PE01.exe算法破解:flag0072算法破解:flag0073算法破解:CrackMe.exe远程代码执行渗透测试天津逆向re1 re2逆向分析:PE01.exe FTPServer20220509(关闭链接) FTP用户名:PE01密码…...
Tencent OS下逻辑卷(LVM)增加硬盘扩容
上一篇文章写了逻辑卷创建以及使用剩余空间为已经创建的逻辑卷扩容。 本篇是针对卷组空间已经用尽时的扩容方法。那就是增加硬盘。 首先我们为虚拟机增加硬盘/dev/sdd 使用fdisk为/dev/sdd分区,方法在上一篇文章已经描述,在此不再赘述。 新增的硬盘使用如下命令添加到卷组…...
【Java】Spring的创建和使用
Spring的创建和使用 Spring就是一个包含众多工具方法的IOC容器。既然是容器,那么就具备两个最主要的功能: 将对象存储到容器中从容器中将对象取出来 在Java语言当中对象也叫作Bean。 1. 创建Spring项目 创建一个普通maven项目添加Spring框架支持(spri…...
【HTML】HTML 表单 ④ ( textarea 文本域控件 | select 下拉列表控件 )
文章目录一、textarea 文本域控件二、select 下拉列表控件一、textarea 文本域控件 textarea 文本域 控件 是 多行文本输入框 , 标签语法格式如下 : <textarea cols"每行文字字符数" rows"文本行数">多行文本内容 </textarea>实际开发中 并不…...
MySQL 操作 JSON 数据类型
MySQL 从 v5.7.8 开始支持 JSON 数据类型。 JSON 数据类型和传统数据类型的操作还是有很大的差别,需要单独学习掌握。好在 JSON 数据类型的学习成本不算太高,只是在 SQL 语句中扩展了 JSON 函数,操作 JSON 数据类型主要是对函数的学习。 新…...
关于vue3生命周期的使用、了解以及用途(详细版)
生命周期目录前言组合式写法没有 beforeCreate / created 生命周期,并且组合式写生命周期用哪个先引哪个beforeCreatecreatedbeforeMount/onBeforeMountmounted/onMountedbeforeUpdate/onBeforeUpdateupdated/onUpdatedbeforeUnmount/onBeforeUnmountunmounted/onUn…...
2月,真的不要跳槽。
新年已经过去,马上就到金三银四跳槽季了,一些不满现状,被外界的“高薪”“好福利”吸引的人,一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必…...
Vulnhub靶场----4、DC-4
文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-4下载地址:https://download.vulnhub.com/dc/DC-4.zip kali:192.168.144.148 DC-4:192.168.144.152 二、渗透流程 端口扫描:nmap -T5 -p- -sV -sT -A 192.168.144.1…...
51单片机学习笔记_12 LCD1602 原理及其模块化代码
LCD1602 liquid crystal display 液晶显示屏,一种字符型液晶显示模块,可以显示 16*2 个字符,每个字符是 5*7 点阵。 P0 P2 会和数码管、LED 一定程度上冲突。 地。 Vcc。 调对比度的。 RS:数据指令端。1代表 DB 是数据&#x…...
科技 “新贵”ChatGPT 缘何 “昙花一现” ,仅低代码风靡至今
恍惚之间,ChatGPT红遍全网,元宇宙沉入深海…… 在科技圈,见证了太多“昙花一现”,“新贵” ChatGPT 的爆火几乎复制了元宇宙的路径,它会步元宇宙的后尘,成为下一个沉入深海的工具吗? 不可否认的…...
redis基本入门| 怎么安装redis?什么的是redis?怎么使用?
目录 一、Redis下载与安装 二、基本概念 1.什么是Redis? 2.Redis端口多少? 3.Redis是单线程还是多线程? 4.Redis为什么单线程还这么快? 三、Redis的基本操作 四、Redis的五个基本类型 1.Redis-key 2.字符串 string 3.列表 list …...
kubernetes traefik ingress 安装部署以及使用和注意点
1、简介 Traefik 是一款 open-source 边缘路由器,可让您轻松地发布服务. 它接收来自您的系统请求,并找出负责处理它们的后端服务组件。 traefik 与众不同在于它能够自动发现适合您服务的配置。 当 Traefik 检查您的基础设施时,它会发现相关信…...
电脑病毒已灭绝,是真的吗?
大家有没有这样一个疑问,觉得自己的电脑好像很久没有电脑病毒了?之前大名鼎鼎的蠕虫2000,熊猫烧香都变得不那么常见了。到底是电脑因为自身优化和杀毒软件的防护导致病毒变少了,还是本身电脑病毒变少了呢?(…...
基于RK3399+Linux QT地面测试台多参数记录仪测试平台软件设计(二)
rk3399 是由本土芯片厂商瑞芯微(Rockchip)研发的高性能、低功耗“中国芯”。在 2016 年 4 月,rk3399 首次在香港举行的电子展上亮相。芯片使用六核大 LITTLE 处理器: 包括四核的 Cortex-A53 和双核的 Cortex-A72,主频可…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
