购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

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

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

2.1.1 数据的矩阵化

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

表2.1 某地区房屋面积与价格的对应表

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

常用的数据处理表示形式为数据矩阵,即可以将表2.1表示为一个专门的数据矩阵,参见表2.2。

表2.2 某地区房屋面积与价格的计算矩阵

从表2.2中可以看到,一行代表一套单独的房屋的价格和对应的特征属性。第1列是ID,即每行的标签。标签是独一无二的,一般不会有重复数据产生。第2列是价格,一般被称为矩阵的目标。目标可以是单纯的数字,也可以是布尔变量或者一个特定的表示。这里我们使用表2.2中的第2列,也就是房屋价格作为我们计算的“目标”。剩下的3、4、5列分别是涉及目标计算的某个方面属性,也就是目标所对应的特征值。每行作为一个独立的样本,根据其行内特征值的不同,每行所对应的目标也有所不同。

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

建立模型的过程称为数据处理的训练过程,其速度和正确率主要取决于算法的选择,而算法的设计过程是目标和属性之间建立某种一一对应关系的过程。

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

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

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

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

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

2.1.2 数据分析

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

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

图2.1

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

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

【程序2-1】
    import numpy as np
    data = np.mat([[1,200,105,3,False],[2,165,80,2,False],
                    [3,184.5,120,2,False],[4,116,70.8,1,False],[5,270,150,4,True]])
    row = 0
    for line in data:
       row += 1
    print( row    )
    print( data.size )
【代码解析】

(1)第一行代码引入了Anaconda自带的一个数据矩阵化的包——NumPy,并将其重命名为np。对于NumPy,读者只需要知道它是Python的一种开源的数值计算扩展工具。这种工具可以用来存储和处理大型矩阵,比Python自身的嵌套列表结构(Nested List Structure)要高效得多。

(2)第二行使用NumPy中的mat()方法建立一个数据矩阵。

(3)row是引入的计算行数的变量,使用for循环将data数据读出到line中,每读一行数据则row的计数加1。

(4)data.size是计算数据集中全部数据的数据量,一般其与行数相除,则为列数。

最终打印结果请读者自行测试。

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

【程序2-2】
    import numpy as np
    data = np.mat([[1,200,105,3,False],[2,165,80,2,False],
                    [3,184.5,120,2,False],[4,116,70.8,1,False],[5,270,150,4,True]])
    print( print( data[0,3])
    print( print( data[0,4])

最终打印结果如下:

    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)

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

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

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

【程序2-3】
    import numpy as np
    data = np.mat([[1,200,105,3,False],[2,165,80,2,False],
                      [3,184.5,120,2,False],[4,116,70.8,1,False],[5,270,150,4,True]])
    col1 = []
    for row in data:
        col1.append(row[0,1])
    print( np.sum(col1))
    print( np.mean(col1) )
    print( np.std(col1))
    print( np.var(col1))
【代码解析】

首先生成了一个空的数据集col1,然后采用for循环将数据填入数据集col1中,这也是一个类型数据的集合,最后依次计算数据集的和、均值、标准差以及方差,这些对于数据处理模型的建立有一定的帮助。 gvKtvqo9kiLTmWIvrN0DIswrqLKdwHWtJHXO+Nfmgjcc7W73lUTO7VJDpHftq2Ck

点击中间区域
呼出菜单
上一章
目录
下一章
×