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

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

3.1.1 数据的矩阵化

对于数据处理来说,数据是一切的基础。而一切数据又不是单一存在的,其构成往往由很多的特征值决定。表3-1是用以计算回归分析的房屋面积与价格对应表,主要参数为面积、卧室以及地下室的个数等。

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

表3-1是数据的一般表示形式,但是对于数据处理的过程来说,这是不可辨识的数据,因此需要对其进行调整。

常用的数据处理表示形式为数据矩阵,即可以将表3-1表示为一个专门的矩阵,见表3-2。

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

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

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

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

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

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

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

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

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

3.1.2 数据分析

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

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

图3-1 数据分析的要求

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

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

【程序3-1】

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

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

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

【程序3-2】

最终打印结果如下:

3.0
0.0

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

True = 1.0
False = 0

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

Print( data)

将全部的数据以一个数据的形式进行打印,请读者自行测试。

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

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

【程序3-3】

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