架构问题,关注蓝图
- 用商业术语定义目标。
- 方案如何使用?
- 目前的解决方案/办法是什么?
- 应该如何架构问题(有监督/无监督,在线/离线,等等)?
- 如何测量性能?
- 性能指标是否与业务目标一致?
- 每个业务目标需要的最低性能是什么?
- 有没有一些相似的问题?能重用一些经验和工具吗?
- 有没有相关有经验的人?
- 如何手动解决此问题?
- 列出目前为止你(或其他人)的假设。
- 如果可能的话,验证假设。
获取数据
尽可能的自动化,以便获取最新数据。
- 列出需要的数据及其体量。
- 查找并记录获取数据的途径。
- 检查需要的空间。
- 检查法律义务,必要时获取授权。
- 获取访问权限。
- 创建工作空间(确保具有足够的存储空间)。
- 获取数据。
- 将数据转换为可操作的格式(不改变数据本身)。
- 确保删除或保护敏感信息。
- 检查数据的类型和大小(时间序列、样本、地点等)。
- 采样一个测试数据集,放在一边,永远不要用它(没有数据窥视!)。
研究数据以获取灵感
- 创建数据的副本用于研究(如果需要,可以将其抽样为可管理的大小)
- 创建一个 Jupyter 笔记本来记录数据研究
- 研究每个属性及其特征:
名字
类型(分类、整型/浮点型、有界/无界、文本、结构等)
缺失值的百分比
噪音和噪音类型(随机、异常、舍入误差等)
可能有用的任务
分布类型(高斯、统 、对数等) - 对于有监督的学习任务,确认目标属性
- 可视化数据
- 研究属性之间的相关性
- 研究如何手动解决问题
- 确定希望使用转换
- 确定可能有用的额外数据(回到之前的“获取数据”部分)
- 记录学习到的东西
准备数据以更好地将低层模型暴 给机器学习算告
在数据的副本上工作(保持原始数据集不变)。
编写适用于所有数据转换的函数,原因有五个:
可以很容易地准备下一次得到新数据时的数据
可以在未来的项目中使用这些转换
清理和准备测试数据集。
一旦解决方案失效,用来清理和准备新数据实例
可以轻松地将你的准备选择作为超参数
1. 数据清理:
修复或删除异常值(可选)
填充缺失值(例如,使用零、平均数、中位数等)或删除该行(或列)
2. 特征选择(可选):
删除不能为任务提供任何有用信息的属性。
3. 在适当情况下,处理特征:
离散连续特征;
分解特征性(如,分类、日期/时间等);
添加期望的特征转换(如, log(x)、sqrt(x)、x2等);
聚合特征称为期望的新特征
研究各种不同的模型,并列出最好的模型
- 如果数据很大,可能需要采样为较小的训练集,以便于在合理的时间内训练不同的模型。
- 再次,尽可能地自动化这些步骤。
1. 使用标准参数,从不同类别(例如,线性、朴素贝叶斯、SVM、随机森林、神经网络等)中训练需求快速的不成熟的模型。
2. 测量并比较它们的性能。
对于每个模型,使用N倍交叉验证并计算N次折叠的性能测试的均值和标准差。
3. 分析每个算怯最重要的变量。
4. 分析模型产生的错误类型。
人类用什么样的数据避免这些错误?
5. 快速进行特征选择和处理。
6. 对前面五步进行一两次快速迭代。
7. 列出前 到五个最有希望模型,倾向于选择有不同错误类型的模型。
微调模型,并将其组合为更好的解决方案
1. 使用交叉验证微调超参数。
把数据转换选择当作超参数,尤其是不确定时(例如,应该用零或者平均值填充缺失值?或者直接删除?)。
除非需要研究的超参数值很少,否则更喜欢在网格搜索上随机搜索。如果训练很长,你可能更喜欢贝叶斯优化方提(高斯过程进行先验)
2. 尝试组合方怯。组合多个好模型往往比单独运行效果好。
3. 一旦你对最终模型有信心,在测试集上测 它的性能以估计泛化误差。
提出解决方案
1. 文档化工作。
2. 创建完美的横示。
首先确保突出蓝图。
3. 解释为什么你的解决方案达到了业务目标。
4. 不要忘记展示你发现的一些有趣的地方。
描述什么可以工作,什么不行。
列出你的假设和系统的局限。
5. 确保你的关键发现被完美展示或易于记忆的陈述。
启动、监视、维护系统
1. 准备好生产环境的解决方案(插入生产数据输入,写单元测试等)。
2. 编写监控代码,定期检查系统的性能,出问题时及时报警。
- 同样需要考虑缓慢退化:随着数据的增加,模型往往会“腐烂”。
- 测量性能可能需要人工流水线。
- 同时监控输入质量。这对在线学习系统尤为重要。
3. 定期对新数据重新建模(尽可能自动化)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。