AI制胜:机器学习极简入门
上QQ阅读APP看书,第一时间看更新

1.3 机器学习该如何学

1.3.1 AI时代首选Python

为何人工智能(AI)首选Python?读完这篇文章你就知道了。Python虽然是脚本语言,但是因为容易学,迅速成为了科学家的工具(MATLAB也能搞科学计算,但是软件要钱,而且很贵),从而积累了大量的工具库、架构。人工智能涉及大量的数据计算,用Python是非常自然,且简单高效。

Python有非常多优秀的深度学习库可用,现在大部分深度学习框架都支持Python,不用Python用谁?人生苦短,就用Python吧。Python现在的确已经很火了,这已经是一个不需要争论的问题了。Facebook公司开源了PyTorch之后,Python作为AI时代头牌语言的位置基本确立了。

你只要有一门编程语言基础,如C或VB,三天之内就能掌握了Python的使用技能。哪怕你是第一次接触编程语言,看看Python在线入门课程,花一周时间也会学得差不多了。因为Python比其他编程语言更加简单、易学,其面向对象特性甚至比Java、C#、.NET更加彻底。

Python是一种解释型语言,这意味着Python可以节省大量的项目开发时间,因为开发者完全不需要任何类型的编译和连接。在Python中,开发者可以用交互方式来使用解释器,无须耗费大量的时间和精力,这才是程序员最想要的。毕竟,时间就是金钱。

关于Python安装也非常简单,请一定要选择Python3版本,将本书附赠的Python软件资源包复制到硬盘上并解压缩,双击资源包中的Python-3.6.4-md64.exe文件,它会自动安装好Python 3.6.4版本,安装的时候注意要在安装界面上选择“Add Python 3.6 to PATH”复选框(添加环境变量),然后再选择中间的“Install Now”选项,如图1-1所示。

图1-1

在Python软件安装好之后,然后双击install.bat文件,系统会自动安装好本书会用到的一些依赖包,如大名鼎鼎scikit-learn机器学习工具包(本书机器学习项目案例会用到)、Dlib人工智能工具包(本书人脸识别项目案例会用到),等等。

IDLE是Python自带的程序编辑器,打开之后会出现如图1-2所示的界面,这个界面叫shell。选择File菜单下的“New File”命令,你就可以快乐地敲入程序代码,代码输入后选择“Run”菜单中的“Run Module F5”命令,就能看到运行结果了。

图1-2

当你掌握Python基本语法之后,需要再花一点时间去学习处理数据与操作数据的方法,熟悉一下Pandas、NumPy和Matplotlib这些工具包的使用方法。Pandas工具包可以处理数据帧,数据帧类似于Excel文件当中的信息表,有横行和纵列。这种数据就是所谓的结构化数据。NumPy工具包可以基于数据进行数值运算,机器学习可以把能想象到的一切事物转化为数字,再建立出这些数字中的模型。Matplotlib工具包可以制图,实现数据可视化。对读者来说,理解表格中的一堆数据可能很难,相信大家会更喜欢那种有线条贯穿始终的图表,实现数据可视化是交流成果的重要环节。

对于学习使用过程中,需要安装相应的工具包,推荐使用pip程序来安装。举例说明,比如安装matplotlib模块,进入到CMD窗口下,执行python -m pip install matplotlib进行自动安装,系统会自动下载安装包,如图1-3所示。

安装完成后,可以使用python -m pip list查看本机安装的所有模块,确保Matplotlib工具包已经安装成功,如图1-4所示。

图1-3

图1-4

非常重要的机器学习工具包scikit-learn已经成为机器学习领域当中最知名的Python模块了。scikit-learn简称sklearn,支持包括分类、回归、降维和聚类等机器学习算法,还包含了特征提取、数据处理和模型评估三大模块。sklearn涵盖了几乎所有主流机器学习算法的实现,它具有BSD许可证授权(BSD只要求你对软件原作者的工作进行必要的认可和尊重就行了,所以这是适合商业应用的),可以将项目应用于商业开发。

sklearn官网网址http://scikit-learn.org/stable/index.html,里面讲解了基于sklearn对所有算法的实现和简单应用。在工程应用中,用Python手写代码来从头实现一个算法的可能性非常低,这样不仅耗时耗力,还不一定能够写出结构清晰、稳定性强的模型。更多情况下,是分析采集到的数据,根据数据特征选择适合的算法,在工具包中调用算法,调整算法的参数,获取需要的信息,从而实现算法效率和效果之间的平衡。而sklearn正是这样一个可以帮助我们高效实现算法应用的工具包。

总结起来,scikit-learn工具包有以下几个优点:

(1)官方文档齐全,更新及时。

(2)针对所有的算法提供了一致的接口调用规则。

(3)涵盖主流机器学习任务的算法,包括回归算法、分类算法、聚类分析、数据降维处理等。

1.3.2 PyCharm可视化编辑器和Anaconda大礼包

“工欲善其事,必先利其器”,我更喜欢安装一些功能强大的Python软件来辅助我编写程序。就像在学习Java时,正常情况选择安装JDK,然后配置环境变量,用记事本编写程序,再到终端编译运行即可,而我一般选择安装JDK+MyEclipse。将Python和Java进行类比的话,在Python中使用PyCharm或Anaconda好比是在Java中使用MyEclipse。以下分别介绍PyCharm和Anaconda。

1.PyCharm可视化编辑器介绍

PyCharm作为一款针对Python的编辑器,配置简单、功能强大、使用起来省时省心,对初学者友好。PyCharm官网提供免费的社区版与付费的专业版,如图1-5所示,个人学习Python使用免费的社区版已足够用了。安装过程照着提示一步步操作即可。

图1-5

启动PyCharm,选择创建新的项目“Create new Project”,选择“Existing interpreter”已经存在的Python解释器(之前已经安装的Python 3.6,PyCharm没有内置的Python解释器,需要我们自己下载Python解释器),如图1-6所示。

图1-6

如图1-7所示,在“File”菜单下的“Settings”选项中,PyCharm的各种配置都需要在这里配置。比如进入“Editor”→“Font”或“Color Schema”对字体以及IDE主题进行更改,在“Project Interpreter”中设置本地已安装的Python解释器。这个地方一定要注意,在选择Python解释器的时候,一定要选择python.exe这个文件,而不是Python的安装文件夹。

图1-7

PyCharm基础配置到这就完成了,接下来我们就可以开始创建Python脚本文件,如图1-8所示。

图1-8

这里示例的Python脚本文件名是“example1.py”,开始敲入代码,最后在界面单击鼠标右键,选择“Run example1”,就可以看到代码的运行结果,如图1-9所示。

总之,PyCharm是JetBrains打造的一款Python IDE(集成开发环境)。它具备调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等功能。可以帮助程序员节约时间,提高生产效率。

图1-9

2.Anaconda大礼包

Anaconda是一个基于Python的数据处理和科学计算平台,相当于一个“全家桶”。它已经内置了许多非常有用的第三方库。安装好Anaconda,就相当于把Python和一些如NumPy、Pandas、Scrip、Matplotlib等常用的库自动安装到位,使得安装比常规Python安装要容易。如果选择安装Python的话,那么还需要pip install逐个安装各种库,安装起来比较痛苦。

首先访问Anaconda官网下载对应的软件,根据自己的计算机配置选择不同的操作系统,一定要选择Python 3版本,下载后安装,如图1-10所示,非常简单。

图1-10

安装完成后,如果是Windows系统,可以在“开始”菜单看到如图1-11所示的安装结果。

图1-11

可以选择“Anaconda Prompt”,打开一个命令行窗口,你可以输入“conda list”命令,可以查看目前已经安装的各种工具包库函数,如图1-12所示。如果需要额外安装一些其他的工具包,则可以使用“pip install”命令。如果在安装过程中报错,可以先尝试下载安装包,然后再进行安装。

图1-12

还有一个好用的工具是Jupyter Notebook,Jupyter Notebook相当于在浏览器中完成编程任务,不仅可以写代码,做笔记,而且还可以得到每一步的执行结果。它是一个在浏览器中使用的交互式的笔记本,可以将代码、文字完美地结合起来。

启动Jupyter Notebook,它将在你的默认网页浏览器中打开一个新的标签,如图1-13所示。创建一份新的Notebook,选择“New”下面的“Python 3”选项,即可进入Python的操作和执行窗口,在其中可以运行Python代码,这个过程其实很简单,因为Python代码都是在cell单元格中编写的。在cell单元格中编写好Python代码,然后单击运行,就可以直接在下面看到结果。仔细观察一下,我们可以发现,第一个cell前面有“In [1]:”提示符,第二个cell前面有“In[2]:”提示符,同时也有“Out[2]:”输出符(见图1-14),这是因为如果没有print语句的话,Notebook会将当前cell的最后一条语句的结果以“Out[?]:”的方式输出。

图1-13

图1-14

总的来说,Jupyter Notebook是一个在线编辑器,可以在网页上编辑程序,在编辑的过程中,每次编辑一行代码就可以运行一行代码,运行的结果也就直接显示在代码的下方,方便查看。当所有的程序编写和运行完毕之后,还可以直接把编辑和运行之后的所有信息保存在文件中。这些工具软件的使用不需要死记硬背,在使用过程中需要什么就去查,多用用就能记住了。

1.3.3 掌握算法原理与掌握机器学习软件库同等重要

很多人会认为工具包已经很成熟了,是不是只要将相应的数据输入工具、框架中,用几行代码指定模型的类型和参数,就能自动计算出结果。既然如此,何必再去学习其中的原理,一步步推导呢?

我的意见是机器学习的原理和数学推导一定要学!此处举个直观的例子:工具就像是武器,学会使用某种工具,只是学会了这种武器最基本的招式和套路。而理论学习即策略学习,决定了在未来真实对战中,遇到对手攻击时,你选取哪些招式套路,如何组合起来去迎敌。

这里有两点建议:

· 熟悉算法原理比实现算法重要:机器学习的本质是数学和统计学的结合,搞懂这些才是王道。我们知道一个模型可能有好多参数,不同参数的设置带来的模型效果可能截然不同,我们只有弄懂了理论原理,才能更好地指导我们选择合适的参数。如果你只是实现了算法,却没有让算法发挥最大的效果,那又有什么意义呢?学习的过程是有些枯燥,本书强调机器学习极简入门,把枯燥的算法用通俗的白话演绎出来,同时又渗透高等数学知识,保持你对数据科学的兴趣和动力。

· 熟悉掌握一个机器学习软件库:成熟的软件库一般包含了绝大多数的机器学习算法,并且在实现上使用了许多的数值计算优化技巧。为了实现自己的需求,我们不必从头实现算法,即使你实现了,你的计算效率也一定没有软件库实现的高,所以我们要熟练使用一个软件库。

1.3.4 机器学习与深度学习的区别

机器学习是人工智能的一个重要的子集,深度学习又是机器学习的一个重要的子集,如图1-15所示。机器学习与深度学习都是需要大量数据来“喂”的,同时深度学习还需要更高的运算能力支撑,如GPU。

图1-15

深度学习(Deep Learning,简称DL)属于机器学习的子类。它的灵感来源于人类大脑的工作方式,是用于建立、模拟人脑进行分析学习的神经网络,也是模仿人脑的机制来解释数据的一种机器学习技术。它的基本特点是试图模仿大脑的神经元之间传递、处理信息的模式。最显著的应用是计算机视觉和自然语言处理(NLP)领域。显然,“深度学习”与机器学习中的“神经网络”是强相关的,我们可以将“深度学习”称之为“改良版的神经网络”算法,可理解为包含多个隐藏层的神经网络结构。为了提高深层神经网络的训练效果,人们对神经元的连接方法以及激活函数等方面做出了调整。其目的在于建立、模拟人脑进行分析学习的神经网络,模仿人脑的机制来解释数据,如文本、图像、声音。

神经网络的计算量非常大,事实上在很长时间里由于基础设施技术的限制进展并不大。而GPU的出现让人们看到了曙光,也造就了深度学习的蓬勃发展,“深度学习”才一下子火热起来。

用机器学习的技术,开发算法来感知图像,例如识别图像是不是一个停止标志牌,但是它太容易受环境条件的干扰。如果遇到阴雨天,标志牌变得不是那么清晰可见,算法就难以成功了,但是随着时间的推移,学习算法的发展改变了一切。

人工神经网络(Artificial Neural Network)是早期机器学习中的一个重要的算法,历经数十年风风雨雨。神经网络的原理是受我们大脑的生理结构—互相交叉相连的神经元启发。例如:我们可以把一幅图像切分成图像块,输入到神经网络的第一层。在第一层的每一个神经元都把数据传递到第二层。第二层的神经元也是完成类似的工作,把数据传递到第三层,以此类推,直到最后一层,然后生成结果。每一个神经元都为它的输入分配权重,这个权重的正确与否与其执行的任务直接相关。最终的输出由这些权重加总来决定。

我们仍以识别停止(Stop)标志牌为例,用神经元进行“检查”,神经网络的任务就是给出结论,它到底是不是一个停止标志牌。神经网络会根据所有权重,给出一个经过深思熟虑的猜测。因为它还是很容易出错的。它最需要的就是几千、上万甚至几百万张图像来训练,直到神经元的输入的权值都被调制得十分精确,无论是否有雾,晴天还是雨天,每次都能得到正确的结果。只有这个时候,我们才可以说神经网络成功地自学习到一个停止标志。

深度学习(Deep Learning)加入了“深度”(Deep)。这里的“深度”就是说神经网络中众多的层。层数非常多,神经元也非常多,然后给系统输入海量的数据来训练。现在,经过深度学习训练的图像识别,在一些场景中甚至可以比人做得更好:从识别猫,到识别血液中癌症的早期成分,到识别核磁共振成像中的肿瘤。Google的AlphaGo先是学会了如何下围棋,然后与自己下棋进行训练。它训练自己神经网络的方法,就是不断地与自己下棋,反复地下,永不停歇。

机器学习和深度学习都是AI的具体技术实现,但两者区别明显。机器学习更是一种通用型的技术,包括决策树、贝叶斯、支持向量机等算法,也包括神经网络算法。而深度学习深耕神经网络,是深度神经网络算法技术,包括深度卷积网络、深度循环网络等。

机器学习能够适应各种数据量,特别是数据量较小的场景。如果数据量迅速增加,那么深度学习的效果将更加突出,这是因为深度学习算法需要大量的数据才能完美理解。另外,深度学习算法需要高端GPU在大量数据的合理时间内进行训练。这些GPU非常昂贵,但是如果没有它们训练深层网络来实现高性能,这在实践上就不可行。高性能的GPU才能够实现快速计算,在建模上才能花更少时间来分析所有的图像。相对而言,传统的机器学习算法只需要一个CPU就可以训练得很好,而不需要最好的硬件。