第1章 引言
机器学习是人数据中提取知识,它是统计学,人工智能和计算机科学交叉的研究领域,也被称为预测分析或统计学习。本章将解释机器学习如此流行的原因,并探讨机器学习可以解决哪些类型的问题。然后将向你展示如何构建第一个机器学习模型,同时介绍一些重要的概念。
1.1 为何选择机器学习
人为制订规制有两个特点:
- 所需要的逻辑只适用于单一领域和单项任务。任务稍有变化,都 可能需要重写整个系统。
- 制定规则,需要对人类专家的决策过程有深刻的理解。
这种人为制订规则的方法并不适用的一个例子就是图像中的人脸检测,有了机器学习,仅向程序输入海量人脸图像,就足以让算法确定识别人脸需要哪些特征。
1.1.1 机器学习能够解决的问题
监督机器学习任务如识别信封上手写的邮政编码、基于医学影像判断肿瘤是否为良性、检测信用卡交易中的诈骗行为等
无监督机器学习任务如 确定一系列博客文章的主题、将客户分成具体有相似偏好的群组、检测网站的异常访问模式等
无论是监督学习还是无监督学习任务,将输入数据表征为计算机的可以理解的形式都是十分重要的。第一行数据称为一个样本sample或数据点,每一列称为特征feature。如何构建良好的数据表征,被称为特征提取或特征工程。
1.1.2 熟悉任务和数据
机器学习过程中,最重要的是很可能是理解你正在处理的数据,以及这些数据与你想要解决的任务之间的关系。
1.2 为何选择Python
Python已经成为许多 数据科学应用的通用语言。它既有通用编程语言的强大功能,也有特定领域脚本语言的易用性。在数据加载、可视化、统计、自然语言处理、图像处理等 各种有的库。
机器学习和数据分析本质上都 是迭代过程,由数据驱动分析。这些过程必须要有快速迭代和易于交互 的工具。
1.3 scikit-learn
这是一个开源项目,它包含许多目前最先进的机器学习算法,第个算法都有完备的文档。广泛应用于工业界和学术界
scilit-learn依赖于另外两个Python包:NumPy和SciPy。
荐三个发行版的工具,它们都 包含了本书所需的库: Anaconda; Enthought Canopy ; Python(X,Y)
1.4 必要的库和工具
1.4.1 Jupyther Notebook
1.4.2 NumPy
是Python科学计算的基础包之一,包括多维数组、高级数学函数、及伪随机数生成器。
import numpy as np
x = np.array([[1,2,3],[4,5,6]])
print(x)
[[1 2 3]
[4 5 6]]
1.4.3 SciPy
它是科学计算的函数集合,具有线性代数高级程序、数学函数优化、信号处理、特殊数学函数和统计分布等功能。
from scipy import sparse
eye = np.eye(4) # 创建对角线数组
print(eye)
sparse_matrix = sparse.csr_matrix(eye)
print(sparse_matrix)
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
(0, 0) 1.0
(1, 1) 1.0
(2, 2) 1.0
(3, 3) 1.0
1.4.4 matplotlib
是Python的主要科学绘图库,用于发布可视化的内容,如 拆线图、直方图、散点图等。
%matplotlib inline
from preamble import *
import matplotlib.pyplot as plt
x = np.linspace(-10,10,100)
y = np.sin(x)
plt.figure(figsize=(10,6))
plt.plot(x,y,marker='x');
plt.suptitle("图1-1 用matplotlib画出正弦函数的简单曲线图",y=0.05,fontsize=18);
1.4.5 pandas
是用于处理和分析数据的Python库,基于DataFrame的数据结构,可以认为一张表格,类似于Excel表格。pandas提供了修改表格、操作表格的方法,尤其是可以像SQL一样对表格进行查询和连接。还能从 其它格式的文件和数据库中提取数据。
import pandas as pd
from IPython.display import display
data = {'Name':['Jhon','Anna','Peter','Linda'],
'Location':['New York','Paris','Berlin','London'],
'Age':[24,13,53,33]}
data_pandas = pd.DataFrame(data)
display(data_pandas)
display(data_pandas[data_pandas.Age > 30 ])
Name | Location | Age | |
---|---|---|---|
0 | Jhon | New York | 24 |
1 | Anna | Paris | 13 |
2 | Peter | Berlin | 53 |
3 | Linda | London | 33 |
Name | Location | Age | |
---|---|---|---|
2 | Peter | Berlin | 53 |
3 | Linda | London | 33 |
1.4.6 mglearn
本书所附的库,包含一些数据或绘图函数。
1.5 Python2 和 Python3 的对比
1.6 本书用到的库的版本
import sys ;print("python version:",sys.version)
import sklearn; print("scikit-learn version",sklearn.__version__)
import matplotlib as mpl;print("matplotlib",mpl.__version__)
import pandas as pd ; print("pandas",pd.__version__)
import numpy as np; print("numpy",np.__version__)
import scipy as sp; print("scipy",sp.__version__)
import IPython as ip; print("IPython",ip.__version__)
import mglearn
python version: 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018,
13:32:41) [MSC v.1900 64 bit (AMD64)]
scikit-learn version 0.19.1
matplotlib 2.2.2
pandas 0.23.0
numpy 1.14.5
scipy 1.1.0
IPython 6.4.0
第一个应用: 鸢尾花分类
目标是构建一个机器学习模型,从已经品种的鸢尾花测量数据中进行学习,从而能预测新鸢尾花的品种。
花瓣 Petal 花萼 Sepal
图1-2 鸢尾花
1.7.1 初识数据
from sklearn.datasets import load_iris
iris_dataset = load_iris()
print("keys of iris_dataset: \n{}".format(iris_dataset.keys() ))
keys of iris_dataset:
dict_keys(['data', 'target', 'target_names', 'DESCR',
'feature_names'])
print(iris_dataset['DESCR'][:193]+"\n...")
Iris Plants Database
====================
Notes
-----
Data Set Characteristics:
:Number of Instances: 150 (50 in each of three classes)
:Number of Attributes: 4 numeric, predictive att
...
print("Target names:{}".format(iris_dataset['target_names']))
#即分别为山鸢尾花,变色鸢尾花和维吉尼亚鸢尾花。
Target names:['setosa' 'versicolor' 'virginica']
print("Feature names:\n{}".format(iris_dataset['feature_names']))
Feature names:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',
'petal width (cm)']
print("Type of data:{}".format(type(iris_dataset['data'])))
print("Shape of data:{}".format(iris_dataset['data'].shape))
print("First 10 rows of data:\n{}".format(
iris_dataset['data'][:10]))
Type of data:<class 'numpy.ndarray'>
Shape of data:(150, 4)
First 10 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.4 3.9 1.7 0.4]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[4.9 3.1 1.5 0.1]]
print("Type of target:{}".format(type(iris_dataset['target'])))
print("Shape of target:{}".format(iris_dataset['target'].shape))
print("First10 rows of target:\n",iris_dataset['target'])
# 0,1,2 Target names:['setosa' 'versicolor' 'virginica']
Type of target:<class 'numpy.ndarray'>
Shape of target:(150,)
First 10 rows of 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]
1.7.2 衡量模型是否成功:训练数据与测试数据
scikit-learn的train_test_split函数可以打乱数据集并进行拆分。
from sklearn.model_selection import train_test_split
#打乱数据,并拆分 75%是训练数据, 25%是 测试数据
X_train,X_test,y_train,y_test =rain_test_split(
iris_dataset['data'],
iris_dataset['target'],
random_state=0)
print(X_train[:10],y_train[:10])
[[5.9 3. 4.2 1.5]
[5.8 2.6 4. 1.2]
[6.8 3. 5.5 2.1]
[4.7 3.2 1.3 0.2]
[6.9 3.1 5.1 2.3]
[5. 3.5 1.6 0.6]
[5.4 3.7 1.5 0.2]
[5. 2. 3.5 1. ]
[6.5 3. 5.5 1.8]
[6.7 3.3 5.7 2.5]]
[1 1 2 0 2 0 0 1 2 2]
1.7.3 要事第一:观察数据
iris_dataframe = pd.DataFrame(X_train,columns=iris_dataset.feature_names);
grr = pd.plotting.scatter_matrix(iris_dataframe,c=y_train,
figsize=(15,15),
marker='o',
hist_kwds='bins':20},
cmap=mglearn.cm3);
plt.suptitle("图1-3 Iris数据集的散点图矩阵,
按类别标签着色",y=0.07,fontsize=18);
1.7.4 构建第一个模型:K邻近算法
print(X_test[:10],y_test[:10])
[[5.8 2.8 5.1 2.4]
[6. 2.2 4. 1. ]
[5.5 4.2 1.4 0.2]
[7.3 2.9 6.3 1.8]
[5. 3.4 1.5 0.2]
[6.3 3.3 6. 2.5]
[5. 3.5 1.3 0.3]
[6.7 3.1 4.7 1.5]
[6.8 2.8 4.8 1.4]
[6.1 2.8 4. 1.3]]
[2 1 0 2 0 2 0 1 1 1]
# 数据训练
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train,y_train)
KNeighborsClassifier(algorithm='auto',leaf_size=30,
metric='minkowski',
n_neighbors=1,p=2,weights='uniform')
KNeighborsClassifier(algorithm='auto', leaf_size=30,
metric='minkowski',
metric_params=None, n_jobs=1,
n_neighbors=1, p=2,
weights='uniform')
1.7.5 做出预测
# 预测
X_new =np.array([[5,2.9,1,0.2]])
prediction = knn.predict(X_new)
print(prediction)
print(iris_dataset['target_names'][prediction])
[0]
['setosa']
1.7.6 评估模型
# 评估
y_pred = knn.predict(X_test)
print(y_pred)
[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]
print(np.mean(y_pred==y_test))
0.9736842105263158
knn.score(X_test,y_test)
0.9736842105263158
1.8 小结与展望
首先简要介绍了机器学习及其应用,然后讨论了监督学习和无监督学习之间的区别,并简要介绍了本书将会用到的工具。随后,我们构思了一项任务,利用鸢尾花的物理测量数据来预测其品种。我们在构建模型时用到了由专家标注过的测量数据集,专家已经给出了花的正确品种,因此这是一个监督学习问题。一共有三个品种:山尾鸢花、变色鸢尾花和维吉尼亚鸢尾花(setosa versicolor virginica),这是一个多分类问题。在分类问题中,可能的品种被称为类别,每朵花的品种被称为它的标签。
鸢尾花iris数据集包含两个NumPy数组:一个包含数据,在scikit-learn中被称为X;一个包含正确的输出或预期输出,称为y。数组X是特征的二维数组,每个数据点对应一行,每个特征对应一列。数组y是一维数组,里面包含一个类别标签,对每个样本都是一个0到2之间的整数。
我们将数据集分成训练集training set和测试集test set,前者用于构建模型,后者用于评估模型对前所未见的新数据的泛化能力。
我们选择了K近邻分类算法,根据新数据点在训练集中距离最近的邻居来进行预测。该算法在KNeighborsClassifier类中实现,里面既包含构建模型的算法,也包含利用模型进行预测的算法。将类实例化,并设定参数,然后调用fit方法来构建模型,传入训练数据X_train和训练输出y_train作为参数。我们用score方法用来评估模型,该方法计算的是模型数度。
下面汇总了整个训练和评估过程所必须的代码,该模型在测试集上97%的测试精度:
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)
knn.fit(X_train,y_train)
print("Test set score:{0:.2f}".format(knn.score(X_test,y_test)))
Test set score:0.97