模型训练完才是业务的开始?说说模型监控 | CSDN博文精选
扫码参与CSDN“原力计划”
作者 | A字头
来源 | 数据札记倌(ID:Data_Groom)
“模型训练结束后才是业务真正的开始”
简述
每次模型训练完成后,并不意味着项目的结束,在训练模型后,我们还需要将其稳定上线,然后部署一套相应的监控体系,这时候模型才开始稳定运行在业务场景中。在我们以往接触的大多文章都只是告诉你如何构建模型,但是在模型上线后的监控同样重要,我们需要通过对模型的监控来掌握模型运作情况,了解业务变化趋势。
在我看来对模型的监控主要有两方面:一方面是对模型本身的性能进行监控;另外一方面是监控业务信息,更了解业务发展情况。
对模型本身性能的监控主要涉及以下几个关键指标:
0、Confusion Matrix
1、AUC(binary)
2、KS(binary)
3、PSI
4、Lift & Gain
5、MSE(Regression)
对业务信息的监控主要会设计以下指标:
1、评分监控(评分模型)
2、响应率监控
3、模型变量监控(缺失值,平均值,最大值,最小值等,变量分布)
4、模型调用次数
对模型本身性能的监控
0、Confusion Matrix
混淆矩阵有几个古老的概念:TP(实际为正预测为正),FP(实际为负但预测为正),TN(实际为负预测为负),FN(实际为正但预测为负)
通过混淆矩阵我们可以给出各指标的值:
查全率(召回率,recall):样本中的正例有多少被预测准确了,衡量的是查全率,预测对的正例数占真正的正例数的比率:
查全率=TP / (TP+FN)
Precision:针对预测结果而言,预测为正的样本有多少是真正的正样本,衡量的是查准率,预测正确的正例数占预测为正例总量的比率:
Precision=TP / (TP+FP)
Accuracy:反应分类器统对整个样本的判定能力,能将正的判定为正,负的判定为负的能力,计算公式:
Accuracy=(TP+TN) / (TP+FP+TN+FN)
但是往往准确率并不能直观地反应模型的预测能力:
例如一个集合里有100个样本,99个正样本和1个负样本,全预测为正样本都有99%的准确度,但是没有任何预测能力,后续的KS和AUC可以弥补这些不足。
F1度量
先看公式:
其中β表示查全率与查准率的权重
1. β=1,查全率的权重=查准率的权重,就是F1
2. β>1,查全率的权重>查准率的权重
3. β<1,查全率的权重<查准率的权重
那么问题又来了,如果说我们有多个二分类混淆矩阵,应该怎么评价F1指标呢?
很简单嘛,直接计算平均值就可以:可以计算出查全率和查准率的平均值,再计算F1;或者先计算TP,FP,FN,TN的平均值,再计算F1。
参考来源:
https://www.zhihu.com/question/30643044/answer/48955833
1. KS&AUC
模型在上线应用后,也需要及时地进行验证,在每一次样本走完表现期后,需要及时地选取样本进行验证。关于这两个指标应该不用做过多介绍,和我们在建模时使用的逻辑是一样的。
计算公式:
关于KS&AUC推荐一个资料,里面介绍相当详细:
http://rosen.xyz/2018/02/01/AUC%E5%92%8CKS%E6%8C%87%E6%A0%87/
KS&AUC 反映了模型开发期间与当前客户的客群变化,当KS和AUC相比建模时的数据没有较大下降时都可以不重新训练模型:
# target rate & KS监控
logging.info('生成Targer rate & KS监控')
monitor_fst.score_target_monitor(df_target_fst, lag_days=8, interval_days=7, date=run_date)
monitor_fst.score_target_plot(show_days=10, lag_days=8, interval_days=7, keep_base=False, date=run_date)
monitor_fst.ks_monitor_plot(show_days=10)
logging.info('Targer rate & KS监控生成结束')
2. 模型分数稳定性分析-PSI
目的在于分析衡量两段时间(模型开发期间与目前)客户的客层变化,作为评分卡有效性的早期预警,并了解通过率的变动是否来自于客群的变动。
PSI的计算公式:
PSI = sum((实际占比-预期占比)* ln(实际占比/预期占比))
举例:
比如训练一个logistic回归模型,预测时候会有个概率输出p。
测试集上的输出设定为p1,将它从小到大排序后10等分,如0-0.1,0.1-0.2,......。
现在用这个模型去对新的样本进行预测,预测结果叫p2,按p1的区间也划分为10等分。
实际占比就是p2上在各区间的用户占比,预期占比就是p1上各区间的用户占比。
如果p1和p2上各区间的用户相近,占比变化不会很大,预测的结果有额不会有较大差距,那么模型相对比较稳定。
通过观测这些PSI的大小和走势,从而实现对评分卡稳定性的监测。通常PSI会以日、周和月为维度进行计算,同时也会对评分卡模型中各个特征变量分别做PSI监测。
判断标准:
若PSI<0.1,表示客户群体从模型开发到实施的稳定性较高,模型不需要更新;
若0.1<= PSI <=0.25,表示客户群体发生了一定的变化,模型需要关注,随时需要更新;
若PSI >0.25, 表示客户群体发生较大变化,模型需要更新。
模型分数的变化可能由特征变化引起,也可能是模型本身不稳定引起,若是高分段总数量没变,而PSI值变动较大,认为需要重训模型。若是PSI值没变,高分段总数量变多,认为整体用户变好。
3.Lift 和Gain
Lift图衡量的是,与不利用模型相比,模型的预测能力“变好”了多少,lift(提升指数)越大,模型的运行效果越好。
Gain图是描述整体精准度的指标。
计算公式如下:
作图步骤:
1. 根据学习器的预测结果(注意,是正样本的概率值,非0/1变量)对样本进行排序(从大到小)-----这就是截断点依次选取的顺序
2. 按顺序选取截断点,并计算Lift和Gain
---也可以只选取n个截断点,分别在1/n,2/n,3/n等位置
例图(来自网络):
详细解释:
https://cosx.org/2009/02/measure-classification-model-performance-lift-gain/
4.MSE
MSE (Mean Squared Error)叫做均方误差。看公式
这里的y是测试集上的。
用 真实值-预测值 然后平方之后求和平均。
猛着看一下这个公式是不是觉得眼熟,这不就是线性回归的损失函数嘛!!!对,在线性回归的时候我们的目的就是让这个损失函数最小。那么模型做出来了,我们把损失函数丢到测试集上去看看损失值不就好了嘛。简单直观暴力!
有时计算均方根误差(RMSE)也可以。
不用解释了吧
线性回归算法评价指标三连,可以灵活搭配:MSE、RMSE、R2_score
上面提到的这么多指标不需要每一个都应用起来,可以根据需要选择几个核心指标应用就可以。
业务信息相关监控
1. 评分分布
通过对模型评分分布的监控,我们可以知道每一个评分周期模型评分的变化情况,可以反映每一个评分周期里不同分数段的占比情况,对应的可能是业务的通过率或者拒绝率等;
# 评分监控
import logging
monitor_fst = ModelMonitor(score_var='score', target='target', cut_points=fst_cut_points,
output_path=os.path.join(output_path, 'monitor_file', 'fst'))
logging.info('生成打分监控')
monitor_fst.score_monitor(df_score_fst, valid=np.array([0.1] * 10), date=run_date)
monitor_fst.score_monitor_plot(show_days=10, keep_base=False)
logging.info('打分监控结果生成结束')
2. 响应率变化情况
通过分析每一个表现期的响应率,可以清楚看到响应率的变化趋势,同时可以看出真实响应率与预测的响应率之间的差距。
不过这个有一定的滞后性,通常需要等到样本整个表现期走完,才能比较真实的target rate与预测值之间的差距。
3. 变量监控
除了了解结果,我们也需要掌握每一个变量的变化情况,通过对变量分布的监控,能很快的知道用户群体发生了哪些迁移,这些迁移对模型有哪些影响,这种变化是否是异常情况?还是有变化的趋势?如果变量存在这种变化,我们是否需要refit模型?我们都可以从变量监控里获取这些信息。当然,对于模型refit的问题,不能仅仅依靠这一点来判断,需要综合其他指标来衡量,尤其是对模型本身性能的监控上。
例如下图中对模型中一个变量分布的监控:
# 变量监控logging.info('生成变量监控')monitor_fst.var_monitor(df_orig_fst, file_name='var_distribution_monitor_daily_fst.csv',var_list=var_list_fst, cat_value_dict=cat_value_dict, date=run_date)monitor_fst.var_monitor_plot('var_distribution_monitor_daily_fst.csv', show_days=10, var_list=var_list_fst, cat_value_dict=cat_value_dict, keep_base=False, num=6) #输入你所需要的变量var_list_fstlogging.info('变量监控结果生成结束')
4.模型调用次数
对模型调用次数的监控在某种程度上不属于模型监控的范围,但是也有其存在的理由;尤其在特定的业务场景中,比如我们每天有固定数量的用户经过模型评分来判断是否被拒,如果某一天用户数量激增或者骤减,也能从模型评分过程中及时发现问题。
由于这个监控涉及了一些业务知识,就不放完整代码啦
点击阅读原文,查看作者更多文章。
技术的道路一个人走着极为艰难?
一身的本领得不施展?
优质的文章得不到曝光?
别担心,
即刻起,CSDN 将为你带来创新创造创变展现的大舞台,
扫描下方二维码,欢迎加入 CSDN 「原力计划」!
推荐阅读
我收集了12款自动生成器,无聊人士自娱自乐专用
如何用Neo4j和Scikit-Learn做机器学习任务?| 附超详细分步教程
谷歌母公司创始人双双引退,劈柴哥上位!
对话阿里云叔同:释放云价值,让容器成为“普适”技术
激辩:机器究竟能否理解常识?
Instagram个性化推荐工程中三个关键技术是什么?
从YARN迁移到k8s,滴滴机器学习平台二次开发是这样做的
丁磊向左,刘强东向右
华裔候选人Andrew Yang加密政策公布,如果当选美国总统这些法规将会实施
你点的每个“在看”,我都认真当成了AI
相关文章:

后端码农谈前端(CSS篇)第一课:CSS概述
一、从扮演浏览器开始 扮演浏览器是Head First图书中很有意义的一个环节。可作者忘记了告诉我们扮演浏览器的台本。我们从这里开始。 上图是webkit内核渲染html和css的流程图。从该图我们可以知道以下几个关键信息: HTML的解析过程和CSS的解析过程是独立完成的。HTM…
远场语音识别错误率降低30%,百度提基于复数CNN网络的新技术
【12月公开课预告】,入群直接获取报名地址12月11日晚8点直播主题:人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播:利用容器技术打造AI公司技术中台12月17日晚8点直播主题:可重构计算:能效比、通用性…

深度神经网络中的局部响应归一化LRN简介及实现
Alex、Hinton等人在2012年的NIPS论文《ImageNet Classification with Deep Convolutional Neural Networks》中将LRN应用于深度神经网络中(AlexNet)。论文见:http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf ,截图如下: 公式解释&…

iOS 被拒解析
原因: Your app uses the "prefs:root" non-public URL scheme, which is a private entity. The use of non-public APIs is not permitted on the App Store because it can lead to a poor user experience should these APIs change.Continuing to us…

MSSQL数据库统计所有表的记录数
今天需要筛选出来库中行数不为零的表,于是动手写下了如下存储过程。 CREATE PROCEDURE TableCount AS BEGIN SET NOCOUNT ON DECLARE t1 AS TABLE(id INT IDENTITY,NAME NVARCHAR(50),RowsCount INT) DECLARE indexid AS INT DECLARE maxid AS INT DECLARE count A…

经典网络AlexNet介绍
AlexNet经典网络由Alex Krizhevsky、Hinton等人在2012年提出,发表在NIPS,论文名为《ImageNet Classification with Deep Convolutional Neural Networks》,论文见:http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf …
微软张若非:搜索引擎和广告系统,那些你所不知的AI落地技术
【12月公开课预告】,入群直接获取报名地址12月11日晚8点直播主题:人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播:利用容器技术打造AI公司技术中台12月17日晚8点直播主题:可重构计算:能效比、通用性…

iOS 之 IQKeyboardManager 解决使用UITableView 界面上移问题
- (void)viewWillAppear:(BOOL)animated {[IQKeyboardManager sharedManager].enable NO;}- (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];[IQKeyboardManager sharedManager].enable YES; }

excel增加上一列的数值(日期)
TEXT(D2-1,"m月d日") 有年的话就是 TEXT(D2-1,"yyyy年m月d日") D2就是参照日期转载于:https://www.cnblogs.com/hont/p/4352877.html

iOS 一些基础的方法
iOS button字体居中等的设置 self.replyBtn.contentHorizontalAlignment UIControlContentHorizontalAlignmentCenter; UIControlContentHorizontalAlignmentCenter 0, UIControlContentHorizontalAlignmentLeft 1, UIControlContentHorizontalAlignmentRight 2…

经典网络VGGNet介绍
经典网络VGGNet(其中VGG为Visual Geometry Group)由Karen Simonyan等于2014年提出,论文名为《Very Deep Convolutional Networks for Large-Scale Image Recognition》,论文见:https://arxiv.org/pdf/1409.1556.pdf,网络结构如下图…
70行Go代码打败C
【12月公开课预告】,入群直接获取报名地址12月11日晚8点直播主题:人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播:利用容器技术打造AI公司技术中台12月17日晚8点直播主题:可重构计算:能效比、通用性…
Android开源框架ImageLoader的完美例子
要使用ImageLoader就要到这里下载jar包: https://github.com/nostra13/Android-Universal-Image-Loader 然后导入项目中去就行了 项目文档结构图: 从界面说起,界面本身是没什么好说的,就是如何在xml当中进行定义罢了 有以下这么多…
“掘金”金融AI落地,英特尔趟出一套通关攻略
有人说,金融业是最大的AI应用场景,但不管怎样,不可否认的事实是金融业已经从数字化走向AI化。某种程度上,AI与金融业有着天然的契合性:其一,金融业本身就是以数据为基本元素的行业,它为AI的模型…

深度神经网络中的Inception模块介绍
深度神经网络(Deep Neural Networks, DNN)或深度卷积网络中的Inception模块是由Google的Christian Szegedy等人提出,包括Inception-v1、Inception-v2、Inception-v3、Inception-v4及Inception-ResNet系列。每个版本均是对其前一个版本的迭代改进。另外,依…

iOS隐藏导航栏的方法
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:animated]; }

NEW关键字的三种用法
声明:本文最初是本人从他出转载到51CTO上的一篇文章,但现在记不清最初从出处了,原文作者看到还请原来,现在发表在这里只为学习,本人在51CTO的该文章的地址为:http://kestrelsaga.blog.51cto.com/3015222/75…
论文解读 | 微信看一看实时Look-alike推荐算法
作者丨gongyouliu编辑丨lily来源 | 授权转载自大数据与人工智能(ID:ai-big-data)微信看一看的精选文章推荐(见下面图1)大家应该都用过,微信团队在今年发表了一篇文章来专门介绍精选推荐的算法实现细节(Real-time Attention based Look-alike Model,简称R…

经典网络GoogLeNet介绍
经典网络GoogLeNet由Christian Szegedy等于2014年提出,论文名为《Going deeper with convolutions》,论文见:https://arxiv.org/pdf/1409.4842v1.pdf GoogLeNet网络用到了Inception-v1模块,关于Inception模块的介绍可以参考&…

iOS webview 点击按钮返回上一页面或者返回首页
- (void)floatBtn:(UIButton *)sender { NSLog("点击"); if ([self.webView canGoBack]) { [self.webView goBack]; } else{ [self.view resignFirstResponder]; [self.navigationController popViewControllerAnimate…

centos6.6 Kickstart无人值守安装(一):原理篇
为什么80%的码农都做不了架构师?>>> #为什么要自动化无人值守安装? 偷懒……nb……zb……geekno no no 瞬间完成大规模机器部署,提高生产力,节省时间精力,为公司谋取更多利益,实现社会和谐!#怎…
拿来就能用!如何用 AI 算法提高安全运维效率?
作者 | 黄龙责编 | 伍杏玲来源 | CSDN(ID:CSDNnews) 在整个安全工作中,安全运维是不可或缺的一环,其目的是保证各项安全工作持续有效地运作。除了对外的沟通和业务对接相关工作,大部分安全运维的日常工作相…

深度神经网络中Inception-ResNet模块介绍
之前在https://blog.csdn.net/fengbingchun/article/details/113482036 介绍了Inception,在https://blog.csdn.net/fengbingchun/article/details/114167581 介绍了ResNet,这里介绍下深度神经网络中的Inception-ResNet模块。 介绍Inception-ResNet的论文…

iOS 让UIView的左上角和右上角为圆角
-(UIView *)platFormBGV{ if (!_platFormBGV) { _platFormBGV [[UIView alloc] init]; _platFormBGV.backgroundColor [UIColor whiteColor]; _platFormBGV.frame CGRectMake(0, self.view.frame.size.height, APP_WIDTH, 220); // 左上和右上为圆角 UIBezierPath *cornerRa…

HttpUnit学习笔记
HttpUnit 能模拟浏览器的动作,如提交表单、JavaScript执行、基本HTTP认证、cookies建立以及自己主动页面重定向,通过编写代码能够处理取回来的文本、XML DOM或表单、表、链接。当与Junit等框架结合时,就能很easy地进行一个站点的功能測试了。…

C++11中头文件type_traits介绍
C11中的头文件type_traits定义了一系列模板类,在编译期获得某一参数、某一变量、某一个类等等类型信息,主要做静态检查。 此头文件包含三部分: (1).Helper类:帮助创建编译时常量的标准模板类。介绍见以下测试代码: …
反季大清仓,最低仅需34.9元
不知不觉已经12月份了还有一个月就要过年啦很多地方已经进入了寒冬的季节有的地方已经开启了下雪模式纷纷开始买冬天的商品棉衣、羽绒服、取暖器......但是.......今天我是来搞反季清仓的快来看看今天的反季清仓有啥商品~●反季清仓商品—程序员专属定制T ●专属定制T_shirt&am…

iOS 预览word pdf 文件
此类用于改变QLPreviewController 导航栏title #import <QuickLook/QuickLook.h> NS_ASSUME_NONNULL_BEGIN interface QLPreviewController (title) property (nonatomic, strong) NSString *qlpTitle; end NS_ASSUME_NONNULL_END #import "QLPreviewControllertitl…

Java过滤器模式
//创建一个类,在该类上应用标准 public class Person { private String name; private String gender; private String maritalStatus; public Person(String name, String gender, String maritalStatus) { this.name name; …

C++中指向类成员指针的用法
C中,指向类的成员指针包含两种: (1).指向类的成员函数的指针: 类型 (类名::* 函数成员指针名)(参数表); 函数成员指针名 &类名::函数成员名; 也可将以上两条语句调整为一条语句: 类型 (类名::* 函数成员指针名)(参数表) &…