Aurélien Géron 所著《Scikit-Learn与TensorFlow机器学习实用指南》附录有份机器学习项目的检查清单,非常实用。
故翻译如下。
描述问题并观察大局(the big picture)
- 用商业术语描述目标。
- 你的解决方案要如何运用?
- 目前的解决方案或变通方法是什么?
- 你要如何表述这个问题(监督/非监督学习,在线/离线学习等)?
- 怎样衡量性能?
- 性能指标与商业目标一致吗?
- 达到商业目标的最低性能是什么?
- 有没有类似的问题?你有可重复使用的经验或工具吗?
- 是否有专业人士的支持?
- 你如何手工解决这个问题?
- 列出你(或其他人)到目前为止的假设。
- 尽量核实假设。
获取数据
备注:为了较容易的取得最新数据,尽可能多的使用自动化工具。
- 列出你需要的数据,以及你需要多少数量。
- 找寻并且记下你从哪儿获取数据。
- 检查这些数据需要多少储存空间。
- 检查法律责任,如有必要获得授权。
- 取得访问数据的授权。
- 创造一个工作空间(有足够的储存空间)。
- 获得数据。
- 将数据转换成你易于操作的格式(不改变数据本身)。
- 确保敏感信息已被删除或收到保护(例如匿名化)。
- 检查数据的尺寸和格式(时间序列,样例,地理信息等)。
- 取出测试集,将之放置一边,绝不偷看它(不窥探数据)。
考察数据
备注:通过这些步骤尝试从数据中获得洞见。
- 将数据复制一份以用于考察(如有必要,可取样以便处理)。
- 创建一个Jupyter Notebook用于保存你的数据考察。
- 研究各个属性和它的特征:
- 名字
- 类型(分类,整数/浮点,有限/无限,文本,结构化的等)
- 缺失值的比例
- 噪音和噪音的类型(随机,异常值,取整误差等)
- 对任务有用的可能性?
- 分布的类型(高斯,均一,对数等)
- 对于监督学习的任务,识别目标属性。
- 数据可视化。
- 研究属性之间的关联。
- 研究你如何手工解决问题。
- 识别你准备采取的有效的变换。
- 识别可能有用的额外数据。
- 记录下你的发现。
准备数据
备注:
- 在数据的副本上进行(保持原数据完整)。
- 写下你采用的所有变换的函数,为以下五个原因:
- 如此你下次用新数据时可方便制备数据
- 你在未来项目中也可采用这些变换
- 用于清理和制备测试数据
- 解决方案上线后用于清理和制备新的数据实例
- 在调试超参数时易于更换你的选择
- 数据清理:
- 修正或去除异常值(可选)。
- 填充缺失值(用零,均值,中位数等)或者遗弃这些行(或列)。
- 特征选择(可选):
- 丢弃无法对任务提供有用信息的属性。
- 合适的特征工程:
- 将连续特征离散化。
- 分解特征(类别,日期/时间等)
- 增加特征合适的变换(对数,平方根,平方等)
- 将特征聚合成有用的新特征
- 特征缩放:将特征标准化或正则化。
初步选出可用的模型
备注:
- 如果数据非常大,你可以减少训练样例,将训练不同模型的时间缩短到可接受范围内(记住这样会惩罚大型神经网络或随机森林这类复杂的模型)。
- 同样的,尽量将这些步骤自动化。
- 用标准参数训练一些不同类型的便捷的模型(线性回归,朴素贝叶斯,支持向量机,随机森林,神经网络等)。
- 测定并且比较他们的性能。
- 对每个模型,使用N-fold交叉验证,计算性能的均值和标准差。
- 分析每个算法的最重要的变量。
- 分析每个模型的误差类型。
- 人会使用什么数据来避免这些错误?
- 快速的进行一轮特征选择和特征工程。
- 将以上五个步骤快速的重复迭代一到两次。
- 初步选出前三至五个表现最好的模型,优先选择产生不同错误类型的模型。
优化系统
备注:
- 你将在此步使用尽可能多的数据,尤其是在优化的最终阶段。
- 同样的,尽量自动化。
- 使用交叉验证优化超参数。
- 将你的数据变换视为超参数,尤其是你对它们不确定的时候(例如,我应该将缺失值填充零还是中位数?或者丢弃这些行?)。
- 除非超参数很少,使用随机搜索而不是网格搜索。如果训练时间非常久,你可用贝叶斯优化方法(例如,使用高斯处理先验,https://goo.gl/PEFfGr)
- 尝试集成方法。结合你最好的几个模型经常会比他们各自的性能更好。
- 一旦你对最终模型有信心,用测试集测试它的性能,评估其泛化误差。
展示你的解决方案
- 记录下你做的工作。
- 做一个漂亮的展示。
- 确保你在最开始就突出大局(the big picture)。
- 解释为什么你的解决方案达成了商业目标。
- 不要忘了展示你在过程中发现的有趣的点。
- 描述什么有用什么没有用。
- 列出你的假设和你系统的限制。
- 确保你的主要发现是通过漂亮的可视化或者容易记住的声明来呈现的(例如“收入的中位数是预测房价的最重要的指标”)。
上线!
- 将你的解决方案准备好以用于生产(导入生产数据,写单元测试等)
- 写检测代码以固定的间隙检查你系统的性能,并且在性能下降时发出警报。
- 也要当心缓慢的退化:模型在数据演化后容易衰退。
- 测试性能可能需要人工的参与(例如通过众包服务)。
- 同时监测你输入的质量(例如,故障的探测器发送随机的数据,或者其他组的输出不更新了)。这对在线学习系统尤为重要。
- 经常用全新的数据重新训练你的模型(尽量自动化)。