写点什么

关于人工智能算法建模稳定性那些事儿

  • 2019-09-06
  • 本文字数:2355 字

    阅读完需:约 8 分钟

关于人工智能算法建模稳定性那些事儿

“建模”是算法、数据挖掘岗同学日常工作的一个重要部分。而建模流程中,非常重要同时又容易被大家忽视的一个环节就是稳定性问题。


市面上关于建模稳定性的文章不多,笔者决定与大家分享一下自己的经验。



本文是自己的一些实践经验分享,尽量做到让读者看过之后就可以动手实践。如果你之前从未进行过建模稳定性方面的关注,那么看过本篇分享后,取其中一二进行关注,相信能够达到事先规避一些潜在的问题的效果。关于建模稳定性方面本文未能涉及的地方,也欢迎大家踊跃在评论区补充和交流!


建模过程中的稳定性,一般包括特征稳定性和模型稳定性,下面依次介绍给大家介绍。

特征稳定性

所谓特征稳定性,就是关注该特征的取值随着时间的推移会不会发生大的波动。


对特征稳定性的关注,一定一定要在建模之前完成,从一开始就避免将那些本身不太稳定的特征选入模型。遗憾的是,很多做模型的同学并没有留意这一点,而是喜欢在特征 ready 后立刻开始建模,直到模型临近上线,才意识到应该去看看有没有不太稳定的特征,一旦发现有特征稳定性不满足要求,则需要对其进行剔除后重新建模,导致了不必要的重复性劳动。


通常采用 PSI(PopulationStability Index,群体稳定性指数)指标评估特征稳定性。计算公式如下:



PSI 是对两个日期的特征数据进行计算,可以任选其一作为 base 集,另一则是 test 集(也有其他叫法为 expected 集和 actual 集)。


下面介绍特征的 PSI 是如何计算出来的,有了这个,就可以读懂上面的公式了:



当没有其他工具可以借力的时候,根据上述流程便可轻松计算得到特征 PSI。但是在蚂蚁金服,因为算法建模 PAI 平台的存在,直接借助所提供的 PSI 计算组件即可方便、批量地计算出特征 PSI。


通常我会按照下图所示的方式来做:



在上面这个例子中,我对上百个特征计算 PSI,流程如下:


  • 取 20171130 分区的数据作为 base 集,对所有特征通过分箱组件进行特征值等频分段(上述步骤 1),分箱之前进行随机采样的目的是减少数据量以加快分箱进程。

  • 计算 20171130 分区与过往六个月分区的特征 PSI,这就是 PSI 组件做的事情,也就是前文所述步骤 2~4。


通过这个流程,轻松计算得到了上百个特征跨度 1 个月~跨度 6 个月的 PSI。通常,如果一个特征跨度 6 个月的 PSI 取值小于 0.1,那么这个特征被认为是稳定的(当然,也可以根据具体情况适当放宽 0.1 的标准)。


注意:并非所有 PSI 值很高的特征都不能用于建模,如果一个特征区分度很好但 PSI 值不满足预期(比如跨度 6 个月的 PSI 大于 0.1),但同时,该特征的取值波动性从业务的角度可以解释得通,那么这样的特征用于建模也是可以的。

模型稳定性

相比特征稳定性,模型稳定性涉及的东西比较多,需要根据模型的具体应用方式选择性进行关注。通常,模型 PSI 是必须关注的一个指标。

1. 模型 PSI

有了前文对特征 PSI 的介绍,理解模型 PSI 就非常简单了。


二分类模型的输出一般都会有一个取值为 0~1 之间的概率值(记作:prediction_prob),模型 PSI 监控的就是这个值的稳定性。


将模型产出的 prediction_prob 理解为一个特征,就可以像计算特征 PSI 一样计算得到模型 PSI 了,不同的地方在于,特征 PSI 一般是对很多特征一起做计算(假如准备了 200 个特征进行建模,那就是对 200 个特征计算 PSI),而模型 PSI 通常只是对 prediction_prob 这一个字段做计算。计算方式同前文所述完全一样,PAI 组件的使用也没有任何不同,不再赘述。

2. 模型稳定性的其他实践

2.1 消除波动性

对于二分类模型,在实际业务中通常会直接拿着 prediction_prob 去用。例如,对于某个风险识别场景,根据 prediction_prob 对用户进行准入或拦截(假如设定阈值为 0.6,则 prediction_prob 小于 0.6 的用户被拦截,不小于 0.6 的用户被准入)。


但是会存在一些应用场景对稳定性要求更高。为了消除 double 型可能带来的波动性,可以将小数映射为整数再使用,我们将这个过程称为 Rank。


具体要将 0~1 的小数值映射到 1~10 还是 1~100 亦或是 1~1000 的整数区间,完全取决于应用场景对这个数值的精细化程度。这样做映射以消除波动性是有道理的,它相当于把一定范围内的波动屏蔽了。例如,某信用风险模型在 10 月份对用户小 C 的打分为 0.61,在 11 月份的打分为 0.69(假如打分的差异仅仅因为该用户在双 11 期间疯狂买买买所致,而事实上短暂性的买买买并不应该对用户的信用风险评估造成影响),如果映射为 1~10 的整数区间后,连续两个月份的打分都是 7([0.6, 0.69]整个区间均被映射为 7),从而达到屏蔽波动性的目的。


将 0~1 小数映射到整数区间的做法非常简单:首先对原始小数列求分位数(如果要映射为 1~10 的得分区间就求十个分位点,如果要映射为 1~100 的得分区间就求一百个分位点),然后根据各分位点处的取值将原始值分为确定数量的区间(如果要映射为 1~10 的得分区间就是 10 个区间,如果要映射为 1~100 的得分区间就是 100 个区间),每个区间映射为一个整数值,映射完毕。

2.2 Rank 迁移

当把 prediction_prob Rank 到整数区间后,就有必要对 Rank 后的结果实施必要的监控了。有两个事情值得去做,其一是对分位点进行按月迁移监控(看分位点有没有随着时间的推移产生波动),其二是对 Rank 后的整数进行月份间波动监控(看看每连续两个月之间,全量用户得分的波动性)。


计算上文所述指标的目的是为了实施每日监控,一旦出现不符合预期的情况就立刻通知到人。在蚂蚁金服内部,可以借助相关平台实施所需的监控。当然,如果没有这样的平台,也可以通过其他的方式来做,比如:每日定时执行 SQL 语句来实施监控分析,并将执行结果做成报表以方便查看,等等。


以上内容任何疏漏之处,恳请不吝指正。欢迎大家补充自己对建模稳定性的实践之道!


本文转载自公众号蚂蚁金服科技(ID:Ant-Techfin)。


原文链接:


https://mp.weixin.qq.com/s/klOGk_3X7QT78w9YPQQzKA


2019-09-06 16:172293
用户头像

发布了 150 篇内容, 共 29.7 次阅读, 收获喜欢 32 次。

关注

评论

发布
暂无评论
发现更多内容

电商行业:全链路监测广告投放效果,用数据驱动业务增长

HMS Core

分析 电商营销

Kubernetes薅多云羊毛怎么部署

CTO技术共享

租金、物业费的催收困境,如何解决?

IT资讯搬运工

[JS真好玩] 我帮掘金找到了一个小Bug,可利用该Bug增加专栏粉丝数

HullQin

CSS JavaScript html 前端 8月月更

呐,HTTP接口安全的八种对策送给你了

知识浅谈

HTTP API 8月月更

架构实战营模块五作业

zhihai.tu

开源一夏 | 使用layui框架实战之栅格系统和菜单评分组件运用心得

恒山其若陋兮

开源 8月月更

云原生(二十四) | Kubernetes篇之Kubernetes 配置

Lansonli

云原生 k8s 8月月更

面试突击77:Spring 依赖注入有几种?各有什么优缺点?

王磊

Java 常见面试题

详解CAN总线:高速CAN总线和低速CAN总线的特性

不脱发的程序猿

汽车电子 ISO 11898 高速CAN总线 低速CAN总线 CAN总线

详解AUTOSAR:什么是AUTOSAR?(理论篇—1)

不脱发的程序猿

汽车电子 嵌入式开发 AUTOSAR

加密世界的福音,Galaxy Project上领取专属Zebec OAT

石头财经

DDD实战(12-终篇):DDD下微服务的“分分合合”及一个倡议

深清秋

DDD 软件架构 8月月更

Go-Excelize API源码阅读(十九)——SetHeaderFooter

Regan Yue

Go 开源 源码解析 8月日更 8月月更

算法之“杨辉三角”题解

掘金安东尼

算法 前端 8月月更

GaussDB(DWS)如何实现实时,批量和交付式查询一站式开发

乌龟哥哥

8月月更

短视频软件开发:推荐算法没有想象的那么复杂

开源直播系统源码

直播系统 直播系统源码 短视频直播

【算法实践】| 一步步手把手带你实现寻找最小公倍数

迷彩

算法 算法实践 8月月更 最小公倍数

头脑风暴:回文子串

HelloWorld杰少

算法 LeetCode 数据结构, 8月月更

Kubernetes MetalLB 作为 Load Balancer上

CTO技术共享

Kubernetes MetalLB 作为 Load Balancer下

CTO技术共享

关于人工智能算法建模稳定性那些事儿_文化 & 方法_Geek_cb7643_InfoQ精选文章