0. 机器学习实战¶
基于Scikit-Learn和Pytorch的机器学习实战
本项目是《机器学习实战:基于Scikit-Learn和TensorFlow》的读书笔记,其中在阅读的时候将其中的TensorFlow部分修改为了PyTorch的实现。
0.1 机器学习项目清单¶
构架问题,关注蓝图
获取数据
研究数据以获得灵感
准备数据以更好的低层模型将数据暴露给算法
研究各种不同的模型,并列出最好的模型
微调模型,并将其组合为更好的解决方案
提出解决方案
启动、监视、维护系统
0.1.1 架构问题,关注蓝图¶
用商业术语定义目标
方案如何使用?
目前的解决方案/办法是什么?
应该如何架构问题(有监督/无监督, 在线/离线,等等)?
如何测量性能?
性能指标与业务指标是否一致?
每个原物目测需要的最低性能是什么?
有没有一些相似的问题?能重用一些经验和工具?
有没有相关有经验的人?
如何手动解决此问题?
列出目前为止你(或其他人)的假设
如果有可能,验证假设
0.1.2 获取数据¶
注意:应可能的自动化,一遍获取最新数据
列出需要的数据及体量
查找并记录获取数据的途径
检查需要的空间
检查法律义务,必要时获取授权
获取访问权限
创建工作空间(确保具有足够的储存空间)
获取数据
将数据转换为可操作的格式(不改变数据本身)
确保删除或保护敏感信息
检查数据的类型和大小(时间序列、样本、地点等)
采样一个测试数据集,放在一边,永远不要用它(没有数据窥视)
0.1.3 研究数据¶
注意:试着从这些步骤的领域专家那里获取灵感
创建数据的副本进行研究(如果有需要,可以将其抽样为可管理的大小)
创建一个Jupyter笔记本来记录数据研究
研究每个属性及其特征
名字
类型(分类、整型/浮点型,有界/无界,文本、结构等)
缺失值的百分比
噪音和噪音的类型(随机、异常、舍入误差等)
可能有用的任务
分布类型(高斯、统一、对数等)
对于有监督的学习任务,确认目标属性
可视化数据
研究属性之间的关联性
研究如何手动解决问题
确定希望使用的转换
确定可能有用的额外数据(回到之前“获取数据”部分)
记录学习到的东西
0.1.4 准备数据¶
注意:
在数据副本上工作
编写适用于所有数据转换的函数,原因有五个:
可以很容易地准备下一次得到新数据时的数据
可以在未来的项目中使用这些转换
清理和准备测试数据
一旦解决方案失效,用来清理和准备新的数据实例
可以轻松的将你的准备作为超参数
数据清理
修复或删除异常值
填充缺失值(例如,使用零、mean、median)或删除该记录
特征选择(optional)
删除不能为任务提供任何有用信息的属性
在适当情况下,处理特征
离散连续特征
分解特征(如,分类、日期/时间等)
添加期望的特征转换(如,$log(x)$, $sqrt(x)$,$x^2$等)
聚合特征称为期望的新特征
0.1.5 列出期望的模型¶
注意
如果数据很大,可能需要采样为较小的训练集,以便于在合理的时间内训练不同的模型(注意,这也会对诸如大型神经集和Random Forest等复杂模型造成不利影响)
再次 尽可能地自动化这些步骤
使用标准参数,从不同类别(例如,线性、朴素贝叶斯、SVM、RF、NN)中训练需求快速的不成熟的模型
测量并比较他们的性能
每个模型,使用$N$倍交叉验证并计算$N$此折叠的性能测试的均值和标准差。
分析每个算法最重要的变量
分析模型产生的错误类型
人类用什么样的数据避免这些错误?
快速进行特征选择和处理
对于前五步进行一两次快速迭代
列出前三到五个最有希望的模型,倾向于选择有不同错误类型的模型
0.1.6 微调系统¶
注意:
你将希望这一步使用尽可能多的数据,特别是在微调结束时
永远尽可能的自动化
使用交叉验证微调参数
把数据转换选择当做超参数,尤其是不确定时(例如,应该用零或者平均值填充缺失值?或者是直接删除它?)
除非需要研究的超参数很少,否则更喜欢在网格搜索上随机搜索。如果训练很长,你会更喜欢贝叶斯优化(例如 Jasper Snoek, Hugo Larochelle 和 Ryan Adams所述,使用高斯过程进行先验(https://goo.gl/PEFfGr))
尝试组合方法,组合多个好模型往往比单独运行效果好
一旦你最终对模型有信心,在测试集上测试它的性能以估计泛化误差。
测量泛化误差后,不需要调整模型;只需要开始过度拟合测试集
0.1.7 展示解决方案¶
文档化你所有的工作
创建完美的演示
首先确保突出蓝图
解释为什么你的解决方案达到了业务目标
不要忘记展示你发现的一些有趣的地方
描述什么可以工作,什么不行
列出你的假设和系统的局限
确保你的关键发现被完美展示或易于记忆的陈述
0.1.8 启动¶
准备好生产环境的解决方案(插入生产数据,写单元测试等)
编写监控代码,定期检查系统的性能,出现问题时及时报警
同样需要考虑缓慢退化:随着数据的增加,模型往往会“腐烂”
测量性能可能需要人工流水线
同事监控输入质量,这对在线学习尤为重要
定期对新数据重新建模(尽可能自动化)