全书总结

现在你知道了如何使用重要的机器学习算法进行监督学习和无监督学习,这让你可以解

决很多种机器学习问题。在带你探索机器学习提供的所有可能性之前,我们希望给你一

些最后的建议、一些额外的资源,并提供关于如何进一步提高机器学习和数据科学技能

的建议。

处理机器学习问题

学完了本书介绍的所有强大的方法,你现在可能很想马上行动,开始用你最喜欢的算法来

解决数据相关的问题。但这通常并不是开始分析的好方法。机器学习算法通常只是更大的

数据分析与决策过程的一小部分。为了有效地利用机器学习,我们需要退后一步,全面地

思考问题。首先,你应该思考想要回答什么类型的问题。你想要做探索性分析,只是看看

能否在数据中找到有趣的内容?或者你已经有了特定的目标?通常来说,你在开始时有一

个目标,比如检测欺诈用户交易、推荐电影或找到未知行星。如果你有这样的目标,那么

在构建系统来实现目标之前,你应该首先思考如何定义并衡量成功,以及成功的解决方案

对总体业务目标或研究目标有什么影响。假设你的目标是欺诈检测。

然后就出现了下列问题:

• 如何度量欺诈预测是否实际有效?

• 我有没有评估算法的合适数据?

• 如果我成功了,那么我的解决方案会对业务造成什么影响?

正如第5章中所述,你最好能使用商业指标直接度量算法的性能,比如增加利润或减少损

失。但这通常难以做到。一个更容易回答的问题是:“如果我构建出完美的模型,那么会

怎么样?”如果完美地检测出所有欺诈行为可以为你的公司每月节省100美元,那么这些省下来的钱可能都不够保证让你开始动手开发算法。如果模型可能为你的公司每月节省上

万美元,那么这个问题就值得探索。

假设你已经定义好了要解决的问题,知道一种解决方案可能对你的项目产生重大影响;此

外,你还确信拥有合适的信息来评估模型是否成功。接下来的步骤通常是获取数据并构建

工作原型。本书中我们讨论过许多你可以使用的模型,以及如何正确地评估和调节这些模

型。但在尝试这些模型时请记住,这只是更大的数据科学工作流程中的一小部分,模型构

建通常是“收集新数据、清洗数据、构建模型和分析模型”这个反馈环路的一部分。分析

模型所犯的错误通常告诉我们:数据中缺失了哪些内容、还可以收集哪些额外数据,或者

如何重新规划任务使机器学习更加高效。收集更多数据或不同的数据,或者稍微改变任务

规划,可能会比连续运行网格搜索来调参的回报更高。

参与决策过程的人

你还应该考虑是否应该让人参与决策过程,以及如何参与。有些过程(比如无人驾驶汽车

的行人检测)需要立即做出决定。其他过程可能不需要立刻的响应,所以可以让人来决定

不确定的决策。举个例子,医疗应用可能需要非常高的精度,单靠机器学习算法可能无法

达到。但如果一个算法可以自动完成90%、50%甚至只有10%的决策过程,那么都可能

已经减少了响应时间或降低了成本。许多应用都以“简单情况”为主,算法可以对其做出

决策,还有相对较少的“复杂情况”,可以将其重新交给人来决定。

从原型到生产

本书中讨论的工具对许多机器学习应用来说都是很好的,可以非常快速地进行分析和原

型设计。许多组织,甚至是非常大型的组织,比如国际银行和全球社交媒体公司,也将

Python和scikit-learn用于生产系统。但是,许多公司拥有复杂的基础架构,将Python

集成到这些系统中并不总是很容易。这不一定是个问题。在许多公司中,数据分析团队使

用Python或R等语言,可以对想法进行快速测试,而生产团队则使用Go、Scala、C++和

Java等语言来构建鲁棒性更好的可扩展系统。数据分析的需求与构建实时服务并不相同,

所以这些任务使用不同的语言是有道理的。一个相对常见的解决方案是使用一种高性能语

言在更大的框架内重新实现分析团队找到的解决方案。这种方法比嵌入整个库或整个编程

语言并与不同数据格式互相转换要更加简单。

无论你能否在生产系统中使用scikit-learn,重要的是要记住,生产系统的要求与一次性

的分析脚本不同。如果将一个算法部署到更大的系统中,那么会涉及软件工程方面的很

多内容,比如可靠性、可预测性、运行时间和内存需求。对于在这些领域表现良好的机器

学习系统来说,简单就是关键。请仔细检查数据处理和预测流程中的每一部分,并问你

自己这些问题:每个步骤增加了多少复杂度?每个组件对数据或计算基础架构的变化的

鲁棒性有多高?每个组件的优点能否使其复杂度变得合理?如果你正在构建复杂的机器

学习系统,我们强烈推荐阅读Google机器学习团队的研究者发布的这篇论文:“Machine

Learning: The High Interest Credit Card of Technical Debt”(http://research.google.com/pubs/

pub43146.html)。这篇文章重点介绍了在大规模生产中创建并维护机器学习软件的权衡。虽然技术债问题在大规模的长期项目中特别紧迫,但即使是短期和较小的系统,吸取的教

训也有助于我们构建更好的软件。

测试生产系统

在这本书中,我们介绍了如何基于事先收集的测试集来评估算法的预测结果。这被称为离

线评估(offline evaluation)。但如果你的机器学习系统是面向用户的,那么这只是评估算

法的第一步。下一步通常是在线测试(online testing)或实时测试(live testing),对在整个

系统中使用算法的结果进行评估。改变网站向用户呈现的推荐结果或搜索结果,可能会极

大地改变用户行为,并导致意想不到的结果。为了防止出现这种意外,大部分面向用户的

服务都会采用A/B测试(A/B testing),这是一种盲的(blind)用户研究形式。在A/B测

试中,在用户不知情的情况下,为选中的一部分用户提供使用算法A的网站或服务,而为

其余用户提供算法B。对于两组用户,在一段时间内记录相关的成功指标。然后对算法A

和算法B的指标进行对比,并根据这些指标在两种方法中做出选择。使用A/B测试让我

们能够在实际情况下评估算法,这可能有助于我们发现用户与模型交互时的意外后果。通

常情况下,A是一个新模型,而B是已建立的系统。在线测试中还有比A/B测试更为复杂

的机制,比如bandit算法。John Myles White的Bandit Algorithms for Website Optimization

了很好的介绍。

构建你自己的估计器

本书包含scikit-learn中实现的大量工具和算法,可用于各种类型的任务。但是,你通常

需要对数据做一些特殊处理,这些处理方法没有在scikit-learn中实现。在将数据传入

scikit-learn模型或管道之前,只做数据预处理可能也足够了。但如果你的预处理依赖于

数据,而且你还想使用网格搜索或交叉验证,那么事情就变得有点复杂了。

我们在第6章中讨论过将所有依赖于数据的处理过程放在交叉验证循环中的重要性。那

么如何同时使用你自己的处理过程与scikit-learn工具?有一种简单的解决方案:构建

你自己的估计器!实现一个与scikit-learn接口兼容的估计器是非常简单的,从而可以

与Pipeline、GridSearchCV和cross_val_score一起使用。你可以在scikit-learn文档

estimator),但下面是其要点。实现一个变换器类的最简单的方法,就是从BaseEstimator和

TransformerMixin继承,然后实现__init__、fit和predict函数,如下所示。

In[1]:

from sklearn.base import BaseEstimator, TransformerMixin

class MyTransformer(BaseEstimator, TransformerMixin):

def __init__(self, first_parameter=1, second_parameter=2):

#所有参数必须在__init__函数中指定

self.first_parameter = 1

self.second_parameter = 2

def fit(self, X, y=None):

# fit应该只接受X和y作为参数

#即使你的模型是无监督的,你也需要接受一个y参数!

#下面是模型拟合的代码

print("fitting the model right here")

# fit返回self

return self

def transform(self, X):

# transform只接受X作为参数

#对X应用某种变换

X_transformed = X + 1

return X_transformed

实现一个分类器或回归器的方法是类似的,你只需要从ClassifierMixin或RegressorMixin

继承,而不是TransformerMixin。此外,你还要实现predict,而不必实现transform。

从上面的例子中可以看出,实现你自己的估计器需要很少的代码,随着时间的推移,大部

分scikit-learn用户都会构建出一组自定义模型。

下一步怎么走

本书对机器学习进行了介绍,并让你成为一名高效的从业者。但是,如果你想要进一步提

高机器学习技能,下面是一些关于书籍和更专业的资源的建议,以便你进一步深入研究。

理论

在本书中,我们试图直观地解释大多数常见机器学习算法的工作原理,而不要求你在数学或

计算机科学方面具有坚实的基础。但是,我们讨论的许多模型都使用了概率论、线性代数和

最优化方面的理论。虽然没有必要理解这些算法的所有实现细节,但我们认为,了解算法背

后的一些理论知识可以让你成为更优秀的数据科学家。关于机器学习理论有许多好书,如果

我们所讲的内容激起了你对机器学习可能性的兴趣,那么我们建议你挑选至少一本书深入

阅读。我们在前言中已经提到过Hastie、Tibshirani和Friedman合著的《统计学习基础》一

书,这里值得重新推荐一下。另一本相当好读的书是Stephen Marsland的Machine Learning:

An Algorithmic Perspective(Chapman and Hall/CRC出版社),它还附带有Python代码。还

有两本强烈推荐的经典著作:一本是Christopher Bishop的Pattern Recognition and Machine

Learning(Springer出版社),着重于概率框架;另一本是Kevin Murphy的Machine Learning:

A Probabilistic Perspective(MIT出版社),全面论述了机器学习方法(1000多页),深入介绍

了最先进的方法,内容比本书要丰富得多。

其他机器学习框架和包

虽然scikit-learn是我们最喜欢的机器学习软件包

1,Python也是我们最喜欢的机器学习语言,但还有许多其他选择。根据你的需求,Python和scikit-learn可能不是你在特定情况

下的最佳选择。通常情况下,Python很适合尝试与评估模型,但更大型的Web服务和应

用更常用Java或C++编写,部署模型可能需要与这些系统进行集成。你想要考虑scikit-

learn之外的选择可能还有一个原因,就是你对统计建模和推断比对预测更感兴趣。在这

种情况下,你应该考虑使用Python的statsmodels包,它用更具有统计学意义的接口实现

了多种线性模型。如果你还没有专情于Python,那么还可以考虑使用R,这是数据科学家

的另一种语言。R是专为统计分析设计的语言,因其出色的可视化功能和许多可用的统计

建模包(通常是非常专业化的)而闻名。

另一个常用的机器学习软件包是vowpal wabbit(通常简称为vw,以避免绕口),一个用

C++编写的高度优化的机器学习包,还有命令行界面。vw对大型数据集和流数据特别有

用。对于在集群上分布式运行的机器学习算法,在写作本书时最常用的解决方案之一是

mllib,一个基于spark分布式计算环境构建的Scala库。

排序、推荐系统与其他学习类型

本书是一本入门书,所以我们重点介绍最常见的机器学习任务:监督学习中的分类与回

归,无监督学习中的聚类和信号分解。还有许多类型的机器学习,都有很多重要的应用。

有两个特别重要的主题没有包含在本书中。第一个是排序问题(ranking),对于特定查询,

我们希望检索出按相关性排序的答案。你今天可能已经使用过排序系统,它是搜索引擎的

运行原理。你输入搜索查询并获取答案的有序列表,它们按相关性进行排序。Manning、

Raghavan和Schuütze合著的Introduction to Information Retrieval一书给出了对排序问题的

很好介绍。第二个主题是推荐系统(recommender system),就是根据用户偏好向他们提供

建议。你可能已经在“您可能认识的人”“购买此商品的顾客还购买了”或“您的最佳选

择”等标题下遇到过推荐系统。关于这一主题有大量文献,如果想立刻投身于这一主题,

你可能对目前经典的“Netflix大奖挑战”(Netflix prize challenge,http://www.netflixprize.

com/)感兴趣。Netflix视频流网站发布了关于电影偏好的大型数据集,并对给出最佳推荐

的团队奖励一百万美元。另一种常见的应用是时间序列预测(比如股票价格),这方面也

有大量的文献。还有许多类型的机器学习任务,比我们这里列出的要多得多,我们建议你

从书籍、研究论文和在线社区中获取信息,以找到最适合你实际情况的范式。

概率建模、推断与概率编程

大部分机器学习软件包都提供了预定义的机器学习模型,每种模型应用了一种特定算法。

但是,许多现实世界的问题都具有特殊的结构,如果将这种结构正确地纳入模型,则可以

得到性能更好的预测。通常来说,具体问题的结构可以用概率论的语言来表述。这种结构

通常来自于你想要预测的情况的数学模型。为了理解结构化问题的含义,请思考下面这个

例子。

假设你想要构建一个在户外空间提供非常详细的位置估计的移动应用,以帮助用户定位历

史遗迹。手机提供了许多传感器来帮你获取精确的位置测量,比如GPS、加速度计和指南

针。你可能还有该区域的精确地图。这个问题是高度结构化的。你从地图中知道了感兴趣

地点的位置和路径。你还从GPS中得到了粗略的位置,而用户设备中的加速度计和指南针可以为你提供非常精确的相对测量。但是,将所有这些工具全部放入黑盒机器学习系统中

来预测位置,可能并不是最好的主意。这将会丢掉你已经知道的关于现实世界如何运行的

所有信息。如果指南针和加速度计告诉你一名用户正在向北走,而GPS告诉你该用户正在

向南走,你可能不相信GPS。如果位置估计告诉你用户刚刚走过一堵墙,你应该也会非常

怀疑。可以使用概率模型来表述这种情况,然后再使用机器学习或概率推断来找出你应该

对每种测量方法的信任程度,并推断出该用户位置的最佳猜测。

一旦你用正确的方式对现状和不同因素共同作用的模型进行表述,那么就有一些方法可以

利用这些自定义模型直接计算出预测结果。这些方法中最普遍的方法被称为概率编程语

言,它们提供了一种非常优雅又非常紧凑的方法来表述学习问题。概率编程语言的常见例

子有PyMC(可用于Python)和Stan(可用于多种语言的框架,包括Python)。虽然这些软

件包需要你对概率论有一些了解,但它们大大简化了新模型的创建过程。

神经网络

虽然我们在第2章和第7章都简要涉及了神经网络的主题,但这是机器学习快速发展的领

域,每周都会发布新方法和新应用。机器学习和人工智能领域的最新突破都由这些进步所

驱动,比如Alpha Go程序在围棋比赛中战胜人类冠军、语音理解的性能不断提高,以及

接近实时的语音翻译的出现。虽然这一领域的进步非常迅速,以致当前对最新进展的任

何参考很快都会过时,但Ian Goodfellow、Yoshua Bengio和Aaron Courville的新书Deep

Learning(MIT出版社)对这一主题进行了全面介绍。2

推广到更大的数据集

在本书中我们总是假设,所处理的数据可以被存储为内存(RAM)中的一个NumPy数组

或SciPy稀疏矩阵。即使现代服务器通常都具有数百GB的RAM,但这也是对你所能处理

数据大小的根本限制。不是所有人都买得起这么大型的机器,甚至连从云端供应商租一台

都负担不起。不过在大多数应用中,用于构建机器学习系统的数据量相对较小,很少有机

器学习数据集包含数百GB以上的数据。在多数情况下,这让扩展内存或从云端供应商租

一台机器变成可行的解决方案。但是,如果你需要处理TB级别的数据,或者需要节省处

理大量数据的费用,那么有两种基本策略:核外学习(out-of-core learning)与集群上的并

行化(parallelization over a cluster)。

核外学习是指从无法保存到主存储器的数据中进行学习,但在单台计算机上(甚至是一

台计算机的单个处理器)进行学习。数据从硬盘或网络等来源进行读取,一次读取一个

样本或者多个样本组成的数据块,这样每个数据块都可以读入RAM。然后处理这个数

据子集并更新模型,以体现从数据中学到的内容。然后舍弃该数据块,并读取下一块数

据。scikit-learn中的一些模型实现了核外学习,你可以在在线用户指南中找到相关细节

of-core-learning)。因为核外学习要求所有数据都由一台计算机处理,所以在非常大的数据

集上的运行时间可能很长。此外,并非所有机器学习算法都可以用这种方法实现。另一种扩展策略是将数据分配给计算机集群中的多台计算机,让每台计算机处理部分数

据。对于某些模型来说这种方法要快得多,而可以处理的数据大小仅受限于集群大小。

但是,这种计算通常需要相对复杂的基础架构。目前最常用的分布式计算平台之一是在

Hadoop之上构建的spark平台。spark在MLLib包中包含一些机器学习功能。如果你的数

据已经位于Hadoop文件系统中,或者你已经使用spark来预处理数据,那么这可能是最

简单的选项。但如果你还没有这样的基础架构,建立并集成一个spark集群可能花费过大。

前面提到的vw包提供了一些分布式功能,在这种情况下可能是更好的解决方案。

磨练你的技术

与生活中的许多事情一样,只有实践才能让你成为本书所介绍主题方面的专家。对于不同

的任务和不同的数据集,特征提取、预处理、可视化和模型构建可能差异很大。你或许足

够幸运,已经能够访问大量数据集和任务。如果你还没有想到什么任务,那么一个好的起

点是机器学习竞赛,它会发布一个数据集和一个给定任务,许多团队为得到最佳预测结果

而展开竞争。许多公司、非盈利组织和大学都会举办这种比赛。要想找到这些比赛,最常

去的地方之一是Kaggle(https://www.kaggle.com/),这是一个定期举办数据科学比赛的网

站,其中一些比赛会提供大量奖金。

Kaggle论坛也是关于机器学习最新工具和技巧的很好的信息来源,在网站上可以找到大量

数据集。在OpenML平台(http://www.openml.org/)上可以找到更多的数据集及相关任务,

该平台拥有20 000多个数据集,以及50 000多个相关的机器学习任务。处理这些数据集

可以提供练习机器学习技能的好机会。比赛的一个缺点是,提供了特定的指标来优化,通

常还提供了一个固定的、已经预处理过的数据集。请记住,定义问题和收集数据也是现实

世界问题的重要方面,用正确的方式表示问题可能比努力提高分类器精度的最后一个百分

点要重要得多。

总结

我们希望已经让你相信了机器学习在大量应用中的实用性,以及在实践中实现机器学习的

简单性。继续挖掘数据,同时不要忽视大局。

python自学教程读书导图-python机器学习基础教程读书笔记八(全书总结)相关推荐

  1. python分类器鸢尾花怎么写_python机器学习基础教程-鸢尾花分类

    一: 环境准备: 1.导入的库: importnumpy as npimportmatplotlib.pyplot as pltimportpandas as pdimport mglearn 2.导 ...

  2. Python机器学习基础教程-第2章-监督学习之K近邻

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  3. python机器学习基础教程-学习笔记(一)

    了解 scikit-learn 及其用法是很重要的,但还有其他一些库也可以改善你的编程体验. scikit-learn 是基于 NumPy 和 SciPy 科学计算库的.此外,我们还会用到 panda ...

  4. Python机器学习基础教程——鸢尾花分类

    Python机器学习基础教程--鸢尾花分类 初识数据 训练数据与测试数据 观察数据-数据可视化 模型的建立与评估--K近邻算法 她还有一些鸢尾花的测量数据,这些花之前已经被植物学专家鉴定为属于 set ...

  5. 回归素材(part4)--python机器学习基础教程

    学习笔记,仅供参考 文章目录 python机器学习基础教程 线性模型 用于回归的线性模型 过拟合 岭回归 lasso python机器学习基础教程 线性模型 用于回归的线性模型 过拟合

  6. 泛化,过拟合,欠拟合素材(part1)--python机器学习基础教程

    学习笔记,仅供参考,有错必纠 文章目录 python机器学习基础教程 泛化.过拟合.欠拟合 模型复杂度与训练集大小的关系 python机器学习基础教程 泛化.过拟合.欠拟合 判断一个算法在新数据上表现 ...

  7. python基础教程免费下载-《Python机器学习基础教程》高清版免费PDF下载

    Python机器学习基础教程-[德] 安德里亚斯·穆勒(Andreas C.Müller)[美]莎拉·吉多(Sarah Guido) 著,张亮(hysic) 译 下载地址1:网盘下载 下载地址2:网盘 ...

  8. Python机器学习基础教程(1)Irises(鸢尾花)分类之新手上路

    一.感谢博客的内容提供的参考 标题:最新版学习笔记---Python机器学习基础教程(1)Irises(鸢尾花)分类---附完整代码 作者:非鱼子焉 地址:https://zhu-rui.blog.c ...

  9. 只要5分钟,学会制作精美的思维导图(xmind入门教程)

    只要5分钟,学会制作精美的思维导图(xmind入门教程) 你是否也有做笔记的习惯? 特别是听课程的时候,不自觉的要拿起小本本记下内容要点. 图片|来源于表情包 可人的记忆是有限的,偏偏忘性还特别大,有 ...

最新文章

  1. css html span 块状不换行
  2. extern “C“
  3. 【一个好的总经理必做的四件事】
  4. 区块链教程Fabric1.0源代码分析Tx(Transaction 交易)二
  5. 深度学习数据集+模型说明
  6. struts 2 拦截器
  7. (chap6 Http首部) 请求首部字段 RefererTE User-Agent
  8. python模块版本管理工具_【转】Python包管理工具
  9. 回调函数例子_Linux C - C基础篇八(函数)
  10. 黑客雇佣组织开发出新型的Windows 隐秘后门
  11. 7-5 删除字符串中的子串 (20 分)
  12. Redis 持久化 RDB 详解
  13. gini系数 决策树_决策树原理,机器学习系列
  14. 阿里马涛:重新定义云时代的开源操作系统
  15. 一文搞懂机器学习准确率(Accuracy)、精确率(Pecision)、召回率(Recall)以及TP、FP、TN、FN
  16. jpg、png、jpeg区别与压缩等知识总结 —— 性能优化篇
  17. 基于微信小程序社区疫情防控系统
  18. 旅游流的概念_国内旅游流综述
  19. HMS Core 5,面试必问知识点
  20. 关于wlw(windows live writer):“无法连接到您的日志服务:服务器响应无效”的解决方案

热门文章

  1. 总结20121016
  2. 【摘录】Ics4.0如何去除系统的状态栏
  3. 设计模式--Builder生成器模式
  4. WPF Geometry 添加Path数据
  5. 06.系统编程-2.线程
  6. vue配置vue-router
  7. [转]thinkphp 模板显示display和assign的用法
  8. jquery的实时触发事件(textarea实时获取中文个数)
  9. 最优二叉树(哈夫曼树)知识点
  10. Hibernate:不容易理解的 lock 和 merge