本文参考我自身的项目经验以及 Hands-On Machine Learning with Scikit-Learn &TensorFlow 的 Appendix B 所列举出来的机器学习项目清单。
机器学习项目清单
- 在宏观上确定整个问题的架构
- 获取数据
- 探索性数据分析(Exploratory Data Analysis, EDA)以洞悉数据
- 数据准备(Data Prepration)准备数据,将数据中可能隐含的模式暴露给ML算法
- 尝试使用多种不同的模型,并列出最佳模型
- 模型调参(Fine-tune),并将其结合为一个最好的解决方案
- 展示解决方案
- 运行、部署、监控及维护机器学习系统
在宏观上确定整个问题的架构
- 用业务术语定义目标
- 解决方案将如何使用?
- 当前有什么解决方案?
- 应该如何解决这个问题(有监督/无监督,在线/离线等)?
- 应该如何衡量性能?
- 性能指标是否符合业务目标?
- 达到业务目标所需的最低性能是多少?
- 是否有类似的问题?有可以重用的经验/模型/工具吗?
- 是否可以把专家的经验加入模型中?
- 如何手动解决问题?
- 列出目前为止所做的假设
- 如有可能,验证假设
获取数据
注意:尽可能地自动化,以便可以轻松获取新数据。
- 列出所需的数据内容及量级
- 寻找并记录可从何处获得该数据
- 检查数据占用空间大小
- 检查是否需要获得授权
- 获取访问授权
- 创建一个workspace(具有足够的存储空间)
- 获取数据
- 将数据转换为可以轻松操作的格式(无需更改数据本身)
- 确保数据已脱敏(被删除或保护)(例如匿名)
- 检查数据的大小和类型(时间序列,样本,地理等)
- 抽样选出测试集,将其放在一边,再也不要去看它
探索性数据分析(Exploratory Data Analysis, EDA)
注意:请尝试从现场专家那里获取有关这些步骤的见解。
- 创建数据副本以进行探索
- 创建一个Jupyter笔记本以记录EDA过程
研究每个属性及其特征:
- 名称
- 类型(分类,整数/浮点数,有界/无界,文本,是否结构化等)
- 缺失值的百分比
- 是否存在噪声,及噪声类型(随机,离群值,四舍五入误差等)
- 对模型建立可能有用吗?
- 分布类型(高斯分布,均匀分布,对数分布等)
- 对于有监督的学习任务,确定target属性
- 对数据进行可视化
- 研究属性之间的相关性
- 研究如何手动解决问题
- 确定可能想要应用的有希望的转变。
- 找出有用的外部数据
- 记录所有的发现
数据准备(Data Prepration)
注意:
- 处理数据副本(保持原始数据集完整)
把所有使用到的数据转换(data transformations)编写成函数,原因有5个:
- 以便下次获取新的数据集时可以轻松准备数据
- 可以在以后的项目中应用这些转换
- 清理及准备测试集
- 以便解决方案启用后,清理并准备新的数据实例
- 可以更方便地将准备选择作为超参数
数据清理:
- 修复或删除异常值(可选)
- 补充缺失值(例如,零,均值,中位数…)或删除其行(或列)
- 特征选择(可选):删除对任务不提供有用信息的属性
适当时进行特征工程:
- 离散化连续特征
- 分解特征(例如分类,日期/时间等)
- 为特征添加适合的转换(例如$\log x$,$\sqrt x$,$x^2$等)
- 将特征融合为适合的新特征。
- 特征缩放:标准化或标准化特征。
选取合适的模型
注意:
- 如果数据量巨大,则可能需要对较小的训练集进行采样,以便可以在合理的时间内训练许多不同的模型(请注意,复杂的模型在这种情况下效果会变差,例如大型神经网络或随机森林)
- 再次强调,尽可能自动化地执行这些步骤
- 使用标准参数训练来自不同类别(例如线性,naiveBayes,SVM,随机森林,神经网络等)的许多quick-and-dirty的模型。
测量并比较其性能对于每个模型,
- 使用K-Fold交叉验证,并计算性能的均值和标准差
- 分析每种算法的重要变量
分析模型所犯错误的类型
- 人们将使用什么数据来避免这些错误
- 快速进行特征选择和工程设计
- 在前五个步骤中再进行一两次快速迭代
- 列出前3-5个最有希望取得最优效果的模型,最好选择会产生不同类型错误的模型。
微调系统
注意:
- 需要在此步骤中使用尽可能多的数据,尤其是在即将进行微调时
- 一如既往地自动化
使用交叉验证对超参数进行微调
- 将数据转换选择视为超参数,尤其是当不确定它们时(例如,我应该将缺失值替换为零还是中位数?还是只删除行?)
- 除非要探索的超参数值很少,否则应优先选择随机搜索而不是网格搜索。如果训练时间很长,可能更适合使用贝叶斯优化方法(例如,使用高斯先验过程)
- 尝试集成方法,组合最好的模型通常会比单独运行它们更好
- 一旦对最终模型有信心,就可以在测试集上衡量其性能,以估计泛化误差
解决方案展示
- 记录所做的事情
- 创建一个漂亮的演示文稿,确保首先突出显示大图
- 解释为什么解决方案可以实现业务目标
不要忘了提出一路上注意到的有趣观点
- 描述什么有效,什么无效
- 列出假设和系统的局限性
- 确保通过漂亮的可视化效果或易于记忆的陈述传达主要发现(例如,“中位数收入是房价的第一预测因子”)。
运行、部署、监控及维护机器学习系统
- 准备解决方案以进行部署(加入生产数据的输入,编写单元测试等)
- 部署代码,使用开源活云端部署工具进行部署
编写监控代码,以定期检查系统的实时性能,并在系统down掉时触发警报
- 也要注意模型效率的缓慢的降低:随着数据的更新,模型泛化能力会变差
- 衡量模型效率可能需要人工进行
- 监视输入数据的质量(例如,传感器出现故障,发送了随机值,或者另一个团队的输出有问题),这对于在线学习系统尤其重要
- 定期根据新数据重新训练模型(retrain)(尽可能自动化进行)。