Machine Learning Methodology


过去半年多的时间,主要的工作内容是将机器学习技术应用到实际的业务场景中。在项目开展的过程中,遇到了很多技术的非技术的问题,在思考与解决这些问题的过程中,逐渐有了一些关于机器学习项目开发的方法论层面的东西,即怎样做好一个机器学习项目,记录在这里以便时常回顾复习。


目录


机器学习项目开发流程

上图是机器学习项目的一个经典的流程,从左上角的业务分析开始,问题抽象、数据分析,到进入模型迭代,包含了确定训练数据、特征工程、调试算法、评估算法到右下角的完成,这个一个带有循环的流程图。接下来对这个图中每个步骤进行阐述。


步骤及要点

1. 业务分析

业务分析是项目的起点,这个步骤主要有两个目的:第一是搞清楚项目的真正需求是什么?第二是能不能转化为一个机器学习(或深度学习)问题?

为了确定这两个问题,你需要深入的了解和项目的甲方(或者公司发起项目的部门)进行深入的沟通,他们的需求是什么?是一个已经显式地定义好的可以使用机器学习技术求解的问题还是非显式的业务上面的需求?如果是非显式的,那么能不能将其转化为机器学习问题?

这一步需要你理解机器学习适合处理什么问题,不适合处理什么问题,需要你理解业务场景,看能否转化为机器学习问题。这一步更关注的是能不能,如果不能,这不是一个机器学习擅长的场景或者有其他方法比机器学习更适合,那么更好的做法是使用其他方法(see Rule #1, Rules of ML by Google)。


2. 问题抽象

确定了场景可以转化为机器学习问题之后,接下来就是对问题进行抽象。上一步关注的是能不能,而这一步就要求你深入的对业务场景进行分析,将业务逻辑层层剥开,把最核心的问题抽象出来。

机器学习本质上就寻找一组输入 x 和输出 y 的映射关系,那么问题抽象这一步可以看做是寻找 y 的过程。确定你要去预测什么?问题中的 y 到底是哪个量?是离散的还是连续的(对应分类和回归问题)? 有些项目中这个量比较明显,有些项目中则需要你去从业务逻辑中去深挖。在这一步你需要非常谨慎地思考,需要预测的是这个量吗?假设对这个量进行预测能够满足项目的需求吗?

这一步通常很有难度,涉及到一种从繁乱的业务中抽象问题的能力。这也是目前的自动化机器学习(AutoML)无法帮你自动化的事情,你还是为其提供一个定义好的 y。


3. 数据分析

明确了需要分类(或回归)的量之后,便可以开始对现有的数据进行分析。这个还忽略了一个数据获取的步骤,特别是对于非公司内部的机器学习项目,数据获取需要与甲方深入沟通,这个时候需要注意的是,尽量要让对方提供所有可能相关的数据。这样做的原因是现在还不确定未来需要用到哪些数据,哪些是相关的、可能有帮助的。如果等到项目后期再发现需要增加新的数据源,则整个项目就会大大受影响。

数据分析这一步的主要目的是了解数据基本情况,以及理清数据中的业务逻辑。数据的基本情况包括数据量、数据完备程度(缺失比例、数数据的有效性等)、数据的基本统计信息等,数据中每个字段的在业务上的含义是什么?相互之间的联系是什么?这些字段对于 y 值有什么关系?

需要注意的是,这一步不是由工程师一方完成,而是应该配合项目发起方具备业务知识的人员一起完成。机器学习工程师提供数据统计视角,业务人员提供业务视角,通过不断沟通使双方对数据的理解更加深入。这个过程视不同的项目类型业务复杂程度时间长短不一,但在大部分机器学习项目中这个过程时间都不宜太短。


4. 确定评估指标

这一步是的目的是确定后续模型迭代中的评估指标,这个指标应该是能够反映真正目标(需求)并且易于测量的。这个指标根据不同的业务场景有不同的选择,可能是 准确率/召回率,可能是 AUC,也可能是 MAPE 等。参考 Rule #12, Rules of ML by Google

慎重确定评估指标,评估指标确定下来后,后续的模型迭代应该以该评估指标为唯一优化标准。


5. 训练数据

在了解了数据的基本情况和理解了数据中的业务逻辑后,紧接着可以开始着手构建训练数据。这一步的主要目的是找 x,即提取出所有数据中与预测目标值 y 可能相关的数据。

这一步要求你深入理解了问题的业务逻辑,理解数据中的哪些量与 y 相关,还有哪些因素是与 y 相关,但是数据中没有的,能否通过其他数据源获取这些因素的数据?比如门店销量预测中影响销量因素的除了库存、历史销量之外,还有门店人流情况、节假日、天气等,这些数据往往需要自己通过其他数据源去获取。

这一步主要是找寻与 y 相关的所有因素及其数据。机器学习中流行一种说法:机器学习模型性能的天花板不是由算法决定的,而是由数据决定的,更确切的说,数据又可以分为质和量两个方面,质指的是单位数据包含的关于 y 的信息密度,质从理论上决定了性能的上限;量指的是数据数量,量决定了模型能够多好地学习到这些信息。因此这一步注意要基于目标值考虑相关的所有因素,尽可能获取相关数据和尽量多的数据量。

在确定好 X 和 y 之后还有非常重要的一步需要完成,即对所有的数据进行划分,主要需要划分为训练集和验证集,取决于具体的场景,有可能还需要一个独立的测试集。基本上三个集合的主要功能是:训练集用于训练模型,验证集用于模型选择、超参优化,测试集用于最终验证效果(有些场景下线上环境就已经提供了测试集)。


6. 特征工程、算法、模型、评估

特征工程、算法、模型这三步写到一起,因为三者是密不可分的,三者的关系是特征工程(数据)+ 算法 = 模型。得到模型后基于第 4 步的评价指标对模型性能进行评估。这几步共同组成了模型迭代了部分,这是一个不断迭代的过程,直至模型指标达到要求。

第 5 步训练数据提供的是与 y 相关的量的原始数据,特征工程主要目的是对这些数据进行加工,转换成为适合作为模型输入的特征。特征工程是机器学习项目中最为重要的一环。俗话说:Garbage in, garbage out。如果数据没有经过良好的特征工程,那模型几乎不可能有一个好的输出结果。

通常在项目中会花费大部分的时间在进行特征工程,包括特征分析(可视化、特征分布、特征相关性等)、特征预处理(离散化、连续化、缩放、正则化、缺失值处理、异常值处理)、特征选择(特征筛选、特征组合)等等,你需要花时间去不断尝试、不断试验,哪些在这个项目中是 work 的。这里面有一些沉淀下来的较好的实践可以参考,减少弯路,如 ML Phase II, Rules of ML by Google, Feature Engineering in ML, Feature Engineering for ML等。

确定好初步的特征后,可以开始选定机器学习算法。在大部分实际机器学习问题中,在特征和数据量确定之后,现有的较流行的算法之间的效果不会差特别多(最近几年的 Kaggle 的冠军大部分都是在特征工程上花功夫,算法上基本没有太多创新的地方)。通常比较好的实践是先选用一个基础的模型作为 base line,如 XGBoost。在特征工程已经不能带来提升时才考虑使用更复杂的算法(神经网络、多模型融合等)。

基于当前的特征数据和算法,训练得到机器学习模型,使用第 4 步的评价指标在对模型进行评估。注意这里评估的是模型的泛化性能,即模型在未见过的数据上的性能,因此在应该在验证集上对模型进行评估。另外一个需要注意的点是,在训练集上做的操作(特征预处理、特征选择等)都需要在验证集上进行同样的操作,确保验证集和训练集操作的一致,这样验证集上的评估指标才是有意义的。

这是一个迭代优化的过程,因此评估时应该注意针对不同的表现采取不同的改进方法,下图是调试过程中可能出现的情况以及对应的方法,主要是从偏差(Bais)、方差(Variance)两方面进行考察。

当评估指标达到要求的时候,此时可以结束模型迭代,进入后续的模型上线部署。


7. 特别注意

模型部署到线上环境的时候,有一个特别重要的问题需要注意。这个问题笔者在两个机器学习项目中均有遇到过。即线上环境与线下环境的一致性,这个一致性主要是输入数据的一致性、模型的一致性、评估的一致性。输入数据的一致性主要是要保证线性模型和线下模型的模型输入应该是一致的,相同的数据源、相同的数据处理方法、相同的特征工程。举个例子,如果线下环境的数据是 1min 时间粒度的,而线上环境是 5min 粒度的,这个时候如果你的特征处理中有使用时序的信息(比如用过去的数据做平滑),那么就有可能导致线上和线下的数据不一致(这种情况通常不会报错,但是会让模型的线上表现变差);再比如有可能有些数据是线下可以拿得到,但是线上的时候不能立刻拿到,这样的情况也要十分谨慎。

一种好的实践是在项目初期,建立起一个非常 robust 的 pipeline,这个 pipeline 应该要严格保证线上、线下的处理步骤是一致的(最好可以共用数据处理的代码)。刚开始建立 pipeline 的时候可以不用非常复杂的模型,但是一定要保证这个 pipeline 的正确性,可以通过手工检查 pipeline 中各个环节输入输出的正确性来保证 pipeline 的正确性。这个环节花费一些时间非常值得,一旦一个 robust 的 pipeline 搭建起来,后期便可以在上面进行快速迭代实验而不用担心一致性的问题。


总结

本文基于笔者经历过的机器学习项目,梳理了机器学习项目开发的流程、各个步骤的方法和要点,以及一些可能遇到的问题。这里的流程只包含了算法模型开发的过程,一个完整的机器学习项目还应该包括搭建一个稳固、可靠的机器学习 pipeline 方便快速地实验,包括模型开发完成后的上线部署,模型上线后的模型迭代和维护等等。这部分同样重要,笔者自身也在不断的提升这方面的能力,以后有机会再另开博文对这方面深入探讨。