书籍下载gg群6089740钉钉群21734177 IT书籍http:/t.cn/RDIAj5D 在对数据进行拆分之前,train_test_split函数利用伪随机数生成器将数据集打乱。如果 我们只是将最后25%的数据作为测试集,那么所有数据点的标签都是2,因为数据点是按 标签排序的(参见之前iris['target']的输出)。测试集中只有三个类别之一,这无法告 诉我们模型的泛化能力如何,所以我们将数据打乱,确保测试集中包含所有类别的数据。 为了确保多次运行同一函数能够得到相同的输出,我们利用random_state参数指定了随机 数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。本书用 到随机过程时,都会用这种方法指定random_state。 train_test_split函数的输出为X_train、.X_test、y_train和y_test,它们都是NumPy 数组。X_train包含75%的行数据,X_test包含剩下的25%: In[22]: print("X_train shape:{]"format(X_train.shape)) print("y_train shape:{]"format(y_train.shape)) 0ut[22]: X_train shape:(112,4) y_train shape:(112,) In[23]: print("X_test shape:{}"format(x_test.shape)) print("y_test shape:{}"format(y_test.shape)) 0ut[23]: X_test shape:(38,4) y_test shape:(38,) 1.7.3 要事第一:观察数据 在构建机器学习模型之前,通常最好检查一下数据,看看如果不用机器学习能不能轻松完 成任务,或者需要的信息有没有包含在数据中。 此外,检查数据也是发现异常值和特殊值的好方法。举个例子,可能有些鸢尾花的测量单 位是英寸而不是厘米。在现实世界中,经常会遇到不一致的数据和意料之外的测量数据。 检查数据的最佳方法之一就是将其可视化。一种可视化方法是绘制散点图(scatter plot)。 数据散点图将一个特征作为x轴,另一个特征作为y轴,将每一个数据点绘制为图上的一 个点。不幸的是,计算机屏幕只有两个维度,所以我们一次只能绘制两个特征(也可能是 3个)。用这种方法难以对多于3个特征的数据集作图。解决这个问题的一种方法是绘制散 点图矩阵(pair plot),从而可以两两查看所有的特征。如果特征数不多的话,比如我们这 里有4个,这种方法是很合理的。但是你应该记住,散点图矩阵无法同时显示所有特征之 间的关系,所以这种可视化方法可能无法展示数据的某些有趣内容。 图1-3是训练集中特征的散点图矩阵。数据点的颜色与鸢尾花的品种相对应。为了绘制这 张图,我们首先将NumPy数组转换成pandas DataFrame。.pandas有一个绘制散点图矩阵的 函数,叫作scatter_.matrix。矩阵的对角线是每个特征的直方图: 引言115 电子书寻找看手相钉钉或微信pythontesting
引言 | 15 在对数据进行拆分之前,train_test_split 函数利用伪随机数生成器将数据集打乱。如果 我们只是将最后 25% 的数据作为测试集,那么所有数据点的标签都是 2,因为数据点是按 标签排序的(参见之前 iris['target'] 的输出)。测试集中只有三个类别之一,这无法告 诉我们模型的泛化能力如何,所以我们将数据打乱,确保测试集中包含所有类别的数据。 为了确保多次运行同一函数能够得到相同的输出,我们利用 random_state 参数指定了随机 数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。本书用 到随机过程时,都会用这种方法指定 random_state。 train_test_split 函数的输出为 X_train、X_test、y_train 和 y_test,它们都是 NumPy 数组。X_train 包含 75% 的行数据,X_test 包含剩下的 25%: In[22]: print("X_train shape: {}".format(X_train.shape)) print("y_train shape: {}".format(y_train.shape)) Out[22]: X_train shape: (112, 4) y_train shape: (112,) In[23]: print("X_test shape: {}".format(X_test.shape)) print("y_test shape: {}".format(y_test.shape)) Out[23]: X_test shape: (38, 4) y_test shape: (38,) 1.7.3 要事第一:观察数据 在构建机器学习模型之前,通常最好检查一下数据,看看如果不用机器学习能不能轻松完 成任务,或者需要的信息有没有包含在数据中。 此外,检查数据也是发现异常值和特殊值的好方法。举个例子,可能有些鸢尾花的测量单 位是英寸而不是厘米。在现实世界中,经常会遇到不一致的数据和意料之外的测量数据。 检查数据的最佳方法之一就是将其可视化。一种可视化方法是绘制散点图(scatter plot)。 数据散点图将一个特征作为 x 轴,另一个特征作为 y 轴,将每一个数据点绘制为图上的一 个点。不幸的是,计算机屏幕只有两个维度,所以我们一次只能绘制两个特征(也可能是 3 个)。用这种方法难以对多于 3 个特征的数据集作图。解决这个问题的一种方法是绘制散 点图矩阵(pair plot),从而可以两两查看所有的特征。如果特征数不多的话,比如我们这 里有 4 个,这种方法是很合理的。但是你应该记住,散点图矩阵无法同时显示所有特征之 间的关系,所以这种可视化方法可能无法展示数据的某些有趣内容。 图 1-3 是训练集中特征的散点图矩阵。数据点的颜色与鸢尾花的品种相对应。为了绘制这 张图,我们首先将 NumPy 数组转换成 pandas DataFrame。pandas 有一个绘制散点图矩阵的 函数,叫作 scatter_matrix。矩阵的对角线是每个特征的直方图: 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting
In[24]: #利用X train中的数据创建DataFrame #利用iris_dataset.feature_.names中的字符串对数据列进行标记 iris_dataframe pd.DataFrame(X_train,columns=iris_dataset.feature_names) #利用DataFrame创建散点图矩阵,按y_train着色 grr pd.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),marker='o', hist_kwds={'bins':20},s=60,alpha=.8,cmap=mglearn.cm3) 008 petal nth fcm) eta width (cm) 图1-3:Is数据集的散点图矩阵,按类别标签着色 从图中可以看出,利用花瓣和花萼的测量数据基本可以将三个类别区分开。这说明机器学 习模型很可能可以学会区分它们。 1.7.4构建第一个模型:k近邻算法 现在我们可以开始构建真实的机器学习模型了。scikit-Learn中有许多可用的分类算法。 16|第1章
16 | 第 1 章 In[24]: # 利用X_train中的数据创建DataFrame # 利用iris_dataset.feature_names中的字符串对数据列进行标记 iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names) # 利用DataFrame创建散点图矩阵,按y_train着色 grr = pd.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o', hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3) 图 1-3:Iris 数据集的散点图矩阵,按类别标签着色 从图中可以看出,利用花瓣和花萼的测量数据基本可以将三个类别区分开。这说明机器学 习模型很可能可以学会区分它们。 1.7.4 构建第一个模型:k近邻算法 现在我们可以开始构建真实的机器学习模型了。scikit-learn 中有许多可用的分类算法
书籍下载gg群6089740钉钉群21734177 IT书籍http:/L.cn/RDIAj5D 这里我们用的是k近邻分类器,这是一个很容易理解的算法。构建此模型只需要保存训练 集即可。要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近 的数据点,然后将找到的数据点的标签赋值给这个新数据点。 k近邻算法中k的含义是,我们可以考虑训练集中与新数据点最近的任意k个邻居(比如 说,距离最近的3个或5个邻居),而不是只考虑最近的那一个。然后,我们可以用这些 邻居中数量最多的类别做出预测。第2章会进一步介绍这个算法的细节,现在我们只考虑 一个邻居的情况。 scikit-learn中所有的机器学习模型都在各自的类中实现,这些类被称为Estimator 类。k近邻分类算法是在neighbors模块的KNeighborsClassifier类中实现的。我们需 要将这个类实例化为一个对象,然后才能使用这个模型。这时我们需要设置模型的参数。 KNeighborsclassifier最重要的参数就是邻居的数目,这里我们设为1: In[25]: from sklearn.neighbors import KNeighborsClassifier knn KNeighborsclassifier(n_neighbors=1) kn对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行 预测的算法。它还包括算法从训练数据中提取的信息。对于KNeighborsClassifier来说, 里面只保存了训练集。 想要基于训练集来构建模型,需要调用knn对象的fit方法,输入参数为X_train和y_ train,二者都是NumPy数组,前者包含训练数据,后者包含相应的训练标签: In[26]: knn.fit(X_train,y_train) 0ut[26]: KNeighborsclassifier(algorithm='auto',leaf_size=30,metric='minkowski', metric_params=None,n_jobs=1,n_neighbors=1,p=2, weights='uniform') fit方法返回的是kn对象本身并做原处修改,因此我们得到了分类器的字符串表示。 从中可以看出构建模型时用到的参数。几乎所有参数都是默认值,但你也会注意到 neighbors:=1,这是我们传入的参数。scikit-learn中的大多数模型都有很多参数,但多用 于速度优化或非常特殊的用途。你无需关注这个字符串表示中的其他参数。打印sc1kt- learn模型会生成非常长的字符串,但不要被它吓到。我们会在第2章讲到所有重要的参 数。在本书的其他章节中,我们不会给出ft的输出,因为里面没有包含任何新的信息。 1.7.5做出预测 现在我们可以用这个模型对新数据进行预测了,我们可能并不知道这些新数据的正确标 签。想象一下,我们在野外发现了一朵鸢尾花,花萼长5cm宽2.9cm,花瓣长lcm宽 0.2cm。这朵鸢尾花属于哪个品种?我们可以将这些数据放在一个NumPy数组中,再次计 算形状,数组形状为样本数(1)乘以特征数(4): 引言117 电子书寻找看手相钉钉或微信pythontesting
引言 | 17 这里我们用的是 k 近邻分类器,这是一个很容易理解的算法。构建此模型只需要保存训练 集即可。要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近 的数据点,然后将找到的数据点的标签赋值给这个新数据点。 k 近邻算法中 k 的含义是,我们可以考虑训练集中与新数据点最近的任意 k 个邻居(比如 说,距离最近的 3 个或 5 个邻居),而不是只考虑最近的那一个。然后,我们可以用这些 邻居中数量最多的类别做出预测。第 2 章会进一步介绍这个算法的细节,现在我们只考虑 一个邻居的情况。 scikit-learn 中所有的机器学习模型都在各自的类中实现,这些类被称为 Estimator 类。k 近邻分类算法是在 neighbors 模块的 KNeighborsClassifier 类中实现的。我们需 要将这个类实例化为一个对象,然后才能使用这个模型。这时我们需要设置模型的参数。 KNeighborsClassifier 最重要的参数就是邻居的数目,这里我们设为 1: In[25]: from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=1) knn 对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行 预测的算法。它还包括算法从训练数据中提取的信息。对于 KNeighborsClassifier 来说, 里面只保存了训练集。 想要基于训练集来构建模型,需要调用 knn 对象的 fit 方法,输入参数为 X_train 和 y_ train,二者都是 NumPy 数组,前者包含训练数据,后者包含相应的训练标签: In[26]: knn.fit(X_train, y_train) Out[26]: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=1, n_neighbors=1, p=2, weights='uniform') fit 方法返回的是 knn 对象本身并做原处修改,因此我们得到了分类器的字符串表示。 从中可以看出构建模型时用到的参数。几乎所有参数都是默认值,但你也会注意到 n_ neighbors=1,这是我们传入的参数。scikit-learn 中的大多数模型都有很多参数,但多用 于速度优化或非常特殊的用途。你无需关注这个字符串表示中的其他参数。打印 scikitlearn 模型会生成非常长的字符串,但不要被它吓到。我们会在第 2 章讲到所有重要的参 数。在本书的其他章节中,我们不会给出 fit 的输出,因为里面没有包含任何新的信息。 1.7.5 做出预测 现在我们可以用这个模型对新数据进行预测了,我们可能并不知道这些新数据的正确标 签。想象一下,我们在野外发现了一朵鸢尾花,花萼长 5cm 宽 2.9cm,花瓣长 1cm 宽 0.2cm。这朵鸢尾花属于哪个品种?我们可以将这些数据放在一个 NumPy 数组中,再次计 算形状,数组形状为样本数(1)乘以特征数(4): 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting
In[27]: X_new=np.array([[5,2.9,1,0.2]) print("X_new.shape:{}"format(X_new.shape)) 0ut[27]: X_new.shape:(1,4) 注意,我们将这朵花的测量数据转换为二维NumPy数组的一行,这是因为scikit-learn 的输入数据必须是二维数组。 我们调用knn对象的predict方法来进行预测: In[28]: prediction knn.predict(X_new) print("Prediction:{]"format(prediction)) print("Predicted target name:{]"format( iris_dataset['target_names'][prediction])) 0ut[28]: Prediction:[0] Predicted target name:['setosa'] 根据我们模型的预测,这朵新的鸢尾花属于类别0,也就是说它属于setosa品种。但我们 怎么知道能否相信这个模型呢?我们并不知道这个样本的实际品种,这也是我们构建模型 的重点啊! 1.7.6评估模型 这里需要用到之前创建的测试集。这些数据没有用于构建模型,但我们知道测试集中每朵 鸢尾花的实际品种。 因此,我们可以对测试数据中的每朵鸢尾花进行预测,并将预测结果与标签(已知的品 种)进行对比。我们可以通过计算精度(accuracy)来衡量模型的优劣,精度就是品种预 测正确的花所占的比例: In[29]: y_pred knn.predict(X_test) print("Test set predictions:\n {}"format(y_pred)) 0ut[29]: Test set predictions: [21020201112111101100210020011021日22102] In[30]: print("Test set score:{:.2f]".format(np.mean(y_pred =y_test))) 0ut[30]: Test set score:0.97 我们还可以使用knn对象的score方法来计算测试集的精度: 18|第1章
18 | 第 1 章 In[27]: X_new = np.array([[5, 2.9, 1, 0.2]]) print("X_new.shape: {}".format(X_new.shape)) Out[27]: X_new.shape: (1, 4) 注意,我们将这朵花的测量数据转换为二维 NumPy 数组的一行,这是因为 scikit-learn 的输入数据必须是二维数组。 我们调用 knn 对象的 predict 方法来进行预测: In[28]: prediction = knn.predict(X_new) print("Prediction: {}".format(prediction)) print("Predicted target name: {}".format( iris_dataset['target_names'][prediction])) Out[28]: Prediction: [0] Predicted target name: ['setosa'] 根据我们模型的预测,这朵新的鸢尾花属于类别 0,也就是说它属于 setosa 品种。但我们 怎么知道能否相信这个模型呢?我们并不知道这个样本的实际品种,这也是我们构建模型 的重点啊! 1.7.6 评估模型 这里需要用到之前创建的测试集。这些数据没有用于构建模型,但我们知道测试集中每朵 鸢尾花的实际品种。 因此,我们可以对测试数据中的每朵鸢尾花进行预测,并将预测结果与标签(已知的品 种)进行对比。我们可以通过计算精度(accuracy)来衡量模型的优劣,精度就是品种预 测正确的花所占的比例: In[29]: y_pred = knn.predict(X_test) print("Test set predictions:\n {}".format(y_pred)) Out[29]: Test set predictions: [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 2] In[30]: print("Test set score: {:.2f}".format(np.mean(y_pred == y_test))) Out[30]: Test set score: 0.97 我们还可以使用 knn 对象的 score 方法来计算测试集的精度:
书籍下载qq群6089740钉钉群21734177 IT书籍http:/t.cn/RDIA j5D In[31]: print("Test set score:{:.2f]".format(knn.score(X_test,y_test))) 0ut[31]: Test set score:0.97 对于这个模型来说,测试集的精度约为0.97,也就是说,对于测试集中的鸢尾花,我们的 预测有97%是正确的。根据一些数学假设,对于新的鸢尾花,可以认为我们的模型预测 结果有97%都是正确的。对于我们的植物学爱好者应用程序来说,高精度意味着模型足 够可信,可以使用。在后续章节中,我们将讨论提高性能的方法,以及模型调参时的注 意事项。 1.8 小结与展望 总结一下本章所学的内容。我们首先简要介绍了机器学习及其应用,然后讨论了监督学习 和无监督学习之间的区别,并简要介绍了本书将会用到的工具。随后,我们构思了一项任 务,要利用鸢尾花的物理测量数据来预测其品种。我们在构建模型时用到了由专家标注过 的测量数据集,专家已经给出了花的正确品种,因此这是一个监督学习问题。一共有三个 品种:setosa、versicolor或virginica,因此这是一个三分类问题。在分类问题中,可能的 品种被称为类别(class),每朵花的品种被称为它的标签(label)。 鸢尾花(ris)数据集包含两个NumPy数组:一个包含数据,在scikit-Learn中被称为X; 一个包含正确的输出或预期输出,被称为y。数组X是特征的二维数组,每个数据点对应 一行,每个特征对应一列。数组y是一维数组,里面包含一个类别标签,对每个样本都是 一个0到2之间的整数。 我们将数据集分成训练集(training set)和测试集(test set),前者用于构建模型,后者用 于评估模型对前所未见的新数据的泛化能力。 我们选择了k近邻分类算法,根据新数据点在训练集中距离最近的邻居来进行预测。该算 法在KNeighborsclassifier类中实现,里面既包含构建模型的算法,也包含利用模型进行 预测的算法。我们将类实例化,并设定参数。然后调用t方法来构建模型,传入训练数 据(X_train)和训练输出(y_trian)作为参数。我们用score方法来评估模型,该方法 计算的是模型精度。我们将sco「e方法用于测试集数据和测试集标签,得出模型的精度约 为97%,也就是说,该模型在测试集上97%的预测都是正确的。 这让我们有信心将模型应用于新数据(在我们的例子中是新花的测量数据),并相信模型 在约97%的情况下都是正确的。 下面汇总了整个训练和评估过程所必需的代码: In[32]: X_train,X_test,y_train,y_test train_test_split( iris_dataset['data'],iris_dataset['target'],random_state=0) knn KNeighborsClassifier(n_neighbors=1) 引言119 电子书寻找看手相钉钉或微信pythontesting
引言 | 19 In[31]: print("Test set score: {:.2f}".format(knn.score(X_test, y_test))) Out[31]: Test set score: 0.97 对于这个模型来说,测试集的精度约为 0.97,也就是说,对于测试集中的鸢尾花,我们的 预测有 97% 是正确的。根据一些数学假设,对于新的鸢尾花,可以认为我们的模型预测 结果有 97% 都是正确的。对于我们的植物学爱好者应用程序来说,高精度意味着模型足 够可信,可以使用。在后续章节中,我们将讨论提高性能的方法,以及模型调参时的注 意事项。 1.8 小结与展望 总结一下本章所学的内容。我们首先简要介绍了机器学习及其应用,然后讨论了监督学习 和无监督学习之间的区别,并简要介绍了本书将会用到的工具。随后,我们构思了一项任 务,要利用鸢尾花的物理测量数据来预测其品种。我们在构建模型时用到了由专家标注过 的测量数据集,专家已经给出了花的正确品种,因此这是一个监督学习问题。一共有三个 品种:setosa、versicolor 或 virginica,因此这是一个三分类问题。在分类问题中,可能的 品种被称为类别(class),每朵花的品种被称为它的标签(label)。 鸢尾花(Iris)数据集包含两个 NumPy 数组:一个包含数据,在 scikit-learn 中被称为 X; 一个包含正确的输出或预期输出,被称为 y。数组 X 是特征的二维数组,每个数据点对应 一行,每个特征对应一列。数组 y 是一维数组,里面包含一个类别标签,对每个样本都是 一个 0 到 2 之间的整数。 我们将数据集分成训练集(training set)和测试集(test set),前者用于构建模型,后者用 于评估模型对前所未见的新数据的泛化能力。 我们选择了 k 近邻分类算法,根据新数据点在训练集中距离最近的邻居来进行预测。该算 法在 KNeighborsClassifier 类中实现,里面既包含构建模型的算法,也包含利用模型进行 预测的算法。我们将类实例化,并设定参数。然后调用 fit 方法来构建模型,传入训练数 据(X_train)和训练输出(y_trian)作为参数。我们用 score 方法来评估模型,该方法 计算的是模型精度。我们将 score 方法用于测试集数据和测试集标签,得出模型的精度约 为 97%,也就是说,该模型在测试集上 97% 的预测都是正确的。 这让我们有信心将模型应用于新数据(在我们的例子中是新花的测量数据),并相信模型 在约 97% 的情况下都是正确的。 下面汇总了整个训练和评估过程所必需的代码: In[32]: X_train, X_test, y_train, y_test = train_test_split( iris_dataset['data'], iris_dataset['target'], random_state=0) knn = KNeighborsClassifier(n_neighbors=1) 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting