Python神经网络项目实战
上QQ阅读APP看书,第一时间看更新

虽然机器学习和人工智能这两个词经常被互换使用,但它们其实并不是完全一样的。人工智能这个词最早出现在20世纪50年代,它指的是机器模仿人类行为的能力。为此,研究人员和计算机科学家尝试了很多方法。早期,人们主要利用的技术叫作符号人工智能。符号人工智能试图将人类的知识声明为一种计算机可以处理的形式。基于符号,人工智能诞生了专家系统。这种计算机系统可以模拟人类的决策,然而,符号人工智能最大的缺点是它依赖于人类专家的知识,并且为了解决特定的问题,这些规则和认知是被编程的。由于符号人工智能的能力所限,科学家对其越来越不抱有希望,因此人工智能作为一个科学领域,曾经经历过一段时间的低谷(被称为AI的冬天)。当符号人工智能在20世纪50年代占据舞台中心的时候,人工智能的另外一个子领域——机器学习,正在后面悄悄地进步着。

机器学习指的是一类算法,这类算法可以使计算机能够从数据中学习并对未来遇到的未知数据集做出预测。

然而,早期的人工智能研究人员并没有特别关注机器学习,因为那时候的计算机算力不强,同时也没有存储海量数据的能力,而这些正是机器学习算法所必需的。后来人们发现,机器学习不能再被忽视了。21世纪初,得益于机器学习的发展,人工智能经历了一轮复兴。这轮复兴的关键原因是计算机系统的成熟使其可以收集并存储海量数据(大数据),同时处理器变得足够快,能够运行机器学习算法。人工智能迎来了它的春天。

既然谈到了什么是机器学习,那么我们需要明白机器学习算法是如何工作的。机器学习算法可以被大致分为两类。

有监督学习:通过标记过的训练数据,机器学习算法学习将输入变量映射到目标变量的规则。例如,某监督学习算法学习预测是否会有降雨(目标变量),它的输入是温度、时间、季节大气压(输入变量)等。

无监督学习:使用未经标记的训练数据,机器学习算法学习数据的关联规则。无监督学习最常见的使用案例是聚类分析。在聚类分析中,机器学习算法识别数据中隐藏的模式和类别,而此数据并没有事先被明确标记过。

在本书中,我们专注于有监督学习算法。举一个有监督学习的具体例子,请考虑如下问题。你是一个动物爱好者,同时也是一个机器学习爱好者,因此你希望创建一个有监督机器学习算法来判断一个动物是友善的(友善的小狗)还是具有敌意的(危险的熊)。为了简化问题,假设你收集了各品种的狗和熊的两种测量特征——体重和速度。数据(训练数据集)收集完成后,你将数据绘制在图表中,同时标记每个动物是敌是友,如图1-1所示。

图1-1

结果很明显,我们发现狗的体重较轻,速度一般也较快。而熊则更重一些,速度也更慢一些。如果我们在狗和熊之间画一条线(即决策边界),那么我们可以利用这条线进行预测,如图1-2所示。一旦我们得到了某个新的动物的测量数据,就可以通过观察它落在这条线的左侧还是右侧来进行预测。落在左侧则是友善的,落在右侧则是有敌意的。但是这个数据集的维度很少。如果可以收集成百上千的不同的测量维度呢?这样的话,图表可能会有100多维,通过人工的方式很难画出这条决策边界。不过,对于机器学习来说,这并不是什么难题,机器学习算法的任务就是优化决策边界并以此分割数据集。在理想的情况下,我们希望算法能够生成一条决策边界,完美地分割数据集中的两类数据(尽管,取决于不同的数据集,这件事并不总能成功)。

图1-2

有了这条决策边界,我们可以对新的未经标记的数据进行预测。如果新数据落在决策边界的左侧,我们将其归类为友善的动物;反之,如果新数据落在决策边界的右侧,我们将其归类为有敌意的动物。

对于上面这个简单的例子,我们仅接收两个输入变量并将数据分为两组。我们可以把这个问题泛化,有多个输入并分为多个种类。

当然,我们对于机器学习算法的选择会影响生成的决策边界。一些流行的有监督机器学习包括如下几种:

神经网络(neural network);

线性回归(linear regression);

对数概率回归(logistic regression);

支持向量机(SVM);

决策树(decision tree)。

数据集的属性(例如图像数据集和数值数据集)和要解决的问题决定了我们所选的机器学习算法。在本书中,我们专注于神经网络。

我们已经探讨了什么是机器学习。但是要如何开始机器学习呢?从宏观的角度来看,机器学习项目就是将原始数据作为输入并做出预测然后输出。在达到这一目的之前,还有很多中间步骤需要完成。机器学习工作流可以用图1-3来概括。

图1-3

机器学习工作流的输入始终是数据。数据可以有不同的来源,格式也可以不同。例如,如果我们在做一个基于计算机视觉的项目,它的输入可能是图像。对于其他大多数的机器学习项目,数据会以表格的形式呈现,类似电子表格。对于某些项目而言,收集数据是非常重要的第一个步骤。在本书中,假设所有的数据已经提供,我们可以专注于机器学习。

下一步是处理数据。原始数据通常非常杂乱、易错并且可能不适合我们选择的机器学习算法。如果数据有多个来源,我们还需要将多个数据集合并为一个数据集。机器学习模型为了进行学习,通常需要一个数值化的数据集。如果原始数据集中有多个类别变量(例如性别、国家、星期等),则需要对这些变量进行数值编码。我们会在本章后面的部分学习如何去做。对于特定的机器学习算法,数据换算和标准化也是必要的。这么做的逻辑是,如果某些变量的范围远大于另外一些变量,那么机器学习算法会错误地重点关注这些变量。

现实中的数据集往往非常杂乱,你会发现有些数据集是不完整的,同时行或列中有些数据是缺失的。处理缺失数据有相应的方法,每种方法都有它的优点和缺点。最简单的方法是丢弃含有缺失数据的行或列。但是这个方法可能并不适用于所有情况,因为这样做的话最后可能数据集的一大部分都被丢弃了。我们也可以用变量的均值来替换这些丢失的数据(如果变量恰巧是数值形式的话)。这个方法更加理想,因为它保护了我们的数据集。但是,使用均值来替换缺失数据会影响到数据集的分布,这可能会对我们的机器学习模型产生负面的影响。另外一个办法是基于存在的数据来预测缺失的数据。但是使用这个方法的时候要小心,因为这样会增加数据集的误差。

最后是数据预处理,我们必须将数据集分成训练数据集和验证数据集两部分。我们的机器学习模型仅仅利用训练数据集来训练和拟合。当我们对模型的性能感到满意之后,我们会通过训练数据集来评估模型。注意我们的模型不曾利用测试数据集训练过,这就保证了我们对模型性能的评估是不含偏差的,这样能够反映模型在真实项目上的表现。

当数据处理完成之后,我们会进行探索性数据分析(EDA),EDA是一个利用数据可视化来洞察数据的过程。EDA允许我们创建新的特征(成为特征工程)并且将领域知识加到机器学习模型中。

最后,我们来到了机器学习的核心部分。在数据处理和探索性数据分析完成后,我们开始建模。正如之前提到的,有一些机器学习算法可供我们选择,并且我们要基于所要解决的问题的特点来选择机器学习算法。在本书中,我们专注于神经网络。在建模过程中,超参数的调优是一个必要的步骤,合适的超参数可以明显提高模型的性能。在后面的章节中,我们会探索神经网络的一些超参数。一旦模型训练完成,我们便可以利用测试数据集对模型的性能进行评估。

可以看到机器学习工作流包含了很多中间步骤,每个步骤都会对模型的整体性能产生影响。使用Python进行机器学习最大的优势在于机器学习工作的全部流程都可以通过利用一些开源的Python函数库来完成。在本书中,我们可以学到Python在机器学习工作流的每一步中的相应经验,因为我们会利用Python从头开始构建一个完整且复杂的神经网络项目。