但你应该尽快迁移到Python3。在编写任何新代码时,想要编写能够在Python2和Python 3中同时运行的代码,大多数情况下都是很容易的。3如果你无需与旧版软件进行交互的话, 一定要使用Python3。本书所有代码在两个版本下都可以运行,但具体的输出在Python2 中可能会略有不同。 1.6 本书用到的版本 对于前面提到的这些库,本书用到的版本如下: In[9]: import sys print("Python version:{}"format(sys.version)) import pandas as pd print("pandas version:{}"format(pd.__version_)) import matplotlib print("matplotlib version:{}"format(matplotlib.__version_)) import numpy as np print("NumPy version:{]"format(np.__version__)) import scipy as sp print("SciPy version:{]"format(sp.__version_)) import IPython print("IPython version:{]"format(IPython.__version_)) import sklearn print("scikit-learn version:{]".format(sklearn.__version__)) 0ut[9]: Python version:3.5.2 |Anaconda 4.1.1 (64-bit)(default,Jul 2 2016,17:53:06) [Gcc4.4.720120313(Red Hat4.4.7-1)] pandas version:0.18.1 matplotlib version:1.5.1 NumPy version:1.11.1 SciPy version:0.17.1 IPython version:5.1.0 scikit-learn version:0.18 这些版本不一定要精确匹配,但scikit-learn的版本不应低于本书使用的版本。 现在都已经安装完毕,我们来学习第一个机器学习应用。 本书假设你的scikit-learn版本不低于0.18.0.l8版新增了model. selection模块,如果你用的是较早版本的scikit-learn,那么需要修改从 这个模块导入的内容。 注3:six包(https::你pypi.python.org/pypi/six)可以方便地做到这一点。 10 |第1章
10 | 第 1 章 但你应该尽快迁移到 Python 3。在编写任何新代码时,想要编写能够在 Python 2 和 Python 3 中同时运行的代码,大多数情况下都是很容易的。3 如果你无需与旧版软件进行交互的话, 一定要使用 Python 3。本书所有代码在两个版本下都可以运行,但具体的输出在 Python 2 中可能会略有不同。 1.6 本书用到的版本 对于前面提到的这些库,本书用到的版本如下: In[9]: import sys print("Python version: {}".format(sys.version)) import pandas as pd print("pandas version: {}".format(pd.__version__)) import matplotlib print("matplotlib version: {}".format(matplotlib.__version__)) import numpy as np print("NumPy version: {}".format(np.__version__)) import scipy as sp print("SciPy version: {}".format(sp.__version__)) import IPython print("IPython version: {}".format(IPython.__version__)) import sklearn print("scikit-learn version: {}".format(sklearn.__version__)) Out[9]: Python version: 3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 2 2016, 17:53:06) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] pandas version: 0.18.1 matplotlib version: 1.5.1 NumPy version: 1.11.1 SciPy version: 0.17.1 IPython version: 5.1.0 scikit-learn version: 0.18 这些版本不一定要精确匹配,但 scikit-learn 的版本不应低于本书使用的版本。 现在都已经安装完毕,我们来学习第一个机器学习应用。 本书假设你的 scikit-learn 版本不低于 0.18。0.18 版新增了 model_ selection 模块,如果你用的是较早版本的 scikit-learn,那么需要修改从 这个模块导入的内容。 注 3:six 包(https://pypi.python.org/pypi/six)可以方便地做到这一点
书籍下载qg群6089740钉钉群21734177 IT书籍http:/t.cn/RDIAj5D 1.7第一个应用:鸢尾花分类 本节我们将完成一个简单的机器学习应用,并构建我们的第一个模型。同时还将介绍一些 核心概念和术语。 假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣。她收集了每朵鸢尾花的一些 测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米(见 图1-2)。 花瓣 花萼 图12:鸢尾花局部 她还有一些鸢尾花的测量数据,这些花之前已经被植物学专家鉴定为属于setosa、 versicolor或virginica三个品种之一。对于这些测量数据,她可以确定每朵鸢尾花所属的品 种。我们假设这位植物学爱好者在野外只会遇到这三种鸢尾花。 我们的目标是构建一个机器学习模型,可以从这些已知品种的鸢尾花测量数据中进行学 习,从而能够预测新鸢尾花的品种。 因为我们有已知品种的鸢尾花的测量数据,所以这是一个监督学习问题。在这个问题中, 我们要在多个选项中预测其中一个(鸢尾花的品种)。这是一个分类(classification)问题 的示例。可能的输出(鸢尾花的不同品种)叫作类别(clss)。数据集中的每朵鸢尾花都 属于三个类别之一,所以这是一个三分类问题。 引言111 电子书寻找看手相钉钉或微信pythontesting
引言 | 11 1.7 第一个应用:鸢尾花分类 本节我们将完成一个简单的机器学习应用,并构建我们的第一个模型。同时还将介绍一些 核心概念和术语。 假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣。她收集了每朵鸢尾花的一些 测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米(见 图 1-2)。 花萼 花瓣 图 1-2:鸢尾花局部 她还有一些鸢尾花的测量数据,这些花之前已经被植物学专家鉴定为属于 setosa、 versicolor 或 virginica 三个品种之一。对于这些测量数据,她可以确定每朵鸢尾花所属的品 种。我们假设这位植物学爱好者在野外只会遇到这三种鸢尾花。 我们的目标是构建一个机器学习模型,可以从这些已知品种的鸢尾花测量数据中进行学 习,从而能够预测新鸢尾花的品种。 因为我们有已知品种的鸢尾花的测量数据,所以这是一个监督学习问题。在这个问题中, 我们要在多个选项中预测其中一个(鸢尾花的品种)。这是一个分类(classification)问题 的示例。可能的输出(鸢尾花的不同品种)叫作类别(class)。数据集中的每朵鸢尾花都 属于三个类别之一,所以这是一个三分类问题。 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting
单个数据点(一朵鸢尾花)的预期输出是这朵花的品种。对于一个数据点来说,它的品种 叫作标签(label)。 1.7.1初识数据 本例中我们用到了鸢尾花(1s)数据集,这是机器学习和统计学中一个经典的数据集。它 包含在scikit-learn的datasets模块中。我们可以调用load_iris函数来加载数据: In[10]: from sklearn.datasets import load_iris iris_dataset load_iris() Load_iris返回的iris对象是一个Bunch对象,与字典非常相似,里面包含键和值: In[11]: print("Keys of iris_dataset:\n{]".format(iris_dataset.keys())) 0ut[11]: Keys of iris dataset: dict_keys(['target_names','feature_names','DESCR','data','target']) DESCR键对应的值是数据集的简要说明。我们这里给出说明的开头部分(你可以自己查看 其余的内容): In[12]: print(iris_dataset['DESCR'][:193]"\n...") 0ut[12]: Iris Plants Database Notes Data Set Characteristics: Number of Instances:150 (50 in each of three classes) Number of Attributes:4 numeric,predictive att target_names键对应的值是一个字符串数组,里面包含我们要预测的花的品种: In[13]: print("Target names:{)"format(iris_dataset['target_names'])) 0ut[13]: Target names:['setosa''versicolor''virginica'] feature_names键对应的值是一个字符串列表,对每一个特征进行了说明: In[14]: print("Feature names:\n{]".format(iris_dataset['feature_names']) 12|第1章
12 | 第 1 章 单个数据点(一朵鸢尾花)的预期输出是这朵花的品种。对于一个数据点来说,它的品种 叫作标签(label)。 1.7.1 初识数据 本例中我们用到了鸢尾花(Iris)数据集,这是机器学习和统计学中一个经典的数据集。它 包含在 scikit-learn 的 datasets 模块中。我们可以调用 load_iris 函数来加载数据: In[10]: from sklearn.datasets import load_iris iris_dataset = load_iris() load_iris 返回的 iris 对象是一个 Bunch 对象,与字典非常相似,里面包含键和值: In[11]: print("Keys of iris_dataset: \n{}".format(iris_dataset.keys())) Out[11]: Keys of iris_dataset: dict_keys(['target_names', 'feature_names', 'DESCR', 'data', 'target']) DESCR 键对应的值是数据集的简要说明。我们这里给出说明的开头部分(你可以自己查看 其余的内容): In[12]: print(iris_dataset['DESCR'][:193] + "\n...") Out[12]: Iris Plants Database ==================== Notes ---- Data Set Characteristics: :Number of Instances: 150 (50 in each of three classes) :Number of Attributes: 4 numeric, predictive att ... ---- target_names 键对应的值是一个字符串数组,里面包含我们要预测的花的品种: In[13]: print("Target names: {}".format(iris_dataset['target_names'])) Out[13]: Target names: ['setosa' 'versicolor' 'virginica'] feature_names 键对应的值是一个字符串列表,对每一个特征进行了说明: In[14]: print("Feature names: \n{}".format(iris_dataset['feature_names']))
书籍下载qq群6089740钉钉群21734177 IT书籍http:/九.cn/RDIAj5D 0ut[14]: Feature names: ['sepal length (cm)','sepal width (cm)','petal length (cm)', 'petal width (cm)'] 数据包含在target和data字段中。data里面是花萼长度、花萼宽度、花瓣长度、花瓣宽 度的测量数据,格式为NumPy数组: In[15]: print("Type of data:{]"format(type(iris_dataset['data']))) 0ut[15]: Type of data:<class 'numpy.ndarray'> data数组的每一行对应一朵花,列代表每朵花的四个测量数据: In[16]: print("Shape of data:{]"format(iris_dataset['data'].shape)) 0ut[16]: Shape of data:(150,4) 可以看出,数组中包含150朵不同的花的测量数据。前面说过,机器学习中的个体叫作样 本(sample),其属性叫作特征(feature)。data数组的形状(shape)是样本数乘以特征 数。这是scikit-learn中的约定,你的数据形状应始终遵循这个约定。下面给出前5个样 本的特征数值: In[17]: print("First five rows of data:\n{]".format(iris_dataset['data'][:5])) 0ut[17]: First five rows of data: [5.13.51.40.2] [4.93.1.40.2] 4.73.21.30.2] [4.63.11.50.2] [5.3.61.40.2] 从数据中可以看出,前5朵花的花瓣宽度都是0.2cm,第一朵花的花萼最长,是5.1cm。 target数组包含的是测量过的每朵花的品种,也是一个NumPy数组: In[18]: print("Type of target:{]"format(type(iris_dataset['target']))) 0ut[18]: Type of target:<class 'numpy.ndarray'> target是一维数组,每朵花对应其中一个数据: In[19]: print("Shape of target:{]"format(iris_dataset['target'].shape)) 引言113 电子书寻找看手相钉钉或微信pythontesting
引言 | 13 Out[14]: Feature names: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 数据包含在 target 和 data 字段中。data 里面是花萼长度、花萼宽度、花瓣长度、花瓣宽 度的测量数据,格式为 NumPy 数组: In[15]: print("Type of data: {}".format(type(iris_dataset['data']))) Out[15]: Type of data: <class 'numpy.ndarray'> data 数组的每一行对应一朵花,列代表每朵花的四个测量数据: In[16]: print("Shape of data: {}".format(iris_dataset['data'].shape)) Out[16]: Shape of data: (150, 4) 可以看出,数组中包含 150 朵不同的花的测量数据。前面说过,机器学习中的个体叫作样 本(sample),其属性叫作特征(feature)。data 数组的形状(shape)是样本数乘以特征 数。这是 scikit-learn 中的约定,你的数据形状应始终遵循这个约定。下面给出前 5 个样 本的特征数值: In[17]: print("First five rows of data:\n{}".format(iris_dataset['data'][:5])) Out[17]: First five rows of data: [[ 5.1 3.5 1.4 0.2] [ 4.9 3. 1.4 0.2] [ 4.7 3.2 1.3 0.2] [ 4.6 3.1 1.5 0.2] [ 5. 3.6 1.4 0.2]] 从数据中可以看出,前 5 朵花的花瓣宽度都是 0.2cm,第一朵花的花萼最长,是 5.1cm。 target 数组包含的是测量过的每朵花的品种,也是一个 NumPy 数组: In[18]: print("Type of target: {}".format(type(iris_dataset['target']))) Out[18]: Type of target: <class 'numpy.ndarray'> target 是一维数组,每朵花对应其中一个数据: In[19]: print("Shape of target: {}".format(iris_dataset['target'].shape)) 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting
0ut[19]: Shape of target:(150,) 品种被转换成从0到2的整数: In[20]: print("Target:\n{)".format(iris_dataset['target'])) 0ut[20]: Target: [00000000000000000000000000000000000日0 000日000000000111111111111111111111111 1111111111111111111111111122222222222 2222222222222222222222222222222222222 22] 上述数字的代表含义由iris['target_names']数组给出:0代表setosa,1代表versicolor, 2f代表virginica。 1.7.2 衡量模型是否成功:训练数据与测试数据 我们想要利用这些数据构建一个机器学习模型,用于预测新测量的鸢尾花的品种。但在将 模型应用于新的测量数据之前,我们需要知道模型是否有效,也就是说,我们是否应该相 信它的预测结果。 不幸的是,我们不能将用于构建模型的数据用于评估模型。因为我们的模型会一直记住整 个训练集,所以对于训练集中的任何数据点总会预测正确的标签。这种“记忆”无法告诉 我们模型的泛化(generalize)能力如何(换句话说,在新数据上能否正确预测)。 我们要用新数据来评估模型的性能。新数据是指模型之前没有见过的数据,而我们有这 些新数据的标签。通常的做法是将收集好的带标签数据(此例中是150朵花的测量数据) 分成两部分。一部分数据用于构建机器学习模型,叫作训练数据(training data)或训练 集(training set).。其余的数据用来评估模型性能,叫作测试数据(test data)、测试集(test set)或留出集(hold-out set). scikit-Learn中的train_test_split函数可以打乱数据集并进行拆分。这个函数将75%的 行数据及对应标签作为训练集,剩下25%的数据及其标签作为测试集。训练集与测试集的 分配比例可以是随意的,但使用25%的数据作为测试集是很好的经验法则。 scikit-learn中的数据通常用大写的X表示,而标签用小写的y表示。这是受到了数学 标准公式x)=y的启发,其中x是函数的输入,y是输出。我们用大写的X是因为数据是 一个二维数组(矩阵),用小写的y是因为目标是一个一维数组(向量),这也是数学中 的约定。 对数据调用train_test_split,并对输出结果采用下面这种命名方法: In[21]: from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test train_test_split( iris_dataset['data'],iris_dataset['target'],random_state=0) 14|第1章
14 | 第 1 章 Out[19]: Shape of target: (150,) 品种被转换成从 0 到 2 的整数: In[20]: print("Target:\n{}".format(iris_dataset['target'])) Out[20]: Target: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] 上述数字的代表含义由 iris['target_names'] 数组给出:0 代表 setosa,1 代表 versicolor, 2 代表 virginica。 1.7.2 衡量模型是否成功:训练数据与测试数据 我们想要利用这些数据构建一个机器学习模型,用于预测新测量的鸢尾花的品种。但在将 模型应用于新的测量数据之前,我们需要知道模型是否有效,也就是说,我们是否应该相 信它的预测结果。 不幸的是,我们不能将用于构建模型的数据用于评估模型。因为我们的模型会一直记住整 个训练集,所以对于训练集中的任何数据点总会预测正确的标签。这种“记忆”无法告诉 我们模型的泛化(generalize)能力如何(换句话说,在新数据上能否正确预测)。 我们要用新数据来评估模型的性能。新数据是指模型之前没有见过的数据,而我们有这 些新数据的标签。通常的做法是将收集好的带标签数据(此例中是 150 朵花的测量数据) 分成两部分。一部分数据用于构建机器学习模型,叫作训练数据(training data)或训练 集(training set)。其余的数据用来评估模型性能,叫作测试数据(test data)、测试集(test set)或留出集(hold-out set)。 scikit-learn 中的 train_test_split 函数可以打乱数据集并进行拆分。这个函数将 75% 的 行数据及对应标签作为训练集,剩下 25% 的数据及其标签作为测试集。训练集与测试集的 分配比例可以是随意的,但使用 25% 的数据作为测试集是很好的经验法则。 scikit-learn 中的数据通常用大写的 X 表示,而标签用小写的 y 表示。这是受到了数学 标准公式 f(x)=y 的启发,其中 x 是函数的输入,y 是输出。我们用大写的 X 是因为数据是 一个二维数组(矩阵),用小写的 y 是因为目标是一个一维数组(向量),这也是数学中 的约定。 对数据调用 train_test_split,并对输出结果采用下面这种命名方法: In[21]: from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( iris_dataset['data'], iris_dataset['target'], random_state=0)