深度学习精要(基于R语言)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-21 01:10:38

点击下载

作者:[美] Joshua F. Wiley 威利

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

深度学习精要(基于R语言)

深度学习精要(基于R语言)试读:

前言

本书主要介绍如何在R编程语言和环境当中训练并使用深度学习模型或深度神经网络。本书无意于提供有关深度神经网络的深入的理论覆盖,但它将给你足够的理论背景,帮助你理解深度神经网络的基础、应用以及结果的解释。本书还将提供一些包和函数,用来训练深度神经网络,优化它们的超参数来提升模型的准确度、生成预测或者建立模型的其他应用。为了着手处理现实生活中的例子和应用,本书将提供关于深度学习要领的易于阅读的全面介绍。本书的内容

第1章“深度学习入门”,展示如何创建R和H2O包并安装在计算机或服务器上,内容涉及所有和深度学习有关的基本概念。

第2章“训练预测模型”,涉及如何训练一个浅层无监督的神经网络预测模型。

第3章“防止过拟合”,解释了可用于防止模型过拟合数据的不同方法,为了提升泛化能力,叫作无监督数据上的正则化。

第4章“识别异常数据”,涉及识别异常数据,比如欺诈活动或者离群点,和如何执行无监督深度学习。

第5章“训练深度预测模型”,展示了如何训练深度神经网络来解决预测或分类问题,比如图像识别。

第6章“调节和优化模型”,解释了如何调整模型的调节参数来提升并优化深度学习模型的准确度和性能。

附录即文献包含了本书所有引用的参考书目。预备知识

使用这本书,你不需要掌握太多的知识。你所需要的软件的主要部分是R,它是开源的,可以在Windows、Mac OS和多种Linux上运行。你还需要最新版本的Java。当你安装好了R和Java,你还需要安装一些R包,所有这些R包都可以在主流的操作系统上工作。

或许,更具有挑战性的要求是,对于真正的深度学习应用,哪怕是探索非常小的例子,都要求有现代的硬件。在本书中,笔者主要使用的台式机,配置为2.50 GHz的Intel Xeon E5-2670 v2(10个物理核,20个逻辑核),32GB的内存和三星850 PRO 512GB SSD。你不一定需要一个相同的系统,但是笔者发现在16GB内存、双核i7处理器的笔记本电脑上运行某些例子是很耗费时间的。目标读者

本书适合那些有追求的数据科学家,他们熟知机器学习概念和R,并且正在使用R提供的包来探索深度学习范式。你最好对R语言有一个基本的理解而且对统计算法和机器学习技术运用自如,但你并不需要精通深度学习的概念。排版约定

在本书中,你会发现许多文本样式,它们区分了不同类型的信息。这里是一些有关这些样式的例子,解释了它们的含义。

文本中的代码、数据库表名称、文件夹名称、文件名称、文件扩展名、路径名称、虚拟URLs、用户输入以及推特用户定位显示如下所示。“当然,我们无法真正使用library()函数,除非我们安装了这些包。”

代码块的设置如下所示。## uncomment to install the checkpoint package## install.packages("checkpoint")library(checkpoint)checkpoint("2016-02-20", R.version = "3.2.3")

当我们希望把你的注意力吸引到代码块的一个特别部分的时候,我们会将有关的行或项目设置成粗体,如下所示。performance.outsample[,-4] Size Maxit Shuffle Accuracy AccuracyLower AccuracyUpper1 40 60 FALSE 0.93 0.92 0.942 20 100 FALSE 0.92 0.91 0.933 20 100 TRUE 0.92 0.91 0.934 50 100 FALSE 0.91 0.90 0.925 50 100 FALSE 0.92 0.91 0.93

命令行的输入和输出形式如下所示。h2oiris <- as.h2o( droplevels(iris[1:100, ]))

新术语或者重要的词汇用粗体显示。 警告或者重要的注释会出现在类似这样的方框中。

  提示或技巧会类似这样出现。读者反馈

我们始终欢迎来自读者的反馈,请让我们知道你对这本书的看法——喜欢哪些内容,不喜欢哪些内容。读者的反馈对我们来说十分重要,这样我们才能出版读者最需要的书。

常规的反馈请通过电子邮件发送到feedback@packtpub.com,在邮件中请注明书名。

如果你是某方面的专家,有兴趣写书,或者为某一本书投稿,请阅读我们的作者指南,地址是www.packtpub.com/authors。客户支持

现在你已经是一本Packt图书的光荣的拥有者,为了让你的付出得到最大的回报,我们还将为你提供其他方面的服务。下载示例代码

你可以登录http://www.packtpub.com的账户,下载本书的示例代码文件。如果你是从其他地方购买的本书,可以访问http://www.packtpub.com/support,注册之后,我们会为你发送一封附有文件的电子邮件。

你可以根据下面的步骤下载代码文件:(1)使用你的电子邮件地址和密码在我们的网站登录或者注册;(2)将鼠标指针悬停在顶部的SUPPORT选项卡上;(3)单击Code Downloads & Errata;(4)在搜索框中输入该书的名称;(5)选择你要找的书来下载代码文件;(6)在下拉菜单中选择你从何处购买了这本书;(7)单击Code Download(代码下载)。

如果下载了文件,请你确保使用下列软件的最新版本来解压缩或者提取文件夹。● Windows:WinRAR / 7-Zip● Mac:Zipeg / iZip / UnRarX● Linux:7-Zip / PeaZip下载本书的彩色图像

我们还为你提供了本书中所用的屏幕截图/示意图彩色图像的PDF文件。彩色图像能更好地帮助你理解输出中的变化。你可以从https://www.packtpub.com/ sites/default/files/downloads/RDeepLearningEssentials_ColorImages.pdf.下载这些文件。勘误

尽管我们会尽全力确保书中内容的准确性,但是错误仍然在所难免。如果你在我们的某本书中发现了错误——文字错误或者代码错误,而且愿意为我们报告这些错误,我们将感激不尽。这样不仅可以消除其他读者的挫败感,而且能帮助我们改进这本书的后续版本。如果你发现了任何的错误,可以访问http://www.packtpub.com/ submit-errata来提交,选择你的书,单击Errata Submission Form(勘误表提交表单),输入勘误详情。勘误通过验证之后,你提交的内容会被接受而且勘误会上传到我们的网站,或者添加到这本书勘误部分现有的勘误列表中。

如果你想查看之前提交的勘误,请访问https://www.packtpub.com/books/ content/support,在搜索栏中输入书名,所查询的信息会出现在勘误部分。盗版举报

对所有的媒体来说,在互联网上剽窃版权材料都是一个棘手的问题。Packt很重视保护我们的版权和许可。如果你在互联网上发现我们产品的任何形式的非法复制品,请立即告知我们的网址和网站名称,这样我们可以采取补救措施。

如果你发现可疑的盗版材料,请通过copyright@packtpub.com联系我们。

你的举报有助于保护作者的权益以及我们为你提供有价值内容的能力,我们对此深表感谢。问题解答

如果你对本书的任何方面有疑问,可以通过questions@packtpub.com联系我们,我们会尽力解决问题。第1章深度学习入门

本章讨论深度学习,这是一种强大的多层架构,可以用于模式识别、信号检测以及分类或预测等多个领域。深度学习并不新鲜,但在过去十年它获得了极高的关注,这部分归功于计算能力的不断发展和训练模型不断涌现出更有效的新方法,也源于可使用的数据量不断增加。在本章中,我们将学习深度学习是什么,训练这种模型有哪些R包,如何建立分析系统以及如何连接R和H2O。在随后的章节,我们会将H2O用于许多案例,这些案例探讨如何真正训练和使用一个深度学习模型。

本章包括以下内容。● 什么是深度学习?● 使用R包来训练深度学习模型,如深度信念网络或深度神经网络。● 连接R和H2O,深度学习使用H2O。1.1 什么是深度学习

为了理解深度学习是什么,最简单的方式也许是首先理解常规机器学习是什么。一般来说,机器学习主要用于开发和使用那些从原始数据中学习、总结出来的用于进行预测的算法。预测是个非常笼统的术语。例如,机器学习中的预测可以包括预测某位消费者将会在一家给定的公司花费是多少,或者预测一笔特殊的信用卡消费中是否存在欺诈。预测也包括更一般的模式识别,如给定的图片显示了什么字母,或者这张照片中是否有马、狗、人、脸、建筑等。深度学习是机器学习的一个分支,其中的深度(多层)架构用于映射输入或观测特征与输出之间的联系。这种深度架构使得深度学习特别适合处理含有大量变量的问题,同时可以把深度学习生成的特征当作学习算法整体的一部分,而不是把特征生成当作一个单独步骤。现已证明,深度学习在图像识别(包括笔迹以及图片或者物体的识别)和自然语言处理(如语音识别)领域非常有效。

现在已有许多类型的机器学习算法。在本书中,我们主要讨论神经网络,因为它在深度学习中非常流行。但是,这种侧重并不意味着这就是用于机器学习甚至深度学习的唯一技术,也不是说其他的技术没有价值或者不适合,技术的选择取决于具体的任务。我们将在1.2节从概念上更深入地讨论神经网络和深度神经网络是什么。1.2 神经网络的概念综述

神经网络正如其名所示,命名的灵感源于身体中的神经过程和神经元。神经网络包括一系列的神经元,或者叫作节点,它们彼此连结并处理输入。神经元之间的连结经过加权处理,权重取决于从数据中学习、总结出的使用函数。一组神经元的激活和权重(从数据中自适应地学习)可以提供给其他的神经元,其中一些最终神经元的激活就是预测。

为了将这个过程刻画得更具体,我们借助于一个来自人类视觉感知的例子来加强理解。祖母细胞这个术语用于指这样一个概念,在大脑的某个地方有一个细胞或者神经元,它专门只对某个复杂的特定对象有反应,如我们的祖母。这种特性需要数千个细胞来代表我们遇到的每个独特实体或对象。相反的观点是,人们通过汇集更多的基本片断来建立复杂的表达方式从而形成了视觉感知。图1-1是一张正方形的图片。图1-1

我们的视觉系统中有神经元而没有细胞,只要看到完整的正方形,神经元就会激活。我们的细胞可以识别图1-2所示的水平线和垂直线。图1-2

在这种假设情况中,有两个神经元,其中一个一旦感知到水平线就会被激活,另一个一旦感知到垂直线就会被激活。最后,一旦两个低阶的神经元同时激活,一个更高级的过程就会识别出它是一个正方形。

神经网络共享了一些相同的概念,输入经过第一层神经元的处理成为可以到达其他层的神经元。神经网络有时可以表示为图模型。如图1-3所示,输入是表示为方形的数据。它们可能是图像中的像素,或者是声音的不同方面,或者是其他的东西。接下来的一层隐藏神经元由诸如水平线、垂直线或者曲线这些基本特征的神经元组成。最后,输出是这样一个神经元,它通过同时激活两个隐藏的神经元而激活自身。在本书中,已观测的数据或特征为方形,而未观测的或隐藏层为圆形。图1-3

神经网络用来指示一类广泛的模型和算法。类似于其他统计技术的一个基础扩展,神经网络基于一些观测数据的集合生成隐藏的神经元。但是,创建隐藏神经元的权重是从数据中学习得到的,而非通过扩展形式的选择而得到。神经网络可以包含多种激活函数,它们是加权原始数据输入的变换,用以创建隐藏神经元。经常选择的激活函数是sigmoid函数:以及双曲正切函数f(x)=tanh(x)。最后,因为径向基函数是有效的函数逼近,所以有时也会用到它们。尽管径向基函数种类很多,但高斯形式很常用:。

在一个类似于如图1-3所示的浅层神经网络中,只有一个隐藏层,从隐藏单元到输出,在本质上是一个标准的回归或分类问题。隐藏单元可以表示为h,输出可以表示为Y。不同的输出可以通过角标i=1,...,k来表示,代表不同的可能分类,例如(在我们的例子里)圆形或者方形。权重是从每个隐藏单元到每个输出的路径,对第i个的输出通过(w_i)表示。如创建隐藏层的权重,这些权重也是从数据中学习得到的。分类会经常使用一种最终变换,softmax函数,即,这确保了估计为正(使用指数函数),并且任何给出类的概率和为1。线性回归经常使用恒等(identity)函数,它返回输入值。关于为什么每个隐藏单元和输出之间存在路径,而每个输入和隐藏单元之间也存在路径,这很可能引起混乱。这通常用来表示允许任何先验关系存在。权重必须从数据中学习得到,权重为零或接近零基本上等同于放弃不必要的关系。

这里我们只介绍了神经网络概念与实践方面的初级内容。如果想要更深入地了解神经网络,我们可以参见Hastie, T., Tibshirani, R., and Friedman, J. (2009)的第11章(在http://statweb.stanford.edu/~tibs/ElemStatLearn/ 有它的免费版本)、Murphy, K. P. (2012)的第6章和Bishop, C. M.(2006)的第5章。下面,我们简要介绍深度神经网络。1.3 深度神经网络

可能最简单的深度神经网络(deep neural network,DNN)的定义是,这是一种有多个隐藏层的神经网络,虽然这个定义的信息量并不是最大的。这种深度架构是神经网络的一种相对简单的概念扩展,它有效地推进了模型的能力和训练模型的新挑战。

多个隐藏层的使用允许模型实现由简到繁的更复杂的建立机制。在讨论神经网络时,我们考虑输出的是圆形还是方形。在深度神经网络中,多个圆形或方形可以组合形成其他更高级的形状。我们可以考虑模型架构的复杂性的两个方面。一个方面是它的宽窄如何——即给定的一层中有多少个神经元。第二个方面是它的深度如何,或者说神经元有多少层。对于确实具有这种深度架构的数据来说,相比于神经网络,深度神经网络可以使用更少的参数获得更精确的拟合结果,因为层数(每一层有较少的神经元)越多,意味着表现越有效而且越精确。比如,较浅的神经网络与深度神经网络相比,必须表示出每个独特的对象才能达到相等的精度,但它无法将基本部分整合出更高级的形状。再次考虑图像中的模式识别,如果我们想使用文本识别训练模型,原始数据可能是来自图像中的像素。我们可以训练第一层神经元来捕捉字母表中不同的字母,而另一层可以识别单词的字母集合。这样做优点是第二层无需直接从充满噪音的复杂像素中学习。相反,一个较浅的架构则可能需要多得多的参数,因为每个隐藏的神经元都需要具备从图像中的像素映射到复杂单词的能力,而许多单词都可能重叠,因此会造成模型中的冗余。

训练深度神经网络的挑战之一是如何通过有效学习得出权重。这些模型通常比较复杂,而且容易陷入局部最优化,因此最优化问题成为一种巨大挑战。2006年出现了一个重大进展,它表明深度信念网络(Deep Belief Networks ,DBNs)可以一次训练一层[参见Hinton, G. E., Osindero, S., and Teh, Y. W.(2006)]。DBN是深度神经网络的一个类型,它含有多个隐藏层,层与层之间(而不是在内部)有连结(就是说,第一层的一个神经元可以和第二层的一个神经元连结,但不能和第一层的其他神经元连结)。这个定义在本质上与受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)相同,除了RBM通常具有一个输入层和一个隐藏层,受限玻尔兹曼机如图1-4所示。图1-4

在一层之内没有连接的限制很有价值,因为它允许使用更快的训练算法,比如对比散度(contrastive divergence)算法。多个RBM叠加在一起,就能形成一个DBN。本质上来说,DBN可以被训练为一系列RBMs。第一个RBM层训练出来向隐藏神经元转换原始数据,再在第二个RBM层中作为新的输入进行训练,这个过程一直重复直到所有层都经过训练。

这种实现的好处是DBNs可以一次只训练一层,还不仅限于DBNs。DBNs有时也用于深度学习网络的预处理阶段。它允许使用相对快速的逐层贪婪训练提供良好的初始估计,再在深度神经网络中使用其他较慢的训练进行改进,比如反向传播方法。

到目前为止,我们主要关注前馈神经网络,其中一层神经元的结果向前传递到下一层。在结束本节之前,我们需要注意两种日益流行的深度神经网络类型。第一种是循环神经网络(Recurrent Neural Network,RNN),它的神经元彼此间发送反馈信号。这种反馈循环使得RNN在序列上表现良好。一个最近的RNN应用例子是自动生成钓鱼点击,例如“发廊故意隐藏的大秘密”或者“造访拉斯维加斯的十大理由:第六个一定震撼你!”。RNN十分擅长处理工作,因为RNN可以从一些单词的巨大初始池中取样(甚至只是趋势性的搜索术语或者名称),再预测生成下一个单词的内容。这个过程会重复若干次,直至生成一个简短叙述——钓鱼点击。这个例子来自Lars Eidnes的一篇博客(http://larseidnes.com/2015/10/13/ auto-generating-clickbait-with-recurrentneural-networks/)。第二种类型是卷积神经网络(Convolutional Neural Network,CNN)。CNN最常用于图像识别。它的工作原理是每个神经元都对图像的重叠部分作出响应。这种类型的优点是它们要求的预处理相对最小,但权重共享(比如说,穿过图像的重叠区域)仍然不需要太多的参数。图像常常并不一致,因此CNN对图像特别有价值。例如,10个人拍摄同一张桌子的照片,有些人比较近,有些人比较远,有些人刚好在桌子旁边,位置差异导致了本质相同的图像在高度、宽度以及围绕焦点对象拍摄的照片数量的差异。

对神经网络来说,上述叙述只是规定了什么是神经网络以及一些相关应用案例的最简短的概述。概述我们可以参见Schmidhuber, J.(2015)以及Murphy,K. P.(2012)的第28章。1.4 用于深度学习的R包

尽管R有大量用于机器学习的包,但用于神经网络和深度学习的包相对较少。在本节中,我们将讨论如何安装和设置所有需要的R包,以便使用神经网络和深度学习。

就使用R做数据分析来说,一个好的综合开发环境(integrated development environment,IDE)很有帮助。我们选择使用Emacs,它与Emacs Speaks Statistics(ESS)相结合是一种强大的文本编辑器,有助于Emacs与R结合在一起很好地工作。方便的启动和运行方式是使用一种特定的Emacs修正发行版本,这个版本专门用来结合R一起工作和用于统计,而且效果很好。它由Vincent Goulet创建并维护,可以在 http://vgoulet.act.ulaval.ca/en/emacs/中免费获取。另一种流行的R的IDE是Rstudio(https://www.rstudio.com/)。Emacs和Rstudio的一个共同优点是它们在所有主要的平台上(Windows、Mac和Linux)都可用,因此即使我们更换电脑,IDE经验仍然可以使用。1.5 建立可重复的结果

数据科学软件正处于高速发展的阶段。尽管这对技术进步来说相当美妙,但对需要重复别人结果的人来说则构成了挑战。即使是我们自己的代码,几个月后再使用时也有可能无法工作。解决这个问题有一种方法,就是记录使用的软件版本并确保其快照可用。本书会使用Revolution Analytics公司提供的R包checkpoint,它先连接上它们公司的服务器再运行,服务器提供了R综合档案网络(Comprehensive R Archive Network,CRAN)的每日快照(checkpoints)。想要了解这个过程的更多内容,我们可以在https://cran.r-project.org/web/packages/ checkpoint/vignettes/checkpoint.html阅读此包的在线小文章(vignette)。

本书使用了绰号为“木质圣诞树”(Wooden Christmas-Tree)的R3.2.3版本,操作系统为Windows 10 Professional x64。这个版本在本书写作期间是最新的。随着更新版本的发布,CRAN会以二元形式(将来在https://cran.r-project.org/bin/ windows/base/old/)和源打包文件的形式(https://cran.r-project.org/ src/base/R-3/)保留旧版本的备份,用于在任何操作系统上编译源文件。

H2O是使用深度学习的主要R包之一,我们需要安装Java。本书使用了64位的Java SE Development Kit 8 update 66。我们可以从http://www.oracle.com/ technetwork/java/javase/下载适合自己的操作系统的Java。

完成这些步骤后,我们就准备开始。为了使用checkpoint包,我们需要把用于同一个项目的R脚本放入同一个文件夹。安装使用checkpoint包的过程有些迂回。通过检查对library()和 require()函数的调用,checkpoint包的工作是扫描项目目录中的R脚本来看看载入了什么R包(因此它需要安装)。当然,除非这些包已经安装,我们实际不能使用library()函数。

我们在项目目录下创建一个R脚本checkpoint.R,使用代码如下所示。## uncomment to install the checkpoint package## install.packages("checkpoint")library(checkpoint)checkpoint("2016-02-20", R.version = "3.2.3")

一旦创建了R脚本,就可以取消注释并且运行代码来安装checkpoint包。这样我们只需要做一次,因此完成时最好再给代码添上注释,这样它不会在我们每次运行文件时都重新安装。而我们需要对深度学习项目创建R环境,这是我们每次都会运行的文件。本书的检查点是2016年2月20日,我们使用的R版本是3.2.3。接下来,我们加入library()调用一些需要的包,这些可以通过在checkpoint.R脚本中加入如下所示代码得到(但要注意,这些还没有运行!)。## Chapter 1 #### Toolslibrary(RCurl)library(jsonlite)library(caret)library(e1071)## basic stats packageslibrary(statmod)library(MASS) 提示: 下载示例代码我们可以直接从http://www.packtpub.com 下载所有已购买的Packt图书的示例代码文件。如果是从其他地方购买了本书,我们可以访问http://www.packtpub.com/support并注册,会通过电子邮件把文件发送给我们。下载代码文件的步骤如下:(1)登录网站;(2)把鼠标按键悬停在顶部的SUPPORT标签上;(3)单击“Code Downloads & Errata”;(4)在搜索框输入书名;(5)选择你想要下载代码文件的图书;(6)在下拉菜单选择我们从何处购买了本书;(7)单击“Code Download”。文件下载后,确保我们使用以下软件的最新版本解压或提取文件夹:● 对于Windows是WinRAR / 7-Zip;● 对于Mac是Zipeg / iZip / UnRarX;● 对于Linux是7-Zip / PeaZip。

一旦加入代码、保存文件,任何改变都会写入磁盘,接下来我们运行前两行代码来载入checkpoint包并调用checkpoint(),结果如图1-5所示。图1-5

checkpoint包需要创建一个路径来存储使用包的具体版本,接着找到所有的包并安装。接下来展示如何准备用于深度学习的一些特定R包。1.5.1 神经网络

在R中,有几个包可以拟合基本的神经网络。nnet包值得推荐,可以拟合有一个隐藏层的前馈神经网络,如图1-3所示。如果需要nnet包更多的细节,我们可以参见Venables, W. N. and Ripley, B. D.(2002)。neuralnet包也可以拟合有一个隐藏层的浅层神经网络,但它可以使用后向传播算法训练它们并允许自定义误差和神经元激活函数。最后,我们来讨论RSNNS包,它是斯图加特神经网络仿真器(Stuttgart Neural Network Simulator,SNNS)的一个R封装。最初,SNNS用C编写,但后来移植到了C++上。RSNNS允许很多类型的模型在R中拟合。常见的模型使用方便的封装就可以训练,提供了常见的模型。但是RSNN包基于SNN的内容提供了许多模型的组成部分,因此它可以训练类型广泛的模型。如果需要RSNNS包更多的细节,我们可以参见Bergmeir, C.和Benítez, J. M.(2012)。在本书第2章中,我们将看到使用这些模型的例子。现在,我们可以将下列代码添加并保存到checkpoint.R脚本中,然后安装这些包。保存非常重要!因为如果R脚本的改变没有写到磁盘上,那么checkpoint()函数就不会有改变,也找不到新包,更安装不了。## neural networkslibrary(nnet)library(neuralnet)library(RSNNS)

现在,如果我们重运行checkpoint()并成功,R会告诉我们它发现了8个包,而且它安装了nnet、neuralnet、RSNNS以及RSNNS必需的Rcpp包。1.5.2 deepnet包

deepnet包为R中的深度学习提供了许多工具。特别是它可以训练RBM并使用这些RBM作为DBN的一部分来生成初始值,进而训练深度神经网络。deepnet包也接受不同的激活函数,同时使用丢弃来正则化。为了安装这个包,我们遵从之前使用的相同过程,为checkpoint.R添加代码,保存,再重新运行checkpoint()函数。## deep learninglibrary(deepnet)1.5.3 darch包

darch包基于George Hinton开发的Matlab代码,它代表深度学习架构。它可以联合彼此相关的大量选项,来训练RBM和DBM。darch包有一个缺陷,因为它是一种纯粹的R实现,所以模型训练往往很慢。为了安装这个包,我们遵从之前使用的相同过程,为checkpoint.R添加代码,保存,再重新运行checkpoint()函数。## deep learninglibrary(darch)1.5.4 H2O包

H2O包提供了一个到H2O软件的接口。H2O用Java编写,又快又可扩展。它不仅提供深度学习的功能,还提供许多其他流行的机器学习的算法和模型,另外,模型结果可以存储为纯粹的Java代码,可以进行快速评分、推进部署模型,从而解决真实世界的问题。为了安装这个包,我们遵从之前使用的相同过程,为checkpoint.R添加代码,保存,再重新运行checkpoint()函数。## deep learninglibrary(h2o)1.6 连接R和H2O

因为H2O是一个基于Java的R封装软件,为了与R连接,我们必须初始化一个H2O实例并把它和R连结起来,把数据和模型命令连结或传递给这个实例。在本节,我们将展示如何准备好去训练使用H2O的模型。1.6.1 初始化H2O

为了初始化一个H2O集群,我们使用h2o.init()函数。集群的初始化也将建立一个轻量级的Web服务器,它可以通过本地网页与软件进行交互。h2o.init()函数通常都有合理的缺省值,但我们可以自定义它的许多方面,尤其好的是,自定义使用的核/线程的个数以及我们为它配置的内存大小,都可以在下列使用了max_mem_size和nthreads参数的代码中完成。在下面的代码中,我们使用两个线程和多达3G的内存来初始化H2O集群。代码运行之后,R将给出日志文件的位置、Java版本以及集群的细节。cl <- h2o.init( max_mem_size = "3G", nthreads = 2)H2O is not running yet, starting it now...Note: In case of errors look at the following log files: C:\Users\jwile\AppData\Local\Temp\RtmpuelhZm/h2o_jwile_started_from_r.out C:\Users\jwile\AppData\Local\Temp\RtmpuelhZm/h2o_jwile_started_from_r.errjava version "1.8.0_66"Java(TM) SE Runtime Environment (build 1.8.0_66-b18)Java HotSpot(TM) 64-Bit Server VM (build 25.66-b18, mixed mode).Successfully connected to http://127.0.0.1:54321/R is connected to the H2O cluster: H2O cluster uptime: 1 seconds 735 milliseconds H2O cluster version: 3.6.0.8 H2O cluster name: H2O_started_from_R_jwile_ndx127 H2O cluster total nodes: 1 H2O cluster total memory: 2.67 GB H2O cluster total cores: 4 H2O cluster allowed cores: 2 H2O cluster healthy: TRUE

一旦这个集群完成初始化,我们可以使用R或本地主机(127.0.0.1:54321)提供的Web接口与它连接,如图1-6所示。图1-61.6.2 数据集连结到H2O集群

这里有几种方法可以将数据载入H2O集群。如果数据集已经下载到R,我们只需要使用下面代码所示的as.h2o()函数。h2oiris <- as.h2o( droplevels(iris[1:100, ]))

我们可以通过键入R对象h2oiris来确认结果,这个对象只是一个包含了引用H2O数据的对象。当我们尝试打印它时,R API会查询H2O。h2oiris

这里会返回如下输出。 Sepal.Length Sepal.Width Petal.Length Petal.Width Species1 5.1 3.5 1.4 0.2 setosa2 4.9 3.0 1.4 0.2 setosa3 4.7 3.2 1.3 0.2 setosa4 4.6 3.1 1.5 0.2 setosa5 5.0 3.6 1.4 0.2 setosa6 5.4 3.9 1.7 0.4 setosa[100 rows x 5 columns]

我们也能检查因子变量的水平,比如Species变量,代码如下所示。h2o.levels(h2oiris, 5)[1] setosa versicolor

在真实世界的应用中,数据很可能已经在某处存在。与其把数据载入R,不如导入H2O(在R中对数据再创建一份不必要的副本代价昂贵),我们可以直接把数据载入H2O。首先,我们基于内置的mtcars数据集创建一个CSV文件,然后通知H2O实例使用R读数据,接着再次打印,数据显示如下所示。write.csv(mtcars, file = "mtcars.csv")h2omtcars <- h2o.importFile( path = "mtcars.csv")h2omtcars C1 mpg cyl disp hp drat wt qsec vs am gear carb1 Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 42 azda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 43 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 14 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 15 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 26 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1[32 rows x 12 columns]

最后,数据不必载入本地硬盘。在最后一个例子里,我们也能请求H2O从显示的URL读入数据。这个例子使用了UCLA统计咨询集团提供的数据集。h2obin <- h2o.importFile( path = "http://www.ats.ucla.edu/stat/data/binary.csv")h2obin admit gre gpa rank1 0 380 3.61 32 1 660 3.67 33 1 800 4.00 14 1 640 3.19 45 0 520 2.93 46 1 760 3.00 2[400 rows x 4 columns]1.7 小结

本章简要介绍了神经网络和深度神经网络。深度神经网络使用了多个隐藏层,通过提供强大的无监督学习和特征提取部分,已成为机器学习中的一场革命,其中的特征提取部分可以独立使用,也可以作为有监督学习的集成部分。

这些模型有许多应用,而且还越来越多地在包括谷歌、微软和脸书这种大公司得到使用。深度学习的应用例子有图像识别(例如自动标注面孔,或者识别图像的关键词)、语音识别、文本翻译(例如从英语到西班牙语,反之亦然)。它甚至可以在文本识别上发挥作用,比如情感分析,它可以判断一个句子或一个段落大致上是正面的还是负面的,这对于评价一项产品或服务的看法很有用。设想我们可以获取与我们产品相关的任何评论和社交媒体,与一个月或者一年之前的情形对比分析,正面的讨论变得更多还是更少。

本章还展示了如何设置R以及需要安装的软件和包,本书采用的可重复方式匹配本书使用的版本。

在第2章中,我们开始训练神经网络并自己生成预测。第2章训练预测模型

本章通过实践例子来展示如何在R中建立并训练基本的神经网络。这些例子也强调了评价模型不同的调节参数的重要性从而找到最佳的参数集合。尽管评价多种调节参数有助于模型的性能提升,但是它也会引起过拟合的问题,这是本章讨论的第二个主题。本章结尾使用了数据分类的例子,活动数据来自于行走、上下楼梯、坐下、站立或躺倒时的智能手机。

本章包括下列主题。● R中的神经网络● 过拟合数据的问题—结果解释● 建立案例并运用神经网络方法2.1 R中的神经网络

为了在R中训练基本(即隐藏层数目为单个的“浅层的”)神经网络,我们将使用nnet包和RSNNS包[Bergmeir, C.和Benítez, J. M.(2012)]。在第1章,这些包已经安装并通过了2016年2月20日的检查点,因此我们的结果完全可重复。尽管可以与nnet包直接连接,我们还是通过caret包来使用它。caret是“Classification and Regression Training”(分类与回归训练)的缩写。caret包提供了标准化的接口与R中许多机器学习模型协作(Kuhn,2008;Kuhn和Johnson,2013),而且对验证和性能评估提供了许多有用的特征,我们会在本章和第3章中使用这些应用。

我们建立神经网络的第一个例子,这里使用了一个经典的分类问题—基于图片识别手写体数字。数据可以从https://www.kaggle.com/c/digit-recognizer下载,格式是易于使用的CSV格式,其中数据集的每一列(即特征),表示图像的一个像素。每张图像都经过标准化处理,转化成同样的大小,所以所有图像的像素个数都相同。第一列包含真实的数据标签,其余各列是黑暗像素的值,它用于分类。下载文件的名称分别为train.csv和test.csv,和R脚本存放在同一个文件夹中,因此很容易读取。如果它们放入不同的文件夹,我们只需要相应改变路径。2.1.1 建立神经网络

首先,我们先载入包,在我们需要载入的脚本中调用source()并对使用的版本设置检查点。然后,我们可以读取从Kaggle下载的数据并浏览它的样子。source("checkpoint.R")## output omitteddigits.train <- read.csv("train.csv")dim(digits.train)[1] 42000 785head(colnames(digits.train), 4)[1] "label" "pixel0" "pixel1" "pixel2"tail(colnames(digits.train), 4)[1] "pixel780" "pixel781" "pixel782" "pixel783"head(digits.train[, 1:4]) label pixel0 pixel1 pixel21 1 0 0 02 0 0 0 03 1 0 0 04 4 0 0 05 0 0 0 06 0 0 0 0

我们将标签(数字0~9)转换为因子,使R知道这是一个分类问题而不是回归问题。如果这个问题是真实的,那我们就尽量使用全部42 000个观测,但为了缩减运行时间,对这个例子我们只选择前5 000个观测来建立并训练神经网络。我们把数据分解成特征或预测子(digits.X)和输出(digits.Y),使用除标签之外所有的列作为这里的预测子。## convert to factordigits.train$label <- factor(digits.train$label, levels = 0:9)i <- 1:5000digits.X <- digits.train[i, -1]digits.y <- digits.train[i, 1]

最后,在开始建立神经网络之前,我们需要先迅速检查一下数字的分布,这一点很重要。例如,一个数字很少出现,但同时我们还很关心这个数字的精确预测,那我们需要调整建模方法,来做到即使它很少出现,在评估性能时也会赋予它足够的权重。下面的代码片段创建了一个条形图,显示了每个数字标签的频数,如图2-1所示。它们的分布相当均匀,因此我们不需要对任何特别的数字增加权重或重要性。barplot(table(digits.y))图2-1

现在,我们通过caret包的封装来使用nnet包建立和训练第一个神经网络。首先,我们使用set.seed()函数来指定特定的种子,使结果可以重复。精确的种子并不重要。重复相同的种子这种方法同样也运用于后面的例子,因为真正重要的是相同的模型使用相同的种子,而非不同的模型使用不同或相似的种子。train()函数首先取特征或预测子数据作为x参数,然后取输出变量作为y参数。train()可以处理许多模型,通过method参数来控制。虽然机器学习模型的许多方面都是自动学习的,但是某些参数还需要人为设置。它们随着使用方法而变。例如,在神经网络中,有一个参数是隐藏单元的个数。在需要尝试多种调节参数时,train()函数提供了一种容易的方法,将它作为一个指定的数据框传递给tuneGrid参数。对每个调节参数的集合,它都返回性能度量和最好的训练模型。我们的初始情况是,在模型中只有5个隐藏神经元以及一个适中的衰变率,有时它也称为“学习率”。学习率控制了每个迭代或步骤对当前权重的影响。另一个参数trControl控制了train()的其他部分,当评估多种调节参数时,用于通知caret包如何证实并挑选出最佳的调节参数。

对这个例子,我们把训练控制的方法设置为none,因为我们此时只使用了一组调节参数。最后,我们可以指定额外的命名参数,它们传递给真实的nnet()函数(或者无论指定的什么算法)。根据预测子的个数(784),我们把最大权重个数提高为10 000并指定最大迭代次数为100。因为数据数量相对较小而且缺乏隐藏的神经元,运行这个模型的时间不会很长。set.seed(1234)digits.m1 <- train(x = digits.X, y = digits.y, method = "nnet", tuneGrid = expand.grid( .size = c(5), .decay = 0.1), trControl = trainControl(method = "none"), MaxNWts = 10000, maxit = 100)

predict()函数生成了数据的一组预测。我们在不指定任何新数据的情形下调用模型结果,结果它只在训练的相同数据上生成了预测。在计算和存储预测数字之后,我们可以检查它们的分布,如图2-2所示。即使在看到第一个模型的性能度量之前考虑到它的真实分布(图2-1),很明显模型不是最优的。图2-2digits.yhat1 <- predict(digits.m1)barplot(table(digits.yhat1))

分布的图形检查仅仅是预测的一个简单检查。模型性能的更正式评价是使用caret包的confusionMatrix()函数。因为在RSNNS包中也有一个相同名称的函数,它们难以区分,所以我们使用专门的caret::代码来告诉R使用的函数是哪个版本。输入仅仅是真实数字和预测数字之间的频率交叉表,其余的性能指标基于这个表来计算。

我们有多个数字,因此对性能输出我们给出三个主要部分。首先,我们给出真实的频率交叉表格。正确的预测位于对角线上,错误分类的各个频率位于对角线之外。接下来是总体统计量,它们是指所有类的模型表现。准确度仅仅指正确分类的实例比例,有一个95%的置信区间,这个度量对较小的数据集特别有用,因为它的估计不确定性相当大。无信息率是指,不考虑任何信息而仅仅通过猜测来决定最频繁的类的准确度期望。在情形“1”中,它在11.16%的时间中发生。P值检验了观测准确度(44.3%)是否显著不同于无信息率(11.2%)。结果尽管在统计上是显著的,但对于数字分类来说并不是很有意义,我们本来期望会远远好于纯猜测的结果!最后,它对每个数字给出了个别的性能指标。这些指标都是基于数字对其他所有数字的比较而计算的,因此每个指标都是二元比较。表2-1包含了计算各种度量需要的所有信息,同时所有度量的公式也展示在这里。表2-1灵 敏 度特 异 度阳性预测值True positive(TP)False positive(FP)阴性预测值False negative(FN)True negative(TN)

比如,数字“0”的灵敏度可以解释为,78.5%的数字“0”被捕捉或者正确地预测为数字“0”。数字“0”的特异度可以解释为,95.2%的预测为非数字“0”的实例并不是数字“0”。检出率仅仅是真阳性的百分比,而最后的检出预防度(detection prevalence)是预测为阳性的实例比例,不管它们是否真的为阳性。平衡准确度(balanced accuracy)是灵敏度和特异度的平均值。其余各列展示了其余各个数字的同样信息。caret::confusionMatrix(xtabs(~digits.yhat1 + digits.y))Confusion Matrix and Statistics digits.ydigits.yhat1 0 1 2 3 4 5 6 7 8 9 0 388 2 40 41 7 75 23 4 23 2 1 0 495 3 0 0 3 0 4 3 4 2 0 0 0 0 0 0 0 0 0 0 3 51 30 36 379 6 329 3 18 290 38 4 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 6 44 5 304 9 131 29 484 9 16 19 7 11 26 162 51 333 33 6 470 145 415 8 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 1 0 0Overall Statistics Accuracy : 0.4432 95% CI : (0.4294, 0.4571) No Information Rate : 0.1116 P-Value [Acc > NIR] : < 2.2e-16 Kappa : 0.3805Mcnemar's Test P-Value : NAStatistics by Class: Class: 0 Class: 1 Class: 2 Class: 3 Class: 4Sensitivity 0.7854 0.8871 0.000 0.7896 0.0000Specificity 0.9518 0.9962 1.000 0.8228 1.0000Pos Pred Value 0.6413 0.9668 NaN 0.3212 NaNNeg Pred Value 0.9759 0.9860 0.891 0.9736 0.9046Prevalence 0.0988 0.1116 0.109 0.0960 0.0954Detection Rate 0.0776 0.0990 0.000 0.0758 0.0000Detection Prevalence 0.1210 0.1024 0.000 0.2360 0.0000Balanced Accuracy 0.8686 0.9416 0.500 0.8062 0.5000 Class: 5 Class: 6 Class: 7 Class: 8 Class: 9Sensitivity 0.0000 0.9380 0.9289 0.0000 0.0000Specificity 1.0000 0.8738 0.7370 1.0000 0.9998Pos Pred Value NaN 0.4610 0.2845 NaN 0.0000Neg Pred Value 0.9062 0.9919 0.9892 0.9046 0.9044Prevalence 0.0938 0.1032 0.1012 0.0954 0.0956Detection Rate 0.0000 0.0968 0.0940 0.0000 0.0000Detection Prevalence 0.0000 0.2100 0.3304 0.0000 0.0002Balanced Accuracy 0.5000 0.9059 0.8329 0.5000 0.4999

现在,对于如何建立、训练和评价模型性能,我们已经有了一些基本理解。我们接下来尝试一些不同的模型,增加隐藏神经元的个数,这是提升模型性能的关键方法,其代价是模型复杂性的显著增加。回顾第1章,每个预测子或特征都和每个隐藏的神经元相连接,而且每个隐藏的神经元和都每个结果或输出相连接。每个增加的神经元有784个特征,再加上大量的参数,导致了运行时间更长。计算取决于我们的电脑性能,接下来要为完成这些模型等待一段时间。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载