机器学习编程:从编码到深度学习
上QQ阅读APP看书,第一时间看更新

4.3.1 数据准备

真希望我可以告诉你,机器学习是在构建一种令人惊叹的人工智能并且看起来很酷。但事实上,机器学习的很大一部分工作是在为学习算法准备样本数据。让我们从包含样本数据集的文件开始:

在之前的章节中,这个文件有两列,我们将这两列用NumPy的loadtxt()函数分别加载到两个数组之中。现在我们有多个输入变量,X必须为矩阵,如下图所示:

X中的每一行都是一个样本,每一列都是一个输入变量。

如果我们与之前的做法一样,使用loadtxt()函数加载文件,那么就可以得到关于每一列的NumPy数组:

数组是NumPy最棒的特性。它们是非常灵活的对象,数据形式可以是从标量(单个数字)到多维结构的多种不同的形式。然而,这种灵活性有时会使得数组变得有些难以理解。我将会向你展示,如何将这4个数组塑造成我们想要的X和Y变量,但是当你抽出时间自己去做的时候,可能需要在手头上保留NumPy文档。

我们可以使用shape()函数查看数组的维数:

所有4列都包含30个元素,每个元素对应pizza_3_vars.txt中的一个样本。逗号后的空格是NumPy表示这些数组只有一个维度的一种方式。换言之,当你看到的是“数组”这个词而不是“矩阵”的时候,你可能会想到它们。

现在将前三个数组整合起来构造一个矩阵X:

下面是矩阵X的前两行元素:

虽然NumPy中的索引功能十分强大,但它有时令人费解。代码中的[:2]是[0:2]的简写,意思是:“包含索引号为0~1的行”,也就是前两行(按原书翻译,索引号0~2的行,应该是前3行,表述有误,已改——译者注)。

现在已经处理好了X,再来处理y。它仍然是一维数组的形式(30,)。这里有一个多次帮了我大忙的技巧——避免混合使用NumPy矩阵和一维数组。同时涉及一维数组和矩阵的代码可能会产生令人意想不到的行为。因此,当你有一个一维数组的时候,可以使用reshape()函数将其重塑为一个矩阵:

reshape()函数可以获取新数组的维度。如果新数组其中一个维度是-1,那么NumPy可以把它设置为能够适合其他维度的取值形式。因此,上面这行代码的含义是:“重塑Y,使其成为一个包含1列的矩阵,有多少行就生成多少行,以适应当前元素的取值形式”。结果产生了一个(30,1)矩阵:

现在我们将作为输入变量的样本数据整齐地排列在矩阵X中,将标签放在矩阵Y中。数据准备完成!现在开始升级学习系统的函数,我们从predict()函数的升级开始。