机器学习项目实施步骤

本博客主要翻译自Hands on Machine Learning with Scikit-Learn and TensorFlow

机器学习项目的八个主要步骤:

1.表述要解决的问题,从宏观角度考虑。

2.获取数据。

3.探索数据,洞察数据的本质。

4.数据清洗,特征工程

5.尝试不同的算法,圈定最好的几种模型

6.模型调参,模型集成(bagging, boosting, stacking)

7.整理、展示解决方案

8.发布、监控、维护系统

表述要解决的问题,从宏观角度考虑。

1. 用商业术语定义问题的目标

2. 解决方案将会被怎样使用?

3. 当前的解决方法是什么?(如果有的话)

4. 表述问题:是监督学习还是非监督学习?是在线学习还是批量离线学习?

5. 系统性能是怎样衡量的?(F1,均方误差....)

6. 系统的性能衡量是否与商业目标一致?

7. 可达到商业目标的最低(差)系统性能是多少?

8. 有没有类似的案例?是否可复用类似案例的经验和工具

9. 人类的知识经验是否可利用?

10. 若手动操作地解决该问题,是怎样解决的?

11. 列出目前已设定的假设

12. 验证这些假设(如果可以的话)

获取数据。

如果可以的话,将获取数据的流程自动化,这样方便今后获取新的数据

1. 列出需要的数据,需要多少数据

2. 寻找,并记录哪里可以获取数据

3. 存放数据的空间需要多大?

4. 是否需要法律义务。如需要,获取批准

5. 取得访问的授权

6. 创建存储空间(存储空间足够大)

7. 获取数据

8. 在不改变数据内容的前提下,将数据转换成方便使用的格式

9. 确认敏感信息是否已被删除或保护(是数据匿名,加密)

10. 检查数据的大小和类型(时间序列、样本、地理学的,等)

11. 抽样部分数据作为测试集。将测试集放在一边,不要观察测试集(no 数据窥探)(测试集仅用于最后的模型评估阶段)

探索数据

尝试从领域专家获取关于数据的洞察

1. 创建数据的副本,用于数据探索(若数据本身太大,下采样数据,是数据副本的大小适中)

2. 创建jupyter notebook,记录数据探索的过程

3. 探究每一个属性和它的特点

 * 名称
 * 类型(类别的,int/float,有界的/无界的,文本的,结构化的,等)
 * 缺失值的占比
 * 噪声,噪声的类型(随机,异常点,舍入舍去误差)
 * 该属性是否对要解决的问题有用?
 * 分布的类型(高斯分布,均匀分布、对数分布)

4. 对于监督学习,确定目标属性

5. 数据可视化

6. 研究各属性之间的相关性

7. 若手动操作地解决该问题,是怎样解决的?

8. 确认有价值的特征转换

9. 确认是否还有其他有价值的数据可用(回到步骤2、获取数据)

10. 记录数据探索过程的结论、收获

准备数据(数据清洗,特征工程)

在数据的副本上进行数据清洗工作(避免原始数据的损坏)
为数据转换编写专门的函数,理由:

  • 下一次遇到新数据的时候,可以方便地进行数据准备工作(数据清洗、特征工程)
  • 在将来的项目里,也可以使用这些函数
  • 对于测试集,可以使用这些函数进行数据准备工作
  • 当解决方案(模型)上线后,对于新的数据示例,可以使用这些函数进行清洗、准备工作
  • 更方便地将数据准备工作的选择项看作为参数(模型调参的参数)

1. 数据清洗

 * 修复或清除异常点(可选项)
 * 填充缺失值(如,使用零、平均值、中位数...),或,将有缺失值的列丢弃,或,将有缺失值的样本丢弃

2. 特征选择(可选项)

 * 将不相关的特征(对任务不能提供有用信息的特征)删除

3. 特征工程(适当时)

 * 离散化连续的特征
 * 特征分解(如,类别的特征,日期/时间,等)
 * 添加有用的特征转换(如,log(x), sqrt(x), x^2, 等)
 * 将多个特征聚合(组合)成有用的新特征

4. 特征缩放:标准化或规范化特征

尝试不同的算法,圈定最好的几种模型

如果数据量巨大,应该抽样数据量较小的数据作为训练集,这样方便在合理的时间内尝试
不同的模型(注意:数据量变小,会影响随机森林、神经网络等复杂模型的训练效果)
尽量将训练步骤自动化(如采用sklearn的pipeline)

1. 使用默认参数,快速地训练不同种类的模型(如线性、朴素贝叶斯、svm、随机森林、神经网络等)

2. 衡量并比较各模型的性能

 * 对于每一个模型,使用N折交叉验证,计算N折交叉验证的性能指标的平均值和方差

3. 分析每个算法的最重要的参数变量

4. 分析模型的所犯的错误的类型

 * 人类使用了什么数据来避免这些错误?

5. 快速的尝试一遍特征选择与工程

6. 对上述的五个步骤进行一到两次快速迭代

7.列出三到五个有前景的模型(不同的模型犯不同的错误类型,这样较好)

模型调参

在这个步骤,尽可能地使用较多的数据,特别是在最后的模型精细调参阶段
尽可能使流程自动化

1. 使用交叉验证对模型进行调参

 * 把数据转换的选择看作参数,特别在不知道进行哪种选择的时候(如,对于缺失值,是用0替代,还是用中位数替代,还是直接把有缺失值的样本删除?)
 * 对于随机搜索和网格搜索,优先采用随机搜索(若要调参的参数较多的时候)。如果训练时间较长,可采用贝叶斯优化方法。

2. 尝试集成方法。将最好的几个模型融合,产生更好的性能

3. 一旦确认了最终的模型,在测试集上评估模型的泛化误差。

(不要在测试集上评估了泛化误差后,又去调整模型的参数。这样会导致过拟合)

展示解决方案

1. 记录已完成的工作

2. 制作演示搞,突出整体框架

3. 解释为什么该解决方案可以实现商业目标

4. 不要忘记展示工作过程发现的有趣观点

 * 描述哪些起作用了,哪些没有
 * 列出采用的假设以及系统的缺点局限

5. 确保关键的结论通过优美的可视化或简洁的陈述方式表达出来(如,中位数收入是预测房价的第一重要特征)

发布

1. 为用于生产做准备(如,接入生产数据,编写单元测试程序,等)

2. 编写监控程序,定时监控线上系统的性能。如性能下降,产生告警

 * 谨防性能退化:如将来数据的特征分布产生变化,模型会rot(过期)
 * 性能衡量可能需要人工参与(如众包服务)
 * 监控输入数据(input)的质量(可能遇到的情况:失灵的传感器发送随机的信号,或上游的输出失去了时效性等)。这对于在线学习系统尤其重要。

3. 定期使用新的数据对模型进行重新训练(尽可能实现流程自动化)

posted on 2017-08-27 22:11  chelseayuan  阅读(560)  评论(0)    收藏  举报

导航