本文是学习Martin Zinkevich的『Rules of Machine Learning: Best Practices for ML Engineering』笔记,原文地址:
Do machine learning like the great engineer you are, not like the great machine learning expert you aren’t.
# 常用术语Terminology
#概述
do machine learning like the great engineer you are, not like the great machine learning expert you aren’t.
把自己当成伟大的工程师去使用机器学习,而不是伟大的机器学习专家。因为绝大多数你遇到的问题都是工程问题。
基础方法:
上述方法可以在很长一段时间内效果良好,直到没有更简单的方法来提高效率,才需要要增加复杂度。
#判断是否需要建立机器学习系统的原则
Rule 1 机器学习需要数据,在没有大量数据时,可以考虑使用启发式方法建立模型。启发式方法可以至少达到机器学习一半的效果;
Rule 2 在设计自己的系统时就注意数据的积累,各项指标的度量记录,这样为以后的分析及学习提供数据;
Rule 3 复杂的启发式是不利于维护的,此时可以用机器学习替代。
#如何部署管道
Rule 4 首先实现一个简化能用的架构,达到最低要求:
- 算法能够正确的获取到特征
- 模型能够学习到合理的权重
- 在服务器中,模型能够正确的获取到特征
Rule 5 独立于机器学习来测试架构
- 为算法提供数据,看看是否正确填充了特征列等参数;
- 将训练算法中获取的模型,在测试环境及服务环境中对比,是否获得相同的评估分数;
Rule 6 通过拷贝已有管道创建新管道时,要根据需要考虑是否保留已有管道中的数据;
Rule 7 充分利用已有的启发式算法
- 使用启发式算法进行预处理,比如用启发式算法将数据标记负标签;
- 直接从启发式算法创建新特征,生成原始值;
- 挖掘启发式算法的原始输入,拆分、组合成新的输入;
- 修改标签,以包含启发式算法中包含的信息;
Rule 8 要根据新需求、新数据不断更新模型
Rule 9 发布模型前检测问题,比如处理数据时的性能
Rule10 有些问题是没有具体表象的,比如没有及时更新的数据对模型的影响是微小的,累加起来就会出现问题;
Rule 11 特征列要有文档和负责人
Rule 12 当能较轻松的增加所有度量时,就一起增加,先不要考虑他们的权重
Rule 13 选择一个简单的、可观察的、可分类的度量作为第一个目标
Rule 14 用一个可解释(比如可视化)的模型进行起步,将使得调试更容易,比如线性回归
Rule 15 在策略层将垃圾过滤和质量评估分离开,先垃圾过滤,然后质量评估
#如何开始特征工程-选取特征、运行、迭代更新
Rule 16 不断的运行模型:加入新特征时、加入正则化时、变更目标后...永远不要想这是你最后一次运行模型:)
Rule 17 先使用便于观察和生成报表的特征,而不是用学习到的特征
Rule 18 联系上下文来分析特征,不要孤立的去分析
Rule 19 学习大量简单的特征比简单的复杂特征更容易,尝试用多个简单的特征来增加对数据的覆盖率
Rule 20 通过组合、修改创建容易理解的新特征,比如把连续值通过几个特征离散化(年龄1-18的用特征A的值为1标识,年龄18-35的用特征B的值为1标识...),比如长宽可以变为面积(长*宽),比如处理文本时用文字的点积或者交集来处理共同单词数量
Rule 21 特征数与样本大小正比,大概100倍关系:1000样本10特征,1千万样本10万特征...然后用Rule 28来决定用哪些特征
Rule 22 不再使用的特征要清理掉
Rule 23 用真实的用户来获取『用户反馈』而不是自己模拟
Rule 24 通过计算新旧模型预测结果的变化来保障模型的稳定,过大就要分析是否是好的改变。
Rule 25 根据最终预测的目的来选择模型
Rule 26 从测量误差中寻找模式,并创建新的特征,比如模型忽略了比较长的POST数据,那就增加特征POST长度
Rule 27 先量化然后在优化,即对观察到的异常行为进行量化
Rule 28 要注意到短期的行为与长期的行为并不一定一致,理解一个系统长期行为的唯一方法就是通过模型启用后的数据来训练
Rule 29 为了保障训练与服务(生产环境)一致,最好的方法是将服务时使用的特征集保存下来,作为训练输入
Rule 30 给数据做重要性加权,而不是直接忽略掉
Rule 31 要注意到:训练和服务(生产环境)中的数据可能不一致,比如相同id可能对应不同数据。可以通过在服务时增加日志来记录改变
Rule 32 尽量在训练管道和服务管道中复用代码,使用相同的编程语言,减少训练与服务之间的偏差
Rule 33 及时用最新(最近)数据进行测试,比如5号前的数据做了训练,就拿6号的数据进行测试
Rule 34 对于绝对干净的数据可以牺牲更大性能来学习
Rule 35 排序问题存在固有的偏差,要根据数据不同调整模型
Rule 36 避免位置相关的特征发生反馈循环,要保持位置相关的特征与其他特征相对分离
Rule 37 测量训练和服务(生产环境)的偏差
- 训练数据与保持数据(holdout data)之间的性能差距总是存在,但是不一定是坏事
- 保持数据与第二天的数据之间的性能差距,永远存在,如果差距很大,说明模型是时间敏感的
- 第二天的数据与实时数据之间的性能差距,如果由差距,说明工程由问题
#缓慢增长、优化细化、复杂模型——找到自己的路
Rule 38 首先要确定一致的目标,然后再去考虑新的特征
Rule 39 发布决策要基于长远的产品规划,很难让一个模型同时优化所有目标,优先处理可以直接优化的目标
Rule 40 模型的组合要简单
- 模型要么直接获取特征数据、要么获取另一个模型的输出;
- 增加基础分类器的预测概率时要降低集合的预测概率
Rule 41 当遇到性能瓶颈时,尝试增加大量新的信息,而不是精炼当前信号
Rule 42 多样、个性、关联性与普及程度不一定存在相关性
Rule 43 产品之间可以共用模型、数据,用一个特征的原始数据来预测另一个特征的行为有时候是可以成功的