模型监控框架调研(中)

120 阅读7分钟

引言

  • 背景:本文为个人调研现有主流模型监控框架的总结,其中对一些不满足工作需要的模型框架并未深入研究,总结仅供参考。
  • 参考连接:监控框架
  • 关于模型监控框架的参考文章貌似都是上面参考连接中那个作者写的,内容大致都是相关,有所偏重,可酌情搜索查看,本文调研的中心点与模型监控调研部分内容重合,可搭配使用。
  • 内容较多且是个人总结手稿,酌情参考,有问题可一起探讨。
  • 本文为 Deepchecks 框架详情总结。

框架调研方向介绍:

  • 是否开源,因为业务需要只能内网使用
  • 获取数据的方式是什么样的,因为业务真实数据不能脱离指定环境
  • 对数据的监控有哪些方面?使用的什么原理;
  • 对模型的监控有哪些指标?哪些指标可以覆盖满足
  • 框架有无可采用的特色功能,整体流程是什么样的。
  • 框架扩展性如何,告警方式有哪些等等相关问题

监控框架 : Deepchecks(本地部署未测试,是在 Docker 中运行的,支持 Linux,macOS,Win 三平台)

  • 1.官方文档:官方文档

  • 2.本地部署参考文档:参考文档

  • 3.关于 CI/CD:CI/CD

  • 4.注:数据方面监控功能较丰富;模型支持类型较少,默认性能指标较少;可视化功能相对一般;支持本地部署(未测试);

  • 5.注:模块化较差无法打包定制监控功能;功能细分程度较差(与 Whylabs 特有的功能相比)

1 整体监控流程:

  • 1.准备参考数据并生成 Dataset对象(实例使用的 pandas 的 DF),然后需要单独使用合适的数据格式注明特征名称,数据类型,特征类型。
  • 2.使用框架开源包创建数据结构文件(.yaml文件),创建模型版本方便不同版本模型进行对比。
  • 3.准备生产数据(和参考数据格式处理略微不同,需要添加比如索引和日期等特征列)
  • 4.提供模型预测,目前仅支持分类(二分类和多分类)和回归任务,分类任务需要提供每个类别的预测概率而不是分类结果(可选)
  • 5.注释1:通过参考数据和生产数据的比较得到各种数据层面的指标偏差;模型是通过自定义模型类型,然后通过版本控制来比较模型层面的差异
  • 6.注释 2:通过计算特征重要性来优先检查重要特征并权衡各种特征的漂移情况;获取重要性的方式可以自己自定义也可以使用 sklearn 中的[permutation_importance]函数,因为需要排序所以如果觉得计算时间太长可以跳过该步骤。
  • 7.注释 3:特征漂移的检测值返回使用聚合方法,也就是说多个特征的漂移检测值只返回一个聚合值,聚合方法默认使用 L3(也可以使用最值,均值,加权值,L5 等)

2 监控目标

  • 2.1 监控目标 : 数据层面监控:

    • 1.检测特征数据中的None 值,包括 None,"null", "Nan"等各种变体
      • 1.显示为None的数据实例并统计None 值占比;将占比设计成条形图(None 值占总数的比例);根据占比设计健康状况
    • 2.检查字符串不匹配:比如"cat9",不匹配的情况如"Cat-9","$$Cat9","caT9"等
      • 1.同 1.a
    • 3.检查字符串长度:设定正常字符串长度,过长过短的字符串都属于异常
      • 1.同 1.a
    • 4.检查特征的相关性:
      • 1.数值-数值使用皮尔逊相关系数;附加特征之间相关性的热力图,并设定相关性的阈值,以及超过该阈值的特征数量的阈值(比如相关性超过 0.8 的特征对不能超过 3 个),根据该数量设定健康情况。
      • 2.数值-类别使用Correlation ratio(相关比);
      • 3.类别-类别使用Symmetric Theil's U(对称Theil系数)(貌似这个不是用来评价类别特征之间的相关性的,存疑)
      • 4.特征与目标值:使用 PPS 得分(predictive power score 表示一个特征单独预测目标特征的能力,对于索引和日期PPS 应该接近于0,否则说明其对目标有一定的预测作用)
        • a.PPS计算可以直接调用封装好的函数
        • b.PPS 很高的特征需要考虑是否存在数据泄露问题
    • 5.检测是否是单一值:检查所有特征中只含有唯一值的列
    • 6.检测类别是否均衡:主要应用分类模型,不同类别的数据占比不一致
      • 1.比如二分类模型正负样本比例失衡;根据失衡比例定义健康状况
    • 7.检测离群样本:使用 LoOP(Local Outlier Probabilities)算法
    • 8.检测冲突标签:相同样本具有不同标签的情况,可能是由于数据标签错误或者收集数据时候缺少对应标签导致
    • 9.检测数据重复:设定重复数据占比的阈值
    • 10.检测特殊字符,比如火星文,颜文字等等符号类字符
    • 11.检测混合类型:比如"49.90" ["出租车"]等,可以通过将其定义为特殊类型,来统计占比设定健康情况
    • 12.检测标签漂移:单变量测试
  • 2.2 监控目标 :训练测试验证(监控目标 2 更偏向于训练集和测试集数据的比较,貌似不太符合实际场景,待定)

    • 1.检测字符串不匹配:与监控目标 1 中区别在于这是比较训练集和测试集两侧的数据
    • 2.检测训练测试样本混合比例:指的是训练数据集和测试数据集的交集比例
    • 3.检测训练集和测试集数据一致性:比如测试集是否有训练集未出现的新标签或者离散特征中的新类别
    • 4.检测多元漂移:指的是多个特征发生的漂移,包含的主要是数据漂移和概念漂移。
      • 1.注:检测漂移需要鉴别是否为数据的季节性周期变化。
      • 2.检测漂移的方法(单个特征):
        • a.连续值使用 [Kolmogorov-Smirnov 统计量]或[Wasserstein 度量]
        • b.对于离散或分类分布 使用 [Cramer's V 推荐]或[群体稳定性指数 (PSI)]
      • 3.检测漂移(不平衡分类):
        • a.标签漂移:指训练模型时使用的标签和实际应用中模型要面对的标签分布不一致。Deepchecks使用的对目标列进行单变量测量来检测
        • b.预测漂移:模型的预测结果在时间,空间或者不同分布下发生变化,与标签漂移不同的是,预测漂移关注的是模型的预测输出,而不是标签分布的变化
      • 4.训练域分类器

2.3 监控目标:模型性能(目前仅支持分类,回归模型)

  • 1.二分类:准确率,精确率,召回率
  • 2.多分类对每个类:准确率, 精确率(平均),召回率(平均)
  • 3.每个类中进行多分类:F1(每个类别), 精确率(每个类别),召回率(每个类别)
  • 4.回归:Negative RMSE, Negative MAE, R2
  • 5.注:以上均为框架默认指标,除此之外支持自定义或者直接调用 sklean 中的指标库