TensorFlow深度学习应用实践
上QQ阅读APP看书,第一时间看更新

4.1 从小例子起步——NumPy的初步使用

从小例子起步,本节将介绍NumPy的基础使用。

4.1.1 数据的矩阵化

对于机器学习来说,数据是一切的基础。而一切数据又不是单一的存在,其构成往往由很多的特征值决定。表4-1在第3章用以计算回归分析的房屋面积与价格表中加上了每个房屋中地下室的有无。

表4-1 某地区房屋面积与价格对应表

表4-1是数据的一般表示形式,对于机器学习的过程来说,这是不可辨识的数据,因此需要对其进行调整。

常用的机器学习表示形式为数据矩阵,可以将表4-1表示为一个专门的矩阵形式,见表4-2。

表4-2 某地区房屋面积与价格计算矩阵

在表4-2中,一行代表一个单独的房屋价格和对应的特征属性。第一列是ID,即每行的标签。标签是独一无二的,一般不会有重复现象产生。第二列是价格,一般被称为矩阵的目标。目标可以是单纯的数字,也可以是布尔变量或者一个特定的表示。表4-2中的标签是一个数字标签。第2、3、4、5列是属性值,也是标签所对应的特征值,根据此特征值的不同,每行所对应的目标也有所不同。

不同的ID用于表示不同的目标。一般来说,机器学习的最终目的就是使用不同的特征属性对目标进行区分和计算。已有的目标是观察和记录的结果,而机器学习的过程就是创建一个可进行目标识别的模型的过程。

建立模型的过程称为机器学习的训练过程,其速度和正确率主要取决于算法的选择,而算法是目标和属性之间建立某种一一对应关系的过程。这点在前面介绍机器学习过程的时候已经有所介绍。

继续回到表4-2的矩阵中。通过观察可知,矩阵中所包含的属性有两种,分别是数值型变量和布尔型变量。其中,第2、3、4列是数值变量,这也是机器学习中最常使用和辨识的类型;第5列是布尔型变量,用以标识对地下室存在的判定。

这样做的好处在于,机器学习在工作时根据采用的算法进行建模,算法的描述只能对数值型和布尔型变量进行处理,而对于其他类型的变量处理相对较少。即使后文有针对文字进行处理的机器学习模型,其本质也是将文字转化成矩阵向量进行处理。这点在后文继续介绍。

当机器学习建模的最终目标是求得一个具体数值时,即目标是一个数字,那么机器学习建模的过程基本上可以被转化为回归问题。差别在于是逻辑回归还是线性回归。

目标为布尔型变量时,问题大多数被称为分类问题,而常用的建模方法是第3章中使用的决策树方法。一般来说,当分类的目标是两个的时候,问题被转化为二元分类;而分类的结果多于两个的时候,分类称为多元分类。

许多情况下,机器学习建模和算法的设计是由程序设计和研究人员所选择的,而具体采用何种算法和模型也没有一定的要求。回归问题可以被转化为分类问题,而分类问题往往也可以由建立的回归模型解决。这点没有特定的要求。

4.1.2 数据分析

对于数据来说,在进行机器学习建模之前,需要对数据进行基本的分析和处理。

从图4-1可以看到,对于数据集来说,在进行数据分析之前,需要知道很多东西。首先需要知道的是一个数据集的数据多少和每个数据所拥有的属性个数,对于程序设计人员和科研人员来说,这些都是简单的事;但是对于机器学习的模型来说,这些是必不可少的。

图4-1 数据分析的要求

除此之外,对于数据集来说,缺失值的处理也是一个非常重要的过程。最简单的处理方法是对有缺失值的数据进行整体删除。问题在于,机器学习的数据往往来自于现实社会,因此可能数据集中大多数的数据都会有某些特征属性缺失,而解决的办法往往是采用均值或者与目标数据近似的数据特征属性替代。有些情况替代方法可取,而有些情况下,替代或者采用均值的办法处理缺失值是不可取的,因此要根据具体情况具体处理。

首先从一个小例子开始。以表4-2的矩阵为例,需要建立一个包含有数据集的数据矩阵,之后可以利用不同的方法对其进行处理。第一个代码如程序4-1所示。

【程序4-1】

程序4-1第一行引入了Anaconda自带的一个数据矩阵化的包。对于NumPy读者只需要知道,NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效得多。

第一行代码的意思是引入NumPy将其重命名为np使用,第二行使用NumPy中的mat()方法建立一个数据矩阵,row是引入的计算行数的变量,使用for循环将data数据读出到line中,而每读一行则row的计数加一。data.size是计算数据集中全部数据的数据量,一般与行数相除则为列数。请读者自行打印测试结果。

而需要说明的是,NumPy将数据转化成一个矩阵的形式进行处理,其中具体的数据可以通过二元的形式读出,如程序4-2所示。

【程序4-2】

最终打印结果如下:

细心的读者可能已经注意到,下标为[0,3]的对应的是矩阵中第1行第4列数据,其数值为3,而打印结果为3.0,这个没什么问题。而对于下标为[0,4]的数据,矩阵中是False的布尔类型,而打印结果是0。这点涉及Python的语言定义,其布尔值都可以近似地表示为0和1,即:

如果需要打印全部的数据集,就调用如下方法:

将全部的数据以一个数据的形式进行打印。

4.1.3 基于统计分析的数据处理

除了最基本的数据记录和提取外,机器学习还需要知道一些基本数据的统计量,例如每一类型数据的均值、方差以及标准差等。当然在本书中,并不需要使用手动或者使用计算器去计算以上数值,NumPy提供了相关方法,如程序4-3所示。

【程序4-3】

首先,col1生成了一个空的数据集,之后采用for循环将数据集进行填充。在程序4-3中,第一列数据被填入col1数据集中,这也是一个类型数据的集合,之后依次计算数据集的和、均值、标准差以及方差,这些对于机器学习模型的建立有一定的帮助。