机器学习产品化的几点思考

来源:互联网 发布:linux大作业 编辑:程序博客网 时间:2024/06/09 15:55

原文:Machine Learning in Production
作者:Szilard Pafka
译者:Teixeira10

【译者注】在本文中,作者介绍了将机器学习产品化的几个方面,包括模型训练,模型评估,模型部署等,让读者学习和讨论。
以下为译文:

该文章主要讨论如何将机器学习产品化(包括系统组件、流程、挑战、陷阱等),在这方面也会有一些相关的博客文章或论文,来讲述机器学习产品化的“最佳实践”。欢迎所有人来讨论github中的问题。

最初的想法和大纲

下图总结了涉及到的组件和流程:



历史数据

会存在于数据库,csv文件,数据仓库,HDFS。

工程特性

在典型的结构化/表格式业务数据中,它可以包含连接和聚合特性(例如,特定用户在特定时间段内点击的次数)。

这个“ETL”是重处理,并不适合操作系统(例如MySQL),通常适用于“分析型”数据库(Vertica,Redshift)或Spark。

好的特性有错误机制/迭代/研究/探索/持久(如上图的整个上半部分,FE、模型训练和评估)。

分类变量:一些建模工具需要转换成数字(例如,独热编码)。

训练、调优

特征工程的结果是一个带有特征和标签的“数据矩阵”(在有监督学习的情况下)。

这些数据通常更小,而且通常不需要分布式系统。

具有最佳性能的algos通常使用的算法:梯度增强(GBM),随机森林,神经网络(和深度学习),支持向量机(SVM)。

在某些情况下(稀疏数据,模型解释)必须使用线性模型(如logistic回归)。

有很好的开源工具(R包,Python sklearn,xgboost,VW,H2O等)。

需要避免过度拟合(以及使用规则化等技术)。

同时也需要不带偏见的评价,来看下一点。

模型可以通过超参数空间的搜索(网格或随机搜索,贝叶斯优化方法等)来调整。

通过集成多个模型(平均、堆栈等),性能可以得到进一步提高,但缺点是,部署这种模型的复杂性增加了。

模型评估

这是非常重要的,需要花很多时间在这里。

用测试集进行无偏估计,交叉验证(一些会“提前停止”地algos需要验证集)。

如果你进行了超参数优化,那还需要一个单独的验证集(或交叉验证)。

现实世界是非平稳的,需要使用一个时间缺口测试集。

诊断:概率值分布、ROC曲线等。

还可以使用相关的业务指标进行评估(模型对业务术语的影响)。

模型部署

实时数据值

这通常被认为是一项“工程”任务(这是区分数据科学家与软件工程师的界限)。

要使用相同的工具来部署模型,不要使用其他的“语言”或工具(SQL、PMML、Java、c++,以及类似Json的自定义格式) (除非模型是通过相同的工具进行的训练)(在边界情况下,小bug的风险很高)。

不同的服务器,需要更多的CPU / RAM(因为得到概率值需要服务器有低延迟,高可用性和可扩展性)。

实时数据来自不同的系统,通常需要复制FE(重复代码是邪恶的,但这是不可避免的);已经进行数据转换或清理的历史数据,可能也需要在这里复制。

数据值可以通过批处理的方式(这样更简单,可以从数据库中读取值,获取值,以及写结果返回到数据库)或实时的方式(现在的方法主要是通过http REST API来分离关注点)。

如果数据科学团队也能支持这部分工作,那就更好了(也就是如上图中的下半部分,这可能还需要一些工程支持)。

采取行动

一个公司的ML系统的主要目标是提供一些业务价值(比如客户,金钱等)。

这些工作可能必须由工程团队所完成。

能够逐渐地进行测试(A / B测试模型)。

评估和监控

在产品和训练测试中(非平稳性、变化条件、错误假设、bug等)中,模型可能会有不同的表现。

在部署后进行评估模型是很关键的。

基于ML度量的评估(值分布等)和业务指标。

部署后的评估和持续监控(指示板和警报)(用于检测外部更改和中断,同样,模型也会在这段时间内慢慢降级)。

这也应该由数据科学团队拥有(与离线开发的模型相比)。

Misc

ML系统创建紧密的耦合,从工程的角度来看,它被认为是邪恶的。

本文中发现的一些问题虽然目前还没有解决方案,但要尽可能多地考虑和减轻问题。

关于框架的一些想法在这里进行描述。

实例耦合:FE数据模式,对数值进行FE复制,同时应用在大量的工程和业务领域。

ML需要“销售”到很多业务端(每个ML产品的应用领域中的管理和业务单元)。

将业务涉及到ML的内部,并在持续的基础上显示商业契约(报告、指示板、警报等),这可以帮助提高信任和支持度。

学习和提高

对所有的组件进行迭代,从实践中学习使用它的经验(例如,在业务中加入创意,将新特性添加到FE中,如果性能下降,则重新进行模型培训)。

为了实现快速的迭代,上面的大部分都应该使用工具来实现自动化 (例如Rstudio+R-markdown/Jupyter notebooks, git, docker等等)。