前言
为什么要写这本书
近几年,机器学习爆发,犹如前些年大数据技术爆发一样,一家企业如果没有相关的应用都不敢说自己是科技公司,业界普遍朝着这个方向前进或转型。
互联网企业是机器学习应用的传统阵营,在推荐算法以及图像、视频和自然语言处理等方面都有成熟的应用,而近几年快速发展的互联网金融行业可谓是异军突起,推动了很多机器学习应用的落地,比如风控模型、反欺诈模型、全生命周期的信贷模型等。由于技术、行业、政策的综合因素,大量毕业生及相关行业工作者涌入或转入机器学习领域。大家的背景不一:有的人有计算机专业、统计专业、金融或经济相关专业背景;有的是由数据分析或软件开发转入;有的则是由传统银行转入。我们发现,大多数从业者并不清楚机器学习如何与系统应用相结合,不了解模型如何上线,不能编写良好的机器学习代码,不善于模块化复用,缺少软件开发常识和软件质量意识,忽视了机器学习实践中的软件工程属性。
机器学习从业者有时会自嘲为“调包侠”(只会调用现成的算法包),缺少更深入的智力参与。这就像“码农”和“软件工程师”的区别:前者是编写代码的“机器”(程序员自嘲式说法),拿到需求和功能就开始写代码,可将其定义为初级程序员;后者则会进行一定的工程设计和通用性考虑,包括模块设计、接口设计,以及开发和测试、升级和可维护性等方面的考量等。在机器学习领域,软件工程师即机器学习工程师或模型工程师,机器学习算法工程师需要软件工程素养,需将算法有效应用于实践。
一名优秀的机器学习工程师一定是一名合格的程序员,需要具备相应的软件工程素养。
在常规的软件开发过程中,程序员有属于自己的开发环境——挑选自己喜欢的编辑器,配置专属的开发环境。在机器学习建模中,Jupyter Notebook几乎已成为这个领域的标准编辑器,而在更为工程化或标准化的环境中,Docker可用于构建数据科学项目的工程环境。当我们将这些工程化的软件应用于机器学习中时,能帮助企业建立更为完善和标准的机器学习开发环境与IT架构,并在机器学习的实践中落地软件工程中的先进开发思想,如敏捷开发、测试驱动开发等。
此外,机器学习涉及大量应用广泛的开源算法包,但目前市面上鲜有介绍其应用的书。为此,本书中除了结合相关的工程软件,也介绍和应用了较多的算法包。实际上,网络上有大量的学习群、培训机构等传播了大量的相关资料,从多个方面讲述了机器学习,但难免知识点零散,显得急功近利。已有的相关图书一般从常用算法原理讲起,部分辅以实例,值得参考和学习,但笔者总感觉有所欠缺:比如模型评估中有KS指标,但还有特征的KS和KS检验,读者在遇到它们时会感到似曾相识,但又有些模糊,为此本书中会在适当的地方,针对关联知识或概念做进一步解释,想必会给读者豁然开朗的感觉;又比如,一位模型工程师熟悉了常用机器学习算法和建模流程,但他可能只做过模型训练或离线模型,从未真正上线过模型,为此本书将机器学习算法之外关于工程应用的现实问题,按机器学习项目流程进行了较好的阐述。
写作本书前,我心中已坚定一个想法:机器学习是一门实验学科,要求我们不仅要具备理论基础和敏锐的数据感知,还需要有做实验的工具、方法和策略等,并使用软件工程项目思维进行管理。这个想法一直指导我的实际建模工作,甚至影响我生活中的权衡决策。希望这一理念也能深入大家心中,这是我著书立说之梦想。
最后,诙谐轻松地说下我为什么要写这本书。
1)工作之余,周末闲适,希望做一些少有人做的事,挑战和成就自己。
2)如果不分享所学,实在可惜,对不起那么多的学习时间,把个人心得和所学传递给有需要的人会更有价值。
3)中学时代曾读到的一些科普文章中说,科学家一生最伟大的创造基本都是在30岁以前完成的,所以我也必须在智力和精力尚可时创作,否则以后很难对社会有智力贡献。
希望能够给有类似想法的读者以鼓励,或许这也是我写书的原因之一。
读者对象
总体来说,本书偏向于机器学习的进阶读者,读者需要掌握必要的计算机科学基础知识,具有Python语言的编程功底。本书适合以下读者:
·机器学习爱好者或从业者
·不具有编程背景的数据分析师、模型工程师
·具有编程背景的转行程序员和算法工程师
·高校师生
本书特色
本书视角独特,将软件工程中的方法应用到机器学习实践中,重视方法论和工程实践的融合。本书主要有3个特点。
1)机器学习的软件工程方法:用软件工程(Software Engineering)中的工具、方法和理论指导机器学习的实践活动。主要体现在测试驱动开发(TDD)方法、机器学习项目管理方法、工程化软件应用于数据科学标准化环境,以及开源算法包的大量实践应用案例等。
2)机器学习全生命周期:书中全面呈现了机器学习项目开发的完整链路,以项目需求为起点,历经样本定义、数据处理、建模、模型上线、模型监控、模型重训或重建。流程中的大部分节点独立成章,阐述充分,并且不是单纯地阐述理论,而是重在实践。同时,聚焦机器学习中应用最广泛和最有效的算法,使之成为贯穿机器学习项目生命周期的一条完整的学习路径。
3)提出机器学习是一门实验学科:书中有大量的工业实践代码,例如数据分析包、特征离散化包、特征选择包、集成模型框架包、大规模模型上线系统架构和对应代码包等,对机器学习算法特性也有大量的代码解析。书中还多次强调对于机器学习这样一门实验和实践学科,工具、方法和策略的重要性,并介绍了在实际项目中对时间、人力成本等的权衡策略。
本书不拘泥于公式推演、数值分析计算领域优化求解(梯度、牛顿、拉格朗日、凸优化)等主题,而重在展现机器学习的实际应用,以及各知识点的落地。在写作方式和内容编写等方面,本书力求既贴近工程实践又不失理论深度,给读者良好的阅读体验。
如何阅读本书
全书共16章,在逻辑上可分为4个部分,以机器学习建模流程的顺序展开,每个关键的流程节点对应一章,因此建议读者按章节顺序阅读,当然也可以直接挑选感兴趣的章节阅读。
第一部分 工程基础篇(第1~3章)
第1章首先介绍了机器学习在人工智能领域的地位,以及与当下热门的大数据、人工智能、统计学习等之间的关联和差异;其次详细介绍了软件工程中的TDD方法,并详细介绍了机器学习开发案例;最后基于互联网金融近三四年的机器学习应用沉淀和软件工程方法,重点讲述了机器学习以工程项目模式开发的优越性。
第2章提供了基于Docker定制的数据科学开发环境,供读者下载和使用。
机器学习是一门数据驱动的实验学科,因此第3章介绍了常用的数据集、接口使用方法和随机数生成方法,以满足不同读者的实验需求。
第二部分 机器学习基础篇(第4、5章)
第4章以软件工程项目的方式讲解机器学习中的核心概念,展现了从样本定义、数据处理、建模、模型上线到模型监控、模型重训或重建的完整机器学习项目生命周期,且加入了企业应用中严肃和严谨的观点,而不是类似Kaggle的建模竞赛游戏。
第5章详细介绍了数据分析方法、技巧、可视化等要点,并为此开发了一套高质量的数据分析工具。
第三部分 特征篇(第6~8章)
第6章介绍了特征工程,除归纳整理了常用的特征处理方法外,还重点介绍了特征离散化。本章几乎囊括了特征离散化的所有常用方法和技巧,比如卡方分箱、BestKS、最小熵,更令人期待的是,本章提供了高质量的源码实现。
第7章借助开源包featuretools的力量,显现了特征衍生“一生二,二生三,三生无穷”的强大魔力。特征的交叉组合可衍生大量的新特征,便于机器学习发现某种未知的模式,而其产生的可观的特征数量也是数据公司对外宣传的一项重要指标。随着大数据的发展与应用,诞生了大量的第三方数据公司,特征衍生在其中的作用不可小觑。
第8章篇幅较大,将特征选择作为机器学习的重点,描述了特征选择的背景、预测力指标和实践总结出来的一套特征选择流程,以及特征选择通用方法和特定模型特征选择方法。最后,结合书中所述理论,给出了一份不错的特征选择算法源码。
第四部分 模型篇(第9~16章)
本部分主要涉及两大类模型:线性模型和非线性模型。
第9章从线性回归讲起,逐步扩大到其他领域的广义线性模型、逻辑回归模型和金融领域的标准评分卡模型。这种方式高屋建瓴地为读者起到提示作用,让其对工作中应用的模型知其所以然。
第10章的树模型借助数据结构中的树结构来阐述。笔者认为,了解了树结构才会对树模型有更直观和深入的理解,这也有助于IT行业的读者学习。本章讲述了树的构建方法,并以一个简易的Python实现版本介绍了树模型。
第11章讲述了集成模型的可变组件和方法,基于这些组件和方法能按“搭积木”的方式构建多样的集成模型。本章详细讲述和分析了Bagging、Boosting、Stacking和Super Learner的原理和特性,并为此提供了一套Stacking集成框架和开源包ML-Ensemble的使用说明。
模型调参一直是建模人员向往的高地,需要建模人员拥有良好的综合能力。第12章为读者总结了调参流程、调参方法和自动调参理论与工具,并以XGBoost为例开发了一套自动调参工具,解释了对应的概念,为读者登上这块调参高地提供强有力的支撑。最后,介绍了多种开源调参工具的应用,包括BayesianOptimization、Ray-Tune和optuna。
单个模型的好坏有很多评价指标,模型间的选择同样有不同的衡量方法。第13章详细讲述了模型的各种评估方法及其背后的含义。
在医学或互联网金融领域,构建好的模型一定是需要解释的,而互联网领域对模型解释的需求则没有这么强烈。模型的解释可以让用户增强对业务的进一步理解,甚至形成新的知识,从而加强对业务的把控和决策,同时也有助于模型的优化。第14章中详细讲述了模型解释的可视化方法,以及白盒模型(以线性回归、逻辑回归、评分卡为代表)和黑盒模型(以集成树模型为代表)的解释原理和方法。白盒模型解释中讲述了模型系数变化、特征值变化带来的影响和含义。黑盒模型的解释介绍了通用的特征重要性方法,也使用到了Treeinterpreter、LIME和SHAP开源包,它们分别用于树模型的解释、通用局部模型解释和基于博弈论的通用解释。
第15章是本书最具有工程化实践意义的一章,主要介绍模型上线——上线方法可分为嵌入式和独立式。本章提供了多种上线方法:系数上线、自动化规则上线、开源格式法(PMML、ONNX)、编译动态库法、原生模型法和大规模模型上线的软件工程框架。书中开发的上线框架基于Docker和RESTful API。一个模型服务就是一个微服务,可支持大规模模型服务。
模型上线后的监控也很重要,决定了模型是否可用,是否需要重训或重建。第16章讲述了模型稳定性常用的监控指标和原理,并提供了相关代码实现,此外还介绍了一些监控异常的应急处理方法。
勘误和支持
由于作者水平有限,写作时间仓促,书中难免有一些错误或者不准确的地方,恳请读者批评指正。为此,特意创建了微信公众号“机器学习软件工程方法”。你可以通过这个公众号或下面提到的GitHub页面反馈问题,我将尽量在线上为你提供满意的解答。书中的全部源文件除可以从华章公司网站[1]下载外,还可以从我的个人GitHub[2]页面下载,我也会根据相应的功能更新及时做出调整。如果你有更多的宝贵意见,也欢迎发送邮件至邮箱xtdwxk@gmail.com,期待能够得到你的真挚反馈。
致谢
有3位作者参与本书的写作:张和平负责第3章、第5章、第7章和第10章,并参与2.1节的写作;唐振负责第13章和第16章,并参与第10章的写作;其他章节和全书核心代码由张春强完成。
我们曾经在一起共事,彼此非常熟悉。张和平曾经在凌晨陪我购房,唐振曾经在深圳人才公园散步时提到“程序员不能像建筑工程师一样为社会留下可见实物”,这些事都印在了我的心里。邀请他们共同写作,既是感恩,也是为了共同学习和进步。在这一年里,写作给大家的工作和生活造成了不小的压力,我也曾说过严厉的话语,在此说声抱歉!
本书重量级的审阅者是我的高中同学、目前远在英国教书的雷云文博士,他是伯明翰大学的教师,主讲机器学习。我常开玩笑说他是我们乡镇学历最高的人。他的审阅确实细致而严谨,图4-5的数字17就是他发现并修正的。希望新冠疫情早日结束,雷博士可以安全返乡,感谢雷博士!
感谢机械工业出版社华章公司的杨福川老师和栾传龙编辑对本书的支持和审阅!
在我的上一本书中,已经感谢过相关的人,此处不再赘述!
张春强
2020年6月
[1] 参见华章公司网站www.hzbook.com。——编辑注
[2] https://github.com/chansonZ/book-ml-sem