机器学习实战:基于Scikit-Learn和PyTorch¶
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 启动¶
准备好生产环境的解决方案(插入生产数据,写单元测试等)
编写监控代码,定期检查系统的性能,出现问题时及时报警
同样需要考虑缓慢退化:随着数据的增加,模型往往会“腐烂”
测量性能可能需要人工流水线
同事监控输入质量,这对在线学习尤为重要
定期对新数据重新建模(尽可能自动化)
1. 机器学习概览¶
为什么要使用机器学习¶
对于那些现有解决方案需要大量手动调整或者是规则列表超长的问题:通过一个机器学习的算法就可以简单简化代码,并且提升执行表现。
对于那些传统技术手段无法解决的负责问题:通过最好的机器学习技术可以找到一个解决方案。
对于环境波动:机器学习系统可以适应新的数据。
从负责问题和海量数据中获得洞见。
机器学习的种类¶
是否在人的监督下训练
监督学习
无监督学习
半监督学习
强化学习
是否可以动态地进行增量学习
在线学习
批量学习
是简单的将新的数据点和已知的数据点进行匹配,还是像科学家那样,对训练数据进行模式检测,然后建立一个预测模型
基于实例的学习
基于模型的学习
监督式/无监督式学习¶
监督式学习
K-近邻算法
线性回归(Linear Regression)
逻辑回归(Logistic Regression)
支持向量机(Support Vector Machines, SVM)
决策树与随机森林(Decision Trees and Random Forests)
神经网络(Neural Networks)
无监督式学习
聚类算法
k-平均算法(k-Means)
分层聚类分析(Hierachical Cluster Analysis, HCA)
最大期望算法(Expectation Maximization)
可视化和降维
主成分分析(PCA)
核主成分分析(Kernel PCA)
局部线性嵌入(LLE)
t-分布随机近临嵌入(t-SNE)
关联规则学习
Apriori
Eclat
半监督式学习
深度信念网络(DBN)
深度信念网络是一种互相堆叠组件,这个组件叫做受限波尔兹曼机(RBN)
受限波尔兹曼机(RBN)是以无监督的方式进行训练的,然后使用监督式学习对整个系统进行微调
强化学习
强化学习是一个非常与众不同的巨兽。它的学习系统(在其语境中称为智能体)能够观察环境,做出选择,执行操作,并获得回报,或是以负面回报的形式获得惩罚。所以它必须自行学习什么是最好的策略,从而随着时间推移获得最大的回报。
许多机器人是通过强化学习学习如何行走的。
DeepMind项目的AlaphGo项目也是一个强化学习的例子。
机器学习的挑战¶
训练数据的数量不足
训练数据不具有代表性
质量差的数据
无关特征
训练数据过度拟合
训练数据拟合度不足
确保你可以回答以下问题¶
1. 你会如何定义机器学习?¶
点击显示答案
机器学习是一门能够让系统从数据中学习的计算机科学。
2. ML在哪些问题上表现突出,举出四种类型?¶
点击显示答案
机器学习非常有利于:不错在已知算法解决方案的复杂问题,需要大量手动调整或是规则列表超长的问题,创建可以适应环境波动的系统,以及帮助人类学习(如数据挖掘)
3. 什么是被标记的训练数据集?¶
点击显示答案
被标记的训练集是指包含每个实例所期望的解决方案的训练集
4. 最常见的两种监督式学习任务?¶
点击显示答案
回归和分类
5. 列举四种常见的无监督式学习任务?¶
点击显示答案
聚类、可视化、降维以及关联规则学习
6. 要让机器人在各种未知地形行走,你会使用什么类型的ML算法?¶
点击显示答案
强化学习
7. 将客户分成多组,你会使用什么类型的算法?¶
点击显示答案
如果不知道如何定义,可以使用聚类算法;如果知道想要什么样的群组,可以将每个组的多个示例反馈给算法(监督学习)
8. 你会将垃圾邮件分类问题列出监督式学习还是无监督式学习?¶
点击显示答案
典型的监督学习场景
9. 什么是在线学习?¶
点击显示答案
在线学习系统可以进增量学习,与批量学习系统正好相反。这使得它能够快速适应不断变化的数据和自动化系统,并且可以在大量的数据上进行训练
10. 什么是核外学习?¶
点击显示答案
核外算法可以处理计算机主内存无法应对的大量数据。他将数据分割成小批量,然后使用在线学习技术从这些小批量中学习。
11. 什么类型的学习算法依赖相似度来做出预测?¶
点击显示答案
基于实例的学习系统
12. 模型参数和学习算法中的超参数有什么区别?¶
点击显示答案
模型参数有一个或多个参数,这些参数决定了模型对新的给定的实例会做出怎样的预测。学习算法试图找到这些参数的最优解,使得模型能够很好的泛化至新实例。超参数是学习算法本身的参数,不是模型的参数(比如,要应用的正则化参数)
13. 基于模型的学习算法搜索的是什么?它们最常用的策略是什么?它们如何做出预测的?¶
点击显示答案
基于模型的算法搜索的是使模型泛化最佳的模型参数。通常使用成本(loss)函数最小话进行训练这样的系统,成本函数衡量的是系统对训练数据的预测有多坏,如果模型由正则化,则再加上一个对模型复杂度的惩罚。学习算法最终找到的参数值就是最终得到的预测函数,只需要将实例特征提供给这个预测函数即可进行预测。
14. 提出ML中的四个主要挑战?¶
点击显示答案
数据缺乏、数据质量差、数据不具有代表性、特征不具信息量、模型过于简单对训练数据欠拟合、模型过于复杂对训练数据过拟合
15. 如果你的模型在训练集上表现很好,但是应用到实际数据上泛化能力却很差,是怎么回事,提出三种可能解决问题的方案?¶
点击显示答案
模型在训练数据上过拟合了,可能的解决方案:获取更多的数据、简化模型(选择更简单的算法、减少使用的参数和特征数量、对模型进行正则化),或者是减少数据训练中的噪声、提前结束训练
16. 什么是测试集,为什么要使用测试集?¶
点击显示答案
在模型启动至生产环境之前,使用测试集来估算模型在新的实例上的泛化误差
17. 验证集的目的是什么?¶
点击显示答案
用来比较不同的模型。可以用来选择最佳模型和调整超参数
如果使用测试集调整超参数会出现什么问题?
点击显示答案
使模型在测试集上过拟合,最后测量的泛化误差过于乐观
19. 什么是交叉验证,为什么只验证集更好?¶
点击显示答案
通过使用交叉验证技术,可以不需要单独的验证集实现模型比较,这节省了宝贵的训练数据。
2. 端到端的机器学习项目¶
version https://git-lfs.github.com/spec/v1 oid sha256:db54132db629a3f727e874be3f60694835e03ec62a68deaf0e12e532a3e82b47 size 70159435
3. 分类¶
version https://git-lfs.github.com/spec/v1 oid sha256:1d835b8329e05a3d57d650d1ab24d9544571fc63a01d00e6c7c49823587f764e size 1023610
version https://git-lfs.github.com/spec/v1 oid sha256:8e9ce2cecb0d8acf0a3a3ed2d37393c7a55dc5d9664bc9c609efa0953d7035a0 size 47328
version https://git-lfs.github.com/spec/v1 oid sha256:b35d3eda5d7e7dcd6de1586904ae69c82d550eb4c8b8fc12d6bb2bd872751e1e size 63664
version https://git-lfs.github.com/spec/v1 oid sha256:8337aaa07ea33b68c804b29166b265e0cb65e260a99216e5506314d4e56bad61 size 79237
version https://git-lfs.github.com/spec/v1 oid sha256:ea3b0448e3c961724cce4ac9fb83872e55bb96071c14d94e0f73f5c41d334e01 size 3546766
version https://git-lfs.github.com/spec/v1 oid sha256:812341f1c9154a9030b90a52137d012b8ec69ba849e56e577847b51b6c928813 size 30697
4. 训练模型¶
version https://git-lfs.github.com/spec/v1 oid sha256:5a4639705046c5abb3cb80b3d72359520b8a77137f1dac6ab8e1679535e1e41e size 90858
version https://git-lfs.github.com/spec/v1 oid sha256:b9ec321d023a7884af09650df97b917345ed38c7b59104975a8622e06bec1c22 size 6742
version https://git-lfs.github.com/spec/v1 oid sha256:944ff79b46fdb3725daf1b25a52a17960eefe1071ba9be4eb15f49c0940b1613 size 91023
version https://git-lfs.github.com/spec/v1 oid sha256:768dd3dede38c08ca5755ff0194d699103ce7fa3538b8dcb3388830282139d82 size 99732
version https://git-lfs.github.com/spec/v1 oid sha256:8839c6d4d6095c2c6db57f8b212261d3d460aba1e21ec53b46e7cf401e850846 size 108254