4.1 机器学习项目流程
笔者是工科出身,具有非常典型的IT人性格,相较于工作需要,会习惯性地更深入学习技术知识点,这种习惯有时会使我忽视问题本身,即以技术、工具为先,停留在“术”的层面,这往往也是很多技术人的特点,但这种特点对于企业的运作是不利的。在一个项目中,尤其是机器学习项目,机器学习工程师、建模工程师抑或数据科学家应该深度参与到机器学习项目的原始需求和问题定义中,将建模工作与业务流程集成起来。同时,也要加强沟通,锻炼口才,做报告时有“说故事”的能力,而不是单纯地拿到建模样本(很多竞赛比如Kaggle)做纯技术层面的勾勒。以上建议,希望从机器学习项目开始时就引起大家的重视,由始至终地完成一次机器学习建模工作,并在其中细心体会。
一般来说机器学习项目会经历多个阶段,如图4-1所示。
图4-1 机器学习简化流程
·数据分析。也称数据探索性分析,初步查看变量的类型和概览。一般使用统计信息、可视化方法,常见的有数据统计摘要(最大、最小、均值等)、连续变量使用直方图、离散变量使用条形图等方法。
·数据清洗。数据分析之后我们得到需要清洗和处理的变量,主要是异常值处理或文本清洗等。这一步完成对数据的初步加工,为后续节点做准备。数据分析与数据清洗的相关介绍请参考第5章。
·特征工程。包括对特征的离散化或连续化处理、编码,将数据向量化为进入模型做准备,例如LabelEncode、OneHot、WOE(Weight Of Evidence,证据权重)。但这些内容的一部分有时在数据清洗节点中就已完成了,所以书中的特征工程侧重特征的衍生、变换和选择。特征工程中的“工程”二字体现了机器学习对特征处理的重视和特征工程从项目系统级的考量,详细内容请参考第6、7、8章。
·模型训练。主要指的是模型调参、模型选择、重复进行特征工程的过程,也可以说是获得模型参数的过程。
·模型验证。它时常和模型训练交织在一起,主要指的是在新数据集(未参与模型训练)上验证模型效果的过程,也包含将模型结果进行反馈以得到本次建模过程是否达到预期目标、验收并结束。技术上的关键点是如何选取评价指标和验证策略。
从项目的角度看,这条主线将横向延伸,前端将加入项目需求分析与定义、如何定义Y这样的模型设计节点,向后延伸有模型部署、模型监控和重构与重训这样的节点。从训练、测试、预测这3个场景来看,这条主线将向纵向扩展,比如在训练时的数据清洗和特征工程使用到的处理方法和信息,要完全一致地保留并应用到测试和预测阶段。当我们实现自己的机器学习建模框架时,要重视这些更广阔的边界。
在实践中,我们也可能有选择性地关注一些点或忽视一些点,比如在对外驻场建模或比赛时,会基于上述的节点定制更为细致的流程,例如在数据分析时先执行缺失率统计,再进行异常值分析。由于时间等因素限制,我们也可能先忽视难以处理的、复杂的字符、地理和空间变量,等到有初版的模型后再考虑是否处理剩余变量。
下面再给出一个项目版的机器学习建模流程,如图4-2所示。
1)需求分析:完成问题的定义。根据需求,场景确定建模目标的同时将需求转换为技术实现,对应到机器学习领域即确定、分类(二分类、多分类)、回归、聚类、备选算法等。
2)模型设计:包括样本定义、评价指标的方案、样本范围预定义和数据集划分方案预定义。实际上未获取数据前,样本定义只能是粗略和方向性的,直到获取样本后,基于一定的分析才能最终定论。所以紧接节点的“数据提取”是逻辑上的顺序流程,真实情况下会反复执行。
图4-2 机器学习端到端流程
3)数据提取:在数据源拉取预定的样本和变量。
4)数据清洗:该部分的数据清洗方法需要留存,以便对验证和预测阶段的数据进行同样的处理。
5)特征工程:可细分为2个部分:特征处理和特征选择。这两个节点的信息同样需要留存到验证和预测阶段。
以上描述的是总体的建模流程,部分节点下文将有进一步的介绍,包括模型训练调优、模型验证、模型部署、模型监控、模型重训或重构。当实践中面临新的问题时,部分节点将有所变化,比如自定义评价指标。
如前文所述,熟练掌握这些节点的人可以瀑布式地依次执行,也可以根据实际情况反复执行。当一个团队共同负责一个机器学习项目时,团队的分工协作和敏捷开发模式将极大地推动项目进程,并有望得到优秀的模型表现。例如,数据探索、分析时,不同成员分别并行处理;数据空值填充时,不同成员负责不同的填充策略;不同成员负责深入的特征工程;不同成员实验不同的学习算法或集成策略等。团队全体成员以紧密协作的方式完成机器学习项目。
流程化的优势是容易形成规范和标准,并沉淀最佳实践,便于权衡成本效益。例如,很多的开源机器学习工具在流程化、工程应用上都做了不少工作,例如sklearn[1]中的Pipeline、H2O等机器学习平台。能够熟练应用机器学习的企业也能形成内部的构建流程。
由于建模需求多样,我们略过需求的分析和拆解,直接从样本定义开始讲述。
[1] 文中sklearn有时表示scikit-learn,有时指安装后的sklearn包。