本文为《Hands on Machine Learning with Scikit-Learn and TensorFlow》第二章的读书笔记。第二章介绍机器学习项目落地实施过程中需要注意和考虑的事项、风险点,真是面面俱到。笔者阅读这种时,受益匪浅。若早点读到这一章,也可以避免之前踩过的一些坑。
机器学习项目落地实施的八个主要步骤:
- 表述要解决的问题,从宏观角度考虑。
- 获取数据。
- 探索数据,洞察数据的本质。
- 数据清洗,特征工程
- 尝试不同的算法,圈定最好的几种模型
- 模型调参,模型集成(bagging, boosting, stacking)
- 整理、展示解决方案
- 发布、监控、维护系统
下面是这八个主要步骤的详细介绍。
表述要解决的问题,从宏观角度考虑
- 用商业术语定义问题的目标
- 解决方案将会被怎样使用?
- 当前的解决方法是什么?(如果有的话)
- 表述问题:是监督学习还是非监督学习?是在线学习还是批量离线学习?
- 系统性能是怎样衡量的?(F1,均方误差....)
- 系统的性能衡量是否与商业目标一致?
- 可达到商业目标的最低(差)系统性能是多少?
- 有没有类似的案例?是否可复用类似案例的经验和工具
- 人类的知识经验是否可利用?
- 若手动操作地解决该问题,是怎样解决的?
- 列出目前已设定的假设
- 验证这些假设(如果可以的话)
获取数据。
如果可以的话,将获取数据的流程自动化,这样方便今后获取新的数据
- 列出需要的数据,需要多少数据
- 寻找,并记录哪里可以获取数据
- 存放数据的空间需要多大?
- 是否需要法律义务。如需要,获取批准
- 取得访问的授权
- 创建存储空间(存储空间足够大)
- 获取数据
- 在不改变数据内容的前提下,将数据转换成方便使用的格式
- 确认敏感信息是否已被删除或保护(是数据匿名,加密)
- 检查数据的大小和类型(时间序列、样本、地理学的,等)
- 抽样部分数据作为测试集。将测试集放在一边,不要观察测试集(no 数据窥探)(测试集仅用于最后的模型评估阶段)
探索数据
尝试从领域专家获取关于数据的洞察
- 创建数据的副本,用于数据探索(若数据本身太大,下采样数据,是数据副本的大小适中)
- 创建jupyter notebook,记录数据探索的过程
- 探究每一个属性和它的特点,
名称
类型(类别的,int/float,有界的/无界的,文本的,结构化的,等)
缺失值的占比
噪声,噪声的类型(随机,异常点,舍入舍去误差)
该属性是否对要解决的问题有用?
分布的类型(高斯分布,均匀分布、对数分布)
- 对于监督学习,确定目标属性
- 数据可视化
- 研究各属性之间的相关性
- 若手动操作地解决该问题,是怎样解决的?
- 确认有价值的特征转换
- 确认是否还有其他有价值的数据可用(回到步骤2、获取数据)
- 记录数据探索过程的结论、收获
准备数据(数据清洗,特征工程)
在数据的副本上进行数据清洗工作(避免原始数据的损坏)
应将数据清洗转换的逻辑封装到专门的函数里,理由如下:
- 下一次遇到新数据的时候,可以方便地进行数据准备工作(数据清洗、特征工程)
- 在将来的项目里,也可以使用这些函数
- 对于测试集,可以使用这些函数进行数据准备工作
- 当解决方案(模型)上线后,对于新的数据示例,可以使用这些函数进行清洗、准备工作
- 更方便地将数据准备工作的选择项看作为参数(模型调参的参数)
- 数据清洗
修复或清除异常点(可选项)
填充缺失值(如,使用零、平均值、中位数...),或,将有缺失值的列丢弃,或,将有缺失值的样本丢弃
- 特征选择(可选项)
将不相关的特征(对任务不能提供有用信息的特征)删除
- 特征工程(适当时)
离散化连续的特征
特征分解(如,类别的特征,日期/时间,等)
添加有用的特征转换(如,log(x), sqrt(x), x^2, 等)
将多个特征聚合(组合)成有用的新特征
- 特征缩放:标准化或规范化特征
尝试不同的算法,圈定最好的几种模型
如果数据量巨大,应该抽样数据量较小的数据作为训练集,这样方便在合理的时间内尝试
不同的模型(注意:数据量变小,会影响随机森林、神经网络等复杂模型的训练效果)
尽量将训练步骤自动化(如采用sklearn的pipeline)
- 使用默认参数,快速地训练不同种类的模型(如线性、朴素贝叶斯、svm、随机森林、神经网络等)
- 衡量并比较各模型的性能
对于每一个模型,使用N折交叉验证,计算N折交叉验证的性能指标的平均值和方差
- 分析每个算法的最重要的参数变量
- 分析模型的所犯的错误的类型
人类使用了什么数据来避免这些错误?
- 快速的尝试一遍特征选择与工程
- 对上述的五个步骤进行一到两次快速迭代
- 列出三到五个有前景的模型(不同的模型犯不同的错误类型,这样较好)
模型调参
在这个步骤,尽可能地使用较多的数据,特别是在最后的模型精细调参阶段
尽可能使流程自动化
- 使用交叉验证对模型进行调参
把数据转换的选择看作参数,特别在不知道进行哪种选择的时候(如,对于缺失值,是用0替代,还是用中位数替代,还是直接把有缺失值的样本删除?)
对于随机搜索和网格搜索,优先采用随机搜索(若要调参的参数较多的时候)。如果训练时间较长,可采用贝叶斯优化方法。
- 尝试集成方法。将最好的几个模型融合,产生更好的性能
- 一旦确认了最终的模型,在测试集上评估模型的泛化误差。
(不要在测试集上评估了泛化误差后,又去调整模型的参数。这样会导致过拟合)
展示解决方案
- 记录已完成的工作
- 制作演示搞,突出整体框架
- 解释为什么该解决方案可以实现商业目标
- 不要忘记展示工作过程发现的有趣观点
描述哪些起作用了,哪些没有
列出采用的假设以及系统的缺点局限
- 确保关键的结论通过优美的可视化或简洁的陈述方式表达出来(如,中位数收入是预测房价的第一重要特征)
发布
- 为用于生产做准备(如,接入生产数据,编写单元测试程序,等)
- 编写监控程序,定时监控线上系统的性能。如性能下降,产生告警
谨防性能退化:如将来数据的特征分布产生变化,模型会rot(过期)
性能衡量可能需要人工参与(如众包服务)
监控输入数据(input)的质量(可能遇到的情况:失灵的传感器发送随机的信号,或上游的输出失去了时效性等)。这对于在线学习系统尤其重要。
- 定期使用新的数据对模型进行重新训练(尽可能实现流程自动化)