本篇博客源于《Hands on Machine Learning with Scikit Learn and Tensorflow》的第二章以及附录B。
一般机器学习项目可以参考下列清单开展,主要包括八个步骤,可以根据实际情况修改:
1. 确定问题
- 确定商业目标(整体项目的商业价值)
- 如何应用解决方案(机器学习技术在项目中的角色)
- 调研现有、成熟的方法(如果有的话)
- 确定问题(监督/非监督,在线/离线...)
- 选择合理的评价指标,评估机器学习方法的效果
- 选择的评价指标是否和商业目标有联系
- 确定在满足商业目标的前提下,评价指标的下限是多少(如准确度不能低于多少、误差率不能高于多少等)
- 是否有类似的问题,能否复用经验或者工具
- 是否需要人类专家
- 如何手动解决问题
- 列出自己或者他人迄今作出的假设
- 如果可能的话可以验证假设是否正确
2. 获取数据
尽可能自动化获取数据的过程,便于获取新数据
- 列出所需的数据以及数量
- 寻找并且记录下来数据来源
- 检查存储数据所需的空间
- 检查获取数据是否合法,必要的时候申请授权
- 获得接触数据的权限
- 创建工作空间(足够的存储)
- 获取数据
- 将数据转换成容易操作的数据格式(不改变数据本身)
- 确保敏感信息被删除或者受保护(脱敏)
- 检查数据大小和数据类型(时间序列数据、地理数据等)
- 采样得到测试数据集,放到一边,并且绝对不能偷窥测试数据
3. 探索数据
像领域专家一样去努力了解数据
- 创建数据副本用于探索(数据量大的情况下采样一部分数据)
- 创建Jupyter notebook记录下数据探索过程
- 研究每个属性的特征
3.1 名称
3.2 类型(类别、整型/浮点数、有限区间/无限区间、文本、结构化数据等)
3.3 缺失值的百分比
3.4 噪音及其类型(随机、异常点、近似误差)
3.5 是否对任务游泳
3.6 分布类型(高斯、标准、对数等) - 对于监督学习任务,确定目标属性
- 可视化数据
- 研究数据之间的相关性
- 研究如何人工解决问题
- 判断哪些数据转换可能有用
- 判断是否还可以增加额外的有用数据(重复探索步骤)
- 文档化探索数据的收获
4. 准备数据
注意:
- 在数据副本上操作(保持原始数据无损)
- 所有应用的数据转换过程都用函数表示:
- 以后能够更简单地处理新数据
- 在未来的项目中应用这些数据转换
- 用于清洗并准备测试数据
- 解决方案上线后能够用于清洗、准备新数据实例
- 数据转换的函数可以作为超参数对待
- 清洗数据
1.1 修正或者移除异常点(可选)
1.2 填充缺失值(零、平均值、中位数...)或者删除缺失行或者缺失列 - 特征选择(可选)
2.1 抛弃对任务无用的属性 - 特征工程
3.1 离散化连续特征
3.2 分解特征(类别、日期/时间等) - 特征放缩:标准化或者归一化特征
5. 初步选择可能有用的模型
注意:
- 如果数据集过大,可以采样更小的训练数据集,便于在合理的时间内训练更多不同的模型(需要注意这样做会对复杂的模型不利,例如大型神经网络或者随机森林)
- 尽可能尝试自动化这些步骤
- 快速使用标准参数训练许多模型(线性、朴素贝叶斯、SVM、随机森林、神经网络等)
- 度量并且比较它们的表现
2.1 对于每个模型,采用N折交叉验证,比较在N次试验下评价指标的平均值和标准差 - 分析对于每个算法最有意义的变量
- 分析模型的误差类型
4.1 如果是人类,使用什么样的数据会避免这些误差 - 快速确定特征选择和特征工程
- 快速重复迭代前面的1-5步一到二次
- 列出最有效的3-5个模型,不同的模型的误差可能有所不同
6. 微调系统
注意
- 使用尽可能多的数据
- 尽可能自动化该过程
- 使用交叉验证微调超参数
1.1 将数据转换的选择也看作是超参数,特别是当自己也不确定数据转换是否有效时(例如,用零还是中位数填充缺失值或者直接删除缺失行)
1.2 除非超参数非常少,否则更倾向于使用随机搜索而不是网格搜索。如果训练过程太长,更倾向于贝叶斯优化方法。 - 尝试使用ensemble方法,将最好的几个模型结合到一起往往比单独模型效果要好
- 一旦对最终模型的效果满意,在测试数据上评估模型表现,预估泛化误差。
不要在测试数据上评估后再修改模型,这样做只会导致在测试数据集上过拟合。
7. 展示解决方案
- 将所做的工作记录至文档
- 做一个好的展示
2.1 确定能够体现价值 - 解释为什么解决方案实现了商业目标
- 不要忘记了工作中遇到的有意思的点
4.1 描述哪些有用,哪些没用
4.2 列出假设以及系统的限制性 - 确保核心发现和前面漂亮的可视化或者经验假设有关系(例如“中位数收入是房价的一个指标”)
8. 部署!
- 将解决方案应用到产品中(集成产品数据输入、单元测试等)
- 使用监测代码检查系统在正常区间内的实时效果,并且当宕机时预警
2.1 注意系统缓慢退化:模型会随数据进化而“腐烂”
2.2 可能需要人工来评估模型表现(众包服务)
2.3 监控输入数据质量,对于线上学习系统特别重要 - 在新数据上重新训练模型(尽可能自动化这个过程)