用Python动手学机器学习
上QQ阅读APP看书,第一时间看更新

第 1 章 学习前的准备

本章将介绍一下机器学习及本书的方针,并对开发环境的安装及用法进行简单说明。

1.1 关于机器学习

机器学习是一种从数据中总结规律的统计方法。机器学习中有各种用于总结规律并进行预测或者分类的模型(算法),被广泛应用在手写文字识别、物体识别、文本分类、语音识别、股价预测和疾病诊断等领域(图 1-1)。因惊人的图像识别精度而爆红的深度学习也是机器学习的一部分(图 1-2)。深度学习是神经网络模型的一种形式,模拟了人脑中神经细胞的活动。

图 1-1 什么是机器学习

图 1-2 机器学习、神经网络模型和深度学习的关系

如今我们迎来了一个非常美好的世界:汇集了包括深度学习在内的各种机器学习模型的库不断问世,并且向所有人免费公开。通过这些库,我们可以轻松地制作出十分厉害的软件。即使不理解模型中的计算原理,我们也可以大胆尝试,如果可以得到预期的结果,就有可能制作出有用的东西。

话虽如此,但肯定也有人希望充分理解机器学习的原理和理论。首先,了解原理本身就是一件令人兴奋的事情。其次,掌握了原理,在面对问题时就可以选择更加合适的模型,在运行结果不理想时也能找到更加合适的对策。更厉害的是,我们甚至能独自开发出符合自身目的的独创模型。

在市面上关于机器学习理论的书中,克里斯托弗·M. 毕肖普(Christopher M. Bishop)的 Pattern Recognition and Machine Learning 比较经典。我在上大学时看了很多机器学习相关的书,要说讲得最好的,那一定是这本。

但是,要看懂这本书绝非一件简单的事。经常有人因为想学习理论而读了这本书,结果刚开始时还干劲十足,后来就半途而废了。读这种偏数学的书,跟读小说完全不同。我觉得读这本书就像登山,要想进入精彩的理论世界,你需要准备好数学“装备”,然后一步一步地踏着数学式向上攀登。如果漫不经心地光着脚攀登,那你可能很快就会掉落悬崖。

1.1.1 学习机器学习的窍门

在多次不辞辛苦地挑战机器学习这座高山之后,我总结出了两个窍门。第一个窍门是假设维度 D 为 2,这样可以让乍一看很难的数学式变得简单一点。

数学式通常定义为通用形式,以适用于所有情况。比如,维度通常用符号 D 表示。对于数学式,我们可以先令 D=2,然后在这种情况下去思考。其实,也可以令 D=1,或者令 D=3。此外,不只是 D,也可以将数据量 N 等变量替换为 2。总之,把变量替换为一个很小的实数之后,理解起来就很简单了。也就是说,可以先用这种方法充分理解数学式,再去考虑一般情况下的 D。

第二个窍门是编写程序,以确认自己有没有真正理解。

有些人看完数学式后觉得理解了,可是要写程序时却不知如何下手,然后就会发现自己其实并没有完全理解。我认为,编写程序是一种验证自己是否真正理解数学式的方法。另外,即使无法理解数学式,通过运行别人编写好的(与数学式对应且可运行的)程序,也可以帮助自己理解(图 1-3)。

图 1-3 理解数学式的窍门

在编写程序时,不要以为得出结果就大功告成了,还要绘制图形,重现计算过程,这一点非常重要。将数值和函数可视化,不仅可以让自己很有成就感,还有助于正确理解计算过程,发现程序缺陷。

但是,人的时间是有限的。即使最终理解了,但如果花费了太多时间,那也就没有什么意义了。如果为了准备数学“装备”而从指数、对数、导数、矩阵、概率和统计等一一学起,那么光是这些就需要花费几年的时间,很不现实。此外,在攀登机器学习这座高山时,假如你想把各种各样的方法和概念全都理解,那么你可能会因为追寻绝佳景色的道路过于漫长而中途放弃。

我曾登过几座“山”,并有了一些发现,比如“这样做的话可能很快就可以理解”“这一点虽然很有意思,但并不是重点”。因此,我想或许我可以指导那些想攀登机器学习这座高山的人准确掌握机器学习的原理,让他们能用最短的时间看到机器学习世界中的绝佳景色。恰巧此时,我得到了一个写书的机会,于是就有了这本书。

1.1.2 机器学习中问题的分类

机器学习中的问题大致可以分为三种,分别是有监督学习的问题、无监督学习的问题和强化学习的问题。有监督学习要求对于输入给出相应的输出;无监督学习要求发现输入数据的规律;强化学习则要求像国际象棋那样,找出使最后结果(准确地说是整体的结果)达到最优的动作。

在本书中,我们将以上一节介绍的两个窍门为宗旨,先带领大家一步一步地攀登最基础的有监督学习这座山,然后带领大家了解无监督学习这座山的一角。为此,我们将首先学习一些必要的编程知识和基础的数学知识。强化学习这座山也很有意思,我们以后有机会时再去探索吧(图 1-4)。

图 1-4 本书的内容

1.1.3 本书的结构

本书的具体结构如下所示。

第 1 章接下来的部分将介绍机器学习中最常用的编程语言 Python 的安装方法。

第 2 章和第 3 章将介绍理解机器学习所需的编程基础知识。

第 4 章将对后面几章会用到的数学知识进行汇总。大家也可以先跳过

第 4 章,必要时再回过头来阅读。

从第 5 章开始就是真正的登山了。第 5 章将透彻地讲解基础中的基础,即有监督学习中的回归问题。所谓回归问题,就是根据输入数据输出相应的数值的问题。

第 6 章将讲解有监督学习中应用最多的分类问题。所谓分类问题,就是输出类别(种类)的问题。这里也将导入一个非常重要的概念——概率。

第 7 章将介绍用于求解分类问题的神经网络(深度学习)。

第 8 章将编写手写数字识别的程序。

第 9 章将介绍另一座山,即无监督学习的聚类算法。

第 10 章将对本书中最重要的概念和数学式进行汇总。

在编写本书的示例程序时,相比运行速度和代码量,我更注重易读性(第 2 章及其后各章的源码都可以从图灵社区下载)。

在一般情况下,数学式的索引是从 1 开始的,但本书中是从 0 开始的。之所以这么决定,是为了与“Python 中数组变量从 0 开始”保持一致,我认为这样更便于读者理解。

1.2 安装 Python

本书将使用 Python 来深入讲解机器学习。Python 有 2.x 和 3.x 版本,有一部分代码两者不兼容。本书将使用最新的 3.x 版本。下面介绍在 64 位的 Windows 10 上安装 Python 3.x 的步骤。

这里推荐使用 Anaconda 安装 Python。Anaconda 是 Anaconda 公司(以前叫 Continuum Analytics 公司)提供的版本。它不仅可以用于安装 Python,而且可以用于安装数学和科学分析中常用的包(库)。

本书将以从 Anaconda 的存档网址下载适用于 64 位的 Windows 10 的 Anaconda3-2019.03-Windows-x86_64.exe(截至 2019 年 5 月编写本书时的最新版本)的情况为例进行介绍(图 1-5)。

图 1-5 Anaconda 的存档网址(可以下载各种版本的 Anaconda)

下载完成之后,双击运行文件,启动安装工具,开始安装(图 1-6)。

图 1-6 Welcome to Anaconda3 2019.03(64-bit) Setup 界面

在 License Agreement 界面中确认许可证的相关信息。单击 I Agree 按钮(图 1-7)。

图 1-7 License Agreement 界面

在 Select Installation Type 界面(图 1-8)中选择使用此软件的用户范围,单击 Next 按钮(下文将以选择 Just Me 为例继续介绍)。

图 1-8 Select Installation Type 界面

在 Choose Install Location 界面(图 1-9)中确认安装位置,然后单击 Next。Advanced Installation Options 界面(图 1-10)中的安装选项是默认的,无须修改,直接单击 Install 按钮即可。

图 1-9 Choose Install Location 界面

图 1-10 Advanced Installation Options 界面

Anaconda 成功安装之后,会显示“Thanks for installing Anaconda3!”界面。单击 Finish 按钮,结束安装(图 1-11)。

图 1-11 “Thanks for installing Anaconda3!”界面

1.3 Jupyter Notebook

Python 准备了各种各样的编辑器,本书使用其中的 Jupyter Notebook。Jupyter Notebook 可以按顺序进行数据分析并运行,特别容易上手。

1.3.1 Jupyter Notebook 的用法

首先从“开始”菜单选择 Anaconda3,然后选择 Jupyter Notebook 进行启动。如图 1-12 所示,浏览器被开启,Jupyter Notebook 启动。

图 1-12 启动 Jupyter Notebook

选择想要操作的文件目录,然后选择 New → Python 3(图 1-13)。

图 1-13 在 Jupyter Notebook 中启动 Python

浏览器会新开启一个标签页,其中会显示如图 1-14 所示的用蓝色方框标记的输入框,该输入框在 Python 编程中称为单元格。

图 1-14 Jupyter Notebook 的单元格

试着在这个单元格中输入 1/3,并在菜单中单击“运行”按钮 {%}。单击之后,单元格的下方就会显示计算结果,并自动在下方增加新的单元格,如图 1-15 所示。

图 1-15 第 1 次的计算结果

在新的单元格内输入数学式,并单击“运行”按钮,即可继续计算(图 1-16)。

图 1-16 第 2 次的计算结果

另外,也可以在一个单元格内输入多行命令(图 1-17)。

图 1-17 同时运行 3 行命令的示例

在按住 Shift 键的同时按 Enter 键,不用单击“运行”按钮,也能得到相同的结果(后文提到该操作时,将以 Shift + Enter 键表示)。此外,无论是单击“运行”按钮,还是按住 Ctrl + Enter 键,都可以运行当前单元格。但在这种情况下,运行结束后,当前单元格将仍然处于被选中的状态,并且下方不会自动增加一个新的单元格。

单元格有两种模式,单击单元格中 In[ 编号 ] 和 Out[ 编号 ] 的附近,单元格的左边会变成蓝色(图 1-18)。这表示单元格处于“命令模式”。如果单击灰色部分,方框就会变成绿色,这表示单元格处于“编辑模式”。

图 1-18 命令模式和编辑模式

在编辑模式下,可以往单元格内输入数学式;在命令模式下,可以对单元格本身进行操作,比如删除、复制或添加单元格等。如果在命令模式下按 h 键,计算机就会显示各种模式下的快捷键及其功能一览(图 1-19)。

图 1-19 各种模式下的快捷键及其功能(部分)

比如,在命令模式下按 l(L 的小写形式)键,单元格内就会显示该单元格的行号。这便于在程序出现错误时确认错误位置。

另外,在命令模式下按 a 键或 b 键,就可以在当前单元格的上方或下方添加新的单元格。

1.3.2 输入 Markdown 格式文本

目前为止的单元格都是 Code 模式的,所谓 Code 模式,就是用于编写 Python 代码的代码模式。Jupyter Notebook 不仅可以编写代码,还可以记录文本。打开下拉菜单,选择 Code → Markdown,即可改成标记模式,开始编写文本(图 1-20)。

图 1-20 变更为 Markdown 模式

像这样改成 Markdown 模式之后,就可以输入普通文本了(图 1-21)。输入文本并单击“运行”按钮,单元格的方框就会消失,变成清爽的文本显示。

图 1-21 用 Markdown 输入普通文本

比如,输入“学习机器学习吧”,并按 Ctrl + Enter 键,方框将消失,这句话将以嵌入文本的形式显示(图 1-21)。而如果在字符串的开头添加 # 键,并输入一个半角空格,这句话就会变成标题(图 1-22 上)。

图 1-22 标题文字的输入

## 或 ### 将使标题的层级逐渐下降。

单击“运行”按钮,文字就会以标题级别的字体显示出来(图 1-22 下)。

1.3.3 更改文件名

文件名默认为 Untitled,单击 Untitled 并输入文件名,即可将其更改为任意文件名。在创建好文件之后,单击软盘图标即可保存文件(图 1-23)。

图 1-23 保存文件

文件将会以“文件名.ipynb”的形式保存。要想打开已保存的文件,需要在如图 1-12 所示的界面中单击该文件(与程序代码位于不同的浏览器标签页中)。

1.4 安装 Keras 和 TensorFlow

本书第 7 章将介绍神经网络模型,在第 7 章的后半部分,我们将使用 Keras 这个强大的机器学习和神经网络库进行讲解。Keras 内部使用的是谷歌的 TensorFlow 库。这里,我们来安装编写本书时(2019 年 6 月)最新的 TensorFlow 1.13.1 和 Keras 2.2.4。

从 Windows 的“开始”菜单中找到 Anaconda3 下一级中的 Anaconda Powershell Prompt 并启动(图 1-24)。

图 1-24 启动 Anaconda Powershell Prompt

启动后,使用 pip install 命令安装 TensorFlow 1.13.1(图 1-25)。

> pip install tensorflow==1.13.1

图 1-25 安装 TensorFlow

安装 TensorFlow 之后,使用 pip install 命令安装 Keras(图 1-26)。

> pip install keras==2.2.4

图 1-26 安装 Keras

返回 Jupyter Notebook,在单元格内输入如下代码,并按 Ctrl + Enter 键,确认 Keras 是否已成功安装(从这里开始,输入记为 [In],输出记为 [Out])。如果显示出了如下所示的“Using TensorFlow backend.”,则表示安装成功。

In

import keras

Out

Using TensorFlow backend.

然后,在单元格内输入如下代码,就可以看到版本 2.2.4 已经正确安装(请注意代码中 version 的前后分别有两个连续的半角下划线“_”)。

In

keras.__version__

Out

'2.2.4'