扫码参与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和KS指标/
KS&AUC 反映了模型开发期间与当前客户的客群变化,当KS和AUC相比建模时的数据没有较大下降时都可以不重新训练模型:
代码语言:javascript复制# 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. 评分分布
通过对模型评分分布的监控,我们可以知道每一个评分周期模型评分的变化情况,可以反映每一个评分周期里不同分数段的占比情况,对应的可能是业务的通过率或者拒绝率等;
代码语言:javascript复制# 评分监控
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的问题,不能仅仅依靠这一点来判断,需要综合其他指标来衡量,尤其是对模型本身性能的监控上。
例如下图中对模型中一个变量分布的监控:
代码语言:javascript复制# 变量监控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 「原力计划」!