第5章
Scikit-learn 
单机机器学习

Scikit-learn是时下非常流行的基于Python语言的单机(单核/多核CPU)机器学习
工具。如图5.cikit-learn几乎涵盖了所有经典的机器学习算法,包括分类

1所示,S(Clasification)、回归(Regresion)、聚类(Clustering)、降维(DimensionalityReduction) 
等。除此之外,Scikit-learn还集成了特征提取、数据处理和模型评估等其他重要的机器
学习相关功能。


图5.n主要机器学习模型的全景图(图片引用自Sn官网)(见彩插)

1 
Scikit-learcikit-lear


第
5 
章 Scikit-learn 
单机机器学习99 

Scikit-learn在2007 年成为Google夏季编程大赛的种子项目,并于2010 年2月1日
首次公开发布,至今已经历经了十余年的蓬勃发展。作为Python的重要机器学习程序库
之一,Scikit-learn的功能十分强大,内容全面,简单易用,而且支持跨平台运行,使得大量
初学者都能够快速上手。

本章将尽可能全面地选取Scikit-learn中最为常用的单机机器学习功能,从一些经典
的案例出发,向读者介绍足以理解并实践本书全部代码所需的Scikit-learn单机机器学习
知识。


5.1 Scikit-learn 
环境配置
为了本章的机器学习基础实践,我们创建一个新的虚拟环境,命名为python_ml 
(PythonMachineLearning的缩写)。除了必要性地安装NumPy、SciPy、pandas、
Matplotlib等程序库之外,这个虚拟环境中还需要搭建和配置Scikit-learn,为后续基于
Python进行机器学习实践奠定基础。

如图5.2所示,在Windows或者macOS 系统中,可以直接使用AnacondaNavigator, 
借助图形化的界面操作创建虚拟环境python_ml;与此同时,指定新环境的Python解释
器版本为3.

8。


图52 
使用Aaodaitr创建用于机器学习的虚拟环境pto_ml,并使用Phn38作为解释器

.ncnaNvgaoyhnyto.


100Python机器学习及实践——从零开始通往Kaggle竞赛之路(2022年度版)
另外,在Windows、macOS,以及Ubuntu系统中,也可以通过在命令行/终端中输入
命令c_8创建新的虚拟环境。

ondacreate-npythonmlpython=3.

虚拟环境python_ml创建好之后,我们可以在命令行/终端中使用命令conda 
aciaepyhn_ml切换到新的虚拟环境,3所示, to8

tvtto并且如图5.在新虚拟环境的Pyhn3.
解释器中尝试导入Scikit-learn程序库①。运行的结果证明,作为一个新建的虚拟环境,其
8解释器并不会预装Sn。

Python3.cikit-lear


图5.虚拟环境p_ml的Py8解释器没有预装S

3 
ythonthon3.cikit-learn 

接下来,我们将分别演示如何使用Ancnvgtr和cna命令在Pyhn3.

aodaNaiaoodto8 
解释器中安装Scikit-learn程序库。

5.1 
ncnaigatr搭建和配置环境
1.使用AaodaNvo
如图5.4所示,在AnacondaNavigator中首先切换到名称为python_ml的虚拟环境。
然后,在右侧的程序库中搜索scikit-learn,并且直接按照后续提示进行安装,即可配置好
最新版本的Scikit-learn程序库。

5.1.2 
使用conda命令搭建和配置环境
如图5.5所示,我们也可以在Windows的命令行或者macOS/Ubuntu系统的终端
中,首先切换到名称为pythonml的虚拟环境,然后使用conda命令condainstalscikitler==24.配置(_) 24.cktlan程序库②。

an0.2自动安装和好版本号为0.2的Sii-er
为了校验我们是否成功在虚拟环境pyl的Py8解释器中安装好了

thon_mthon3.
Scikit-learn程序库,可以在Python解释器中输入代码importsklearn,尝试导入Scikit

①Scikit-learn程序库在Python中的导入名称为sklear

② 本书使用版本号为0.2的Sii-ern。
24.cktlan程序库。

第
5 
章 Scikit-learn 
单机机器学习101 


图5.在虚拟环境p_ml中,使用Ar搭建和配置S

4 
ythonnacondaNavigatocikit-learn 


图5.在虚拟环境pyl中使用ca命令搭建和配置S

5 
thon_mondcikit-learn 


102Python机器学习及实践——从零开始通往Kaggle竞赛之路(2022年度版)
n程序库。结果如图5.6所示,安装成功的Sn版本号为0.2。

learcikit-lear24.


图5.在虚拟环境p_ml的Py8解释器中尝试导入Sn,验证环境搭建是否成功

6 
ythonthon3.cikit-lear


5.2 Scikit-learn 
无监督学习
无监督学习(UnsupervisedLearning)着重于发现数据本身内在的分布特点,不需要
对数据进行人工标注。

从功能的角度讲,无监督学习模型可以帮助我们对特征维度非常高的数据样本实施
降维处理,保留那些最具有区分性的特征;同时,也使我们能够在三维空间中尽可能可视
化地观察这些数据,甚至去发现数据的聚类效果。

本节采用经典的iris(鸢尾花)数据集探讨和实践Scikit-learn中有关无监督学习的各
项能力,包括数据特征降维、数据可视化,以及数据聚类等。

如图5.7所示,iris数据集收录了3种常见的鸢尾品种,每种50 朵,共150 朵花的样
本数据。其中,每一朵鸢尾被记录了4个维度的特征,分别是花瓣的长和宽,以及花萼的
长和宽。

2.降维学习与可视化
5.1 

降维学习指采用某种映射方法,将原本在高维(大于3维)空间中的数据点映射到低
维度,甚至是可观察(小于3维)的空间中。降维学习的本质是学习一个映射函数f(
=y, 
x 
是原始数据点的向量表达形式;
x)

其中,
y 
是数据点映射后的低维向量表达。我们之
所以使用降维后的数据表示,是因为在原始数据的高维空间中,极有可能包含冗余的特征
或者噪声信息。

(1)特征冗余指一些特征之间具有非常强的相关性,即知道其中一种特征的变化趋
势,就可以立刻知道其他特征的变化(如正方形的边长与面积、周长都呈现正相关)。只要
保留其中一种特征,就能在保证原有数据分布和信息的情况下有效简化数据,后面的模型

第5章 Scikit-learn单机机器学习103
图5.7 
iris数据集的样本数量、特征名称以及类别标签情况

学习也会因此减少大量时间和空间开销。降维的最终目标是保证各个特征维度之间线性

无关
(
。
2)噪声会为机器学习模型的训练带来不必要的误差,减弱模型最终的学习效果。
因此,我们希望能够通过降维减少冗余信息和噪声带来的误差,同时也希望借助可视化能
力来寻找数据内部的本质结构特征。

1.主成分分析
主成分分析,顾名思义,就是找出数据中最主要的方面,用数据中最主要的方面来代
替原始数据。主成分分析(PrincipalComponentAnalysis,PCA)是一种统计方法,它通过
正交变换将一组可能存在相关性的数据转换为一组线性不相关的特征,转换后的这组变
量叫主成分。这样一来,多组可能存在相关性的数据被压缩到维度更小,但是更具有区分
度的特征上。所以,主成分分析是最重要的降维方法之一,在数据压缩消除冗余和数据噪
声消除等领域都有着十分广泛的应用。

代码5.ckitlean的主成分分析算法, rs数据集的四维数据

1展示了如何使用Si-r将ii
特征降低(压缩)到二维,并使用Matplotlib进行数据可视化。


1 04 Python 机器学习及实践——从零开始通往Kaggle 竞赛之路(2022 年度版) 
代码5.1 使用Scikit-learn的主成分分析对数据特征进行降维
In[*]: from sklearn.datasets import load_iris 
#读取iris 数据集
X, y=load_iris(return_X_y=True) 
In[*]: from sklearn.preprocessing import StandardScaler 
#初始化数据标准化处理器
ss=StandardScaler() 
#标准化数据特征
X=ss.fit_transform(X) 
.................................................................................. 
In[*]: from sklearn.decomposition import PCA 
#初始化主成分分析器,设定降维维度为2 
pca=PCA(n_components=2) 
#对数据特征进行降维处理
X=pca.fit_transform(X) 
.................................................................................. 
In[*]: from matplotlib import pyplot as plt 
colors =['red', 'blue', 'green'] 
markers =['o', '^', 's'] 
plt.figure(dpi=150) 
#可视化降维的数据
for i in range(len(X)): 
plt.scatter(X[i, 0], X[i, 1], c=colors[y[i]], marker=markers[y[i]]) 
plt.show() 
.................................................................................. 
..................................................................................

第5 章 Sciki-t learn 单机机器学习1 05 
..Ou..t[..*..]:.......................................................................... 
2.Isomap算法
Isomap算法曾发表在超一流期刊Science上。作为一种降维算法,它的核心在于发
现并利用流形空间的特点,引入测地线距离,提出对应的距离计算方法。如图5.8所示, 
一个流形空间就像一块卷起来的布,对这个流形空间的降维就像是将这块布展开到一个
图5.8 Isomap算法解决三维流形分布数据的二维降维问题(见彩插)

1 06 Python 机器学习及实践——从零开始通往Kaggle 竞赛之路(2022 年度版) 
二维平面,同时我们希望展开后的布能够在局部保持布的结构特征,也就是将其展开的过
程,具体而言,就像两个人将其拉开一样。
在Isomap算法中引入了一个测地线的概念。在距离度量定义时,测地线可以定义
为空间中两点的局域最短路径。形象地讲,在一个球面上,两点之间的测地线就是经过这
两个点的大圆的弧线。对于非线性流形,Isomap算法则是通过构建邻接图,利用图上的
最短距离来近似测地线。Isomap算法在降维后,希望保持样本之间的测地距离而不是欧
氏距离,因为测地距离更能反映样本之间在流形中的真实距离。
代码5.2展示了如何使用Scikit-learn的Isomap算法将iris数据集的四维数据特征
降低(压缩)到二维,并使用Matplotlib进行数据可视化。
代码5.2 使用Scikit-learn的Isomap算法对数据特征进行降维
In[*]: from sklearn.datasets import load_iris 
#读取iris 数据集
X, y=load_iris(return_X_y=True) 
In[*]: from sklearn.preprocessing import StandardScaler 
#初始化数据标准化处理器
ss=StandardScaler() 
#标准化数据特征
X=ss.fit_transform(X) 
.................................................................................. 
In[*]: from sklearn.manifold import Isomap 
#初始化Isomap,设定降维维度为2 
isomap=Isomap(n_components=2) 
#对数据特征进行降维处理
X=isomap.fit_transform(X) 
.................................................................................. 
In[*]: from matplotlib import pyplot as plt 
colors =['red', 'blue', 'green'] 
..................................................................................

第5 章 Sciki-t learn 单机机器学习1 07 
markers =['o', '^', 's'] 
plt.figure(dpi=150) 
#可视化降维的数据
for i in range(len(X)): 
plt.scatter(X[i, 0], X[i, 1], c=colors[y[i]], marker=markers[y[i]]) 
plt.show() 
.................................................................................. 
..Ou..t[..*..]:.......................................................................... 
3.局部线性嵌入
局部线性嵌入(LocallyLinearEmbedding,LLE)算法与传统的PCA 等关注样本方
差的降维方法相比,更注重降维时保持样本局部的线性特征。由于LLE在降维时保持了
样本的局部特征,它被广泛用于图像识别,高维数据可视化等领域。
保持样本局部结构特征的方法有很多种,不同的保持方法对应不同的流形算法。例
如前文所述,Isomap算法在降维后,希望保持样本之间的测地距离而不是欧氏距离,因为
测地距离更能反映样本之间在流形中的真实距离。
但是等距映射算法有一个问题,就是它要找到所有样本全局的最优解,当数据量很
大,样本维度很高时,计算非常耗时。鉴于这个问题,LLE通过放弃所有样本全局最优的
降维,只是通过保证局部最优来降维。同时,假设样本集在局部是满足线性关系的,进一
步减少降维的计算量。
代码5.3展示了如何使用Scikit-learn的LLE算法,将iris数据集的四维数据特征降