第
3
章
机器学习库Scikit-learnScikit-learn是基于NumPy、SciPy和Matplotlib的开源Python机器学习
包,它封装了一系列数据预处理、机器学习算法、模型选择等工具,是数据分析
师首选的机器学习工具包。
自2007 年发布以来,Scikit-learn已经成为Python重要的机器学习库。
Scikit-learn简称Sklearn,支持包括分类、回归、降维和聚类四大机器学习算法, 
还包括了特征提取、数据处理和模型评估三大模块。

3.背景知识
1 

机器学习的编程语言没有限制,读者可选用自己熟悉的语言对算法进行实
现。本书的代码基于Python编写。回顾一下本书需要掌握的Python相关知
识,限于篇幅,本书不再对Python的使用进行详细讲解,仅列出使用Python进
行机器学习算法所需要掌握的知识点。

(1)Python环境的安装:包括安装Anaconda、Jupyter和PyCharm 。

(2)Python数据结构:列表、元组、集合、字典。

①列表是用来存储一连串元素的容器,用[] 来表示,其他元素类型可不
相同。
②元组与列表类似,元组中的元素也可进行索引计算,用() 来表示。二者
的区别是列表里面的元素值可以被修改,而元组中的元素值不可以被修改,只
能读取。
③集合有两个功能:一是进行集合操作;二是消除重复元素。集合的格式
是set(), 其中() 内可以是列表、字典或字符串。
④字典(dict)也称作关联数组,用{} 表示,使用键-值存储。
(3)Python控制流:顺序结构、分支结构、循环结构。
(4)Python函数:定义函数、调用函数、高阶函数。
(5)Python主要模块:NumPy、Pandas、SciPy、Matplotlib、Scikit-learn。
(6)NumPy:是一个用Python实现的科学计算扩展程序库。
(7)Pandas:是基于NumPy的一种工具,为解决数据分析任务而创建。
(8)SciPy:是一款为科学和工程设计的工具包,包括统计、优化、线性代数、

50机器学习入门基础(微课版) 
傅里叶变化等。
(9)Matplotlib:是一款2D绘图库,以各种硬拷贝格式和跨平台的交互式环境生成
绘图、直方图、功率谱、条形图等。
(10)Scikit-learn:Python重要的机器学习库。
Scikit-learn
概述
3.2Scikit-learn概述
Scikit-learn是基于Python语言的机器学习工具。它建立在NumPy、SciPy、Pandas 
和Matplotlib之上,里面的应用程序编程接口(applicationprogramminginterface,API) 
的设计非常好,所有对象的接口简单,很适合新手。
Scikit-learn库的算法主要有四类:分类、回归、聚类、降维。
(1)常用的回归:线性回归、决策树回归、SVM回归、KNN回归。集成回归:随机森
林、Adaboost、GradientBoosting、Bagging、ExtraTrees。
(2)常用的分类:线性分类、决策树、SVM、KNN,朴素贝叶斯。集成分类:随机森
林、Adaboost、GradientBoosting、Bagging、ExtraTrees。
(3)常用聚类:K均值(K-means)、层次聚类(hierarchicalclustering)、DBSCAN。
(4)常用降维:线性判别分析(lineardiscriminantanalysis,LDA )、PCA。
图3-1代表了Scikit-learn算法选择的一个简单路径,这个路径图代表:蓝色圆圈(见
彩插)是判断条件,绿色方框是可以选择的算法,可以根据自己的数据特征和任务目标去
找一条自己的操作路线。


图3-
1 
Scikit-learn算法选择路径图(见彩插) 

Scikit-learn中包含众多与数据预处理和特征工程相关的模块,但其实Scikit-learn六
大板块中有两块都是关于数据预处理和特征工程的,两个板块互相交互,为建模之前的全


第3章 机器学习库Scikit-learn 51 
部工程打下基础。
Scikit-learn 
主要用法1 
3.3 Scikit-learn主要用法
3.3.1 基本建模流程 
基本建模的符号标记如表3-1所示。
表3-1 符号标记
符 号代表含义
X_train 训练数据
X_test 测试数据
X 完整数据
y_train 训练集标签
y_test 测试集标签
y 数据标签 
y_pred 预测标签 
1.导入工具包
导入工具包的方法如下(这里使用伪代码)。 
from sklearn import 包名称
from sklearn.库名称import 包名称
代码示例如下。 
1. from sklearn import datasets, preprocessing 
2. #导入数据集,数据预处理库
3. from sklearn.model_selection import train_test_split 
4. #从模型选择库导入数据切分包
5. from sklearn.linear_model import LinearRegression 
6. #从线性模型库导入线性回归包
7. from sklearn.metrics import r2_score 
8. #从评价指标库导入R2 评价指标
2.导入数据
导入数据的方法如下。 
from sklearn.datasets import 数据名称
Scikit-learn支持以NumPy的arrays对象、Pandas对象、SciPy的稀疏矩阵及其他可

52 机器学习入门基础(微课版) 
转换为数值型arrays的数据结构作为其输入,前提是数据必须是数值型的。
sklearn.datasets模块提供了一系列加载和获取著名数据集如鸢尾花、波士顿房价、
Olivetti人脸、MNIST 数据集等的工具,也包括了一些toydata如S型数据等的生成
工具。
Scikit-learn内置了很多可以用于机器学习的数据,用两行代码就可以使用这些数
据。内置数据分为可以直接使用的自带数据集、需要下载的自带数据集及生成数据集。
1)可以直接使用的自带数据集
此类数据集可以直接导入使用数据,数据集和描述如表3-2所示。
表3-2 可以直接使用的自带数据集
数据集名称描 述类 型维 度
load_boston 波士顿房屋价格回归506×13 
fetch_california_housing 加州住房回归20640×9 
load_diabetes 糖尿病回归442×10 
load_digits 手写字分类1797×64 
load_breast_cancer 乳腺癌分类、聚类(357+212)×30 
load_iris 鸢尾花分类、聚类(50×3)×4 
load_wine 葡萄酒分类(59+71+48)×13 
load_linnerud 体能训练多分类20 
2)需要下载的自带数据集
此类数据集第一次使用,需要联网下载数据,数据集和描述如表3-3所示。
表3-3 需要下载的自带数据集
数据集名称描 述
fetch_20newsgroups 
用于文本分类、文本挖掘和信息检索研究的国际标准数据集之一,数
据集收集了大约20000个新闻组文档,均匀分为20个不同主题的新
闻组集合,返回一个可以提取文本特征的提取器
fetch_20newsgroups_vectorized 这是上面这个文本数据向量化后的数据,返回一个已提取特征的文
本序列,即不需要使用特征提取器
fetch_california_housing 
加利福尼亚的房价数据,总计20640个样本,每个样本由8个属性表
示,房价作为target,所有属性值均为number,详情可调用
fetch_california_housing()['DESCR'],了解每个属性的具体含义
fetch_covtype 
森林植被类型,总计581012个样本,每个样本由54个维度表示(12 
个属性,其中2个分别是onehot4维和onehot40维),target表示植被
类型1~7,所有属性值均为number,详情可调用
fetch_covtype()['DESCR']了解每个属性的具体含义
fetch_kddcup99 
KDD竞赛在1999年举行时采用的数据集,KDD99数据集仍然是网
络入侵检测领域的事实Benckmark,为基于计算智能的网络入侵检测
研究奠定基础,包含41项特征

续表
第3章 机器学习库Scikit-learn 53 
数据集名称描 述
fetch_lfw_pairs 该任务称为人脸验证:给定一对两张图片,二分类器必须预测这两张
图片是否来自同一个人
fetch_lfw_people 打好标签的人脸数据集
fetch_mldata 从mldata.org中下载数据集
fetch_olivetti_faces Olivetti脸部图片数据集
fetch_rcv1 路透社新闻语聊数据集
fetch_species_distributions 物种分布数据集 
3)生成数据集
此类数据集可以用于分类任务、回归任务、聚类任务、流形学习、因子分解任务等。这
些函数产生样本特征向量矩阵及对应的类别标签集合,数据集和描述如表3-4所示。
表3-4 生成数据集
数据集名称描 述
make_blobs 多类单标签数据集,为每个类分配一个或多个正态分布的点集
make_classification 多类单标签数据集,为每个类分配一个或多个正态分布的点集,提供
了为数据添加噪声的方式,包括维度相关性、无效特征及冗余特征等
make_gaussian-quantiles 将一个单高斯分布的点集划分为两个数量均等的点集,作为两类
make_hastie-10-2 产生一个相似的二元分类数据集,有10个维度
make_circle和make_moons 产生二维二元分类数据集来测试某些算法的性能,可以为数据集添
加噪声,可以为二元分类器产生一些球形判决界面的数据 
代码示例如下。 
1. #导入内置的鸢尾花数据
2. from sklearn.datasets import load_iris 
3. iris = load_iris( ) 
4. #定义数据、标签
5. X = iris.data 
6. y = iris.target 
Scikit-learn 
主要用法2 
3.3.2 数据预处理
1.数据划分 
机器学习的数据,可以划分为训练集、验证集和测试集,也可以划分为训练集和测试
集(见图3-2)。
代码示例如下。

54 机器学习入门基础(微课版) 
图3-2 数据集划分 
1. from sklearn.model_selection import train_test_split 
2. X_train, X_test, y_train, y_test = train_test_split(X, y, random_state= 
12, stratify=y, test_size=0.3) 
3. #将完整数据集的70%作为训练集,30% 作为测试集,并使得测试集和训练集中各类别数据
的比例与原始数据集比例一致(stratify 分层策略),另外可通过设置shuffle= True 
提前打乱数据
2.数据变换操作
sklearn.preprocessing模块包含了数据变换的主要操作(见表3-5),数据变换的方法如下。 
from sklearn.preprocessing import 库名称
表3-5 使用Scikit-learn进行数据变换
预处理操作库 名 称
标准化StandardScaler 
最小最大标准化MinMaxScaler 
One-Hot编码OneHotEncoder 
归一化Normalizer 
二值化(单个特征转换) Binarizer 
标签编码LabelEncoder 
缺失值填补Imputer 
多项式特征生成PolynomialFeatures 
代码示例如下。 
1. #使用Scikit-learn 进行数据标准化
2. from sklearn.preprocessing import StandardScaler 
3. #构建转换器实例
4. scaler = StandardScaler( ) 
5. #拟合及转换
6. scaler.fit_transform(X_train) 
3.特征选择
特征选择的方法如下。

第3章 机器学习库Scikit-learn 55 
1. #导入特征选择库
2. from sklearn import feature_selection as fs 
. 过滤式(filter)。 
1. #保留得分排名前k 的特征(top k 方式) 
2. fs.SelectKBest(score_func, k) 
3. #交叉验证特征选择
4. fs.RFECV(estimator, scoring="r2") 
. 封装式(wrapper),结合交叉验证的递归特征消除法,自动选择最优特征个数。 
1. fs.SelectFromModel(estimator) 
. 嵌入式(embedded),从模型中自动选择特征,任何具有coef_ 或feature_ 
importances_的基模型都可以作为estimator参数传入。
Scikit-learn 
主要用法3 
3.3.3 监督学习算法
1.监督学习算法———回归 
常见的回归模型如表3-6所示。
表3-6 常见的回归模型
回归模型名称库 名 称
线性回归LinearRegression 
岭回归Ridge 
LASSO 回归Lasso 
ElasticNet回归ElasticNet 
决策树回归tree.DecisionTreeRegressor 
代码示例如下。 
1. #从线性模型库导入线性回归模型
2. from sklearn.linear_model import LinearRegression 
3. #构建模型实例
4. lr = LinearRegression(normalize=True) 
5. #训练模型
6. lr.fit(X_train, y_train) 
7. #做出预测
8. y_pred = lr.predict(X_test)

56 机器学习入门基础(微课版) 
2.监督学习算法———分类
常见的分类模型如表3-7所示。
表3-7 常见的分类模型
模型名称库 名 称
逻辑回归linear_model.LogisticRearession 
支持向量机svm.SVC 
朴素贝叶斯naive_bayes.GaussianNB 
KNN neighbors.NearestNeighbors 
随机森林ensemble.RandomForestClassifier 
GBDT ensemble.GradientBoostingClassifier 
代码示例如下。 
1. #从树模型库导入决策树
2. from sklearn.tree import DecisionTreeClassifier 
3. #定义模型
4. clf = DecisionTreeClassifier(max_depth=5) 
5. #训练模型
6. clf.fit(X_train, y_train) 
7. #使用决策树分类算法解决二分类问题,得到的是类别
8. y_pred = clf.predict(X_test) 
9. #y_prob 为每个样本预测为0 和1 类的概率
10. y_prob = clf.predict_proba(X_test) 
3.3.4 无监督学习算法
1.聚类算法 
sklearn.cluster模块包含了一系列无监督聚类算法,聚类使用的方法如下。 
from sklearn.cluster import 库名称
常见的聚类模型如表3-8所示。
表3-8 常见的聚类模型
模型名称库 名 称
K-means KMeans 
DBSCAN DBSCAN 
层次聚类AgglomerativeClustering 
谱聚类SpectralClustering

第3章 机器学习库Scikit-learn 57 
代码示例如下。 
1. #从聚类模型库导入KMeans 
2. from sklearn.cluster import KMeans 
3. #构建聚类实例
4. kmeans = KMeans(n_clusters=3, random_state=0) 
5. #拟合
6. kmeans.fit(X_train) 
7. #预测
8. kmeans.predict(X_test) 
2.降维算法
Scikit-learn中的降维算法都被包括在模块decomposition中,sklearn.decomposition 
模块本质上是一个矩阵分解模块。最常见的降维方法是PCA。
降维使用的方法如下。 
from sklearn.decomposition import 库名称
代码示例如下。 
1. #导入PCA 库
2. from sklearn.decomposition import PCA 
3. #设置主成分数量为3,n_components 代表主成分数量
4. pca = PCA(n_components=3) 
5. #训练模型
6. pca.fit(X) 
7. #投影后各个特征维度的方差比例(这里是3 个主成分) 
8. print(pca.explained_variance_ratio_) 
9. #投影后的特征维度的方差
10. print(pca.explained_variance_) 
3.3.5 评价指标
sklearn.metrics模块包含了一系列用于评价模型的评分函数、损失函数及成对数据
的距离度量函数。评价指标主要分为分类评价指标、回归评价指标等,表3-9列举了常见
的几种评价指标。
评价指标使用的方法如下。 
from sklearn.metrics import 库名称

58 机器学习入门基础(微课版) 
表3-9 常见评价指标
评价指标库 名 称使用范围
正确率accuracy_score 分类
精确率precision_score 分类
F1值f1_score 分类
对数损失log_loss 分类
混淆矩阵confusion_matrix 分类
含多种评价的分类报告classification_report 分类
均方误差MSE mean_squared_error 回归
平均绝对误差MAE mean_absolute_error 回归
决定系数R2 r2_score 回归 
代码示例如下。 
1. #从评价指标库导入准确率
2. from sklearn.metrics import accuracy_score 
3. #计算样本的准确率
4. accuracy_score(y_test, y_pred) 
5. #对于测试集而言,大部分函数都必须包含真实值y_test 和预测值y_pred 
3.3.6 交叉验证及超参数调优
1.交叉验证 
交叉验证的方法如图3-3所示,具体原理将在第7章讲解,本章仅讲解使用方法。
图3-3 交叉验证示意图
代码示例如下。 
1. #从模型选择库导入交叉验证分数
2. from sklearn.model_selection import cross_val_score

第3章 机器学习库Scikit-learn 59 
3. clf = DecisionTreeClassifier(max_depth=5) 
4. #使用5 折交叉验证对决策树模型进行评估,使用的评分函数为F1 值
5. scores = cross _ val _ score (clf, X _ train, y _ train, cv = 5, scoring = ' f1 _ 
weighted') 
此外,Scikit-learn提供了部分带交叉验证功能的模型类,如LogisticRegressionCV、
LassoCV 等,这些类包含CV 参数。
2.超参数调优
在机器学习中,超参数指无法从数据中学习而需要在训练前提供的参数。机器学习
模型的性能在很大程度上依赖于寻找最佳超参数集。
超参数调整一般指调整模型的超参数,这是一个非常耗时的过程。目前主要有3 种
最流行的超参数调整技术:网格搜索、随机搜索和贝叶斯搜索。其中,Scikit-learn内置了
网格搜索、随机搜索,本章进行简单讲解,其余调参方法如贝叶斯搜索,本章不进行讨论。
1)网格搜索
代码示例如下。 
1. #从模型选择库导入网格搜索
2. from sklearn.model_selection import GridSearchCV 
3. from sklearn import svm 
4. svc = svm.SVC( ) 
5. #把超参数集合作为字典
6. params = {'kernel':['linear', 'rbf'], 'C':[1, 10]} 
7. #进行网格搜索,使用了支持向量机分类器,并进行5 折交叉验证
8. grid_search = GridSearchCV(svc, params, cv=5) 
9. #模型训练
10. grid_search.fit(X_train, y_train) 
11. #获取模型最优超参数组合
12. grid_search.best_params_ 
在参数网格上进行穷举搜索,方法简单但是搜索速度慢(超参数较多时),且不容易找
到参数空间中的局部最优。
2)随机搜索
代码示例如下。 
1. #从模型选择库导入随机搜索
2. from sklearn.model_selection import RandomizedSearchCV 
3. from scipy.stats import randint 
4. svc = svm.SVC( ) 
5. #把超参数组合作为字典
6. param_dist = {'kernel':['linear', 'rbf'], 'C':randint(1, 20)}

60 机器学习入门基础(微课版) 
7. #进行随机搜索
8. random_search = RandomizedSearchCV(svc, param_dist, n_iter=10) 
9. #模型训练
10. random_search.fit(X_train, y_train) 
11. #获取最优超参数组合
12. random_search.best_params_ 
在参数子空间中进行随机搜索,选取空间中的100个点进行建模(可从scipy.stats常
见分布如正态分布norm、均匀分布uniform 中随机采样得到),时间耗费较少,更容易找
到局部最优。
3.4 Scikit-learn总结
Scikit-learn是基于Python语言的机器学习工具,它建立在NumPy、SciPy、Pandas 
和Matplotlib之上,被广泛地用于统计分析和机器学习建模等数据科学领域,其主要优
点如下。
(1)建模方便:用户通过Scikit-learn能够实现各种监督学习和非监督学习的模型, 
仅仅需要几行代码就可以实现。
(2)功能多样:使用Scikit-learn还能够进行数据的预处理、特征工程、数据集切分、
模型评估等工作。
(3)数据丰富:内置丰富的数据集,如泰坦尼克、鸢尾花等,还可以生成数据,非常方便。
Scikit-learn案例1 Scikit-learn案例2 Scikit-learn案例3 Scikit-learn案例4 
习题
一、回归模型练习(一) 
1.导入预置的波士顿房价数据集,设置房价为y,特征为X。 
1. from sklearn import datasets 
2. X, y = datasets.load_boston(return_X_y=True) 
2.设置30%的数据为测试集(2行代码)。

第3章 机器学习库Scikit-learn 61 
3.导入线性回归模型(1行代码)。 
4.用线性回归模型拟合波士顿房价数据集(1行代码)。 
5.用训练完的模型进行预测(1行代码)。 
6.输出线性回归模型的斜率和截距(2行代码)。
二、回归模型练习(二) 
1.导入预置的鸢尾花数据集,设置类别为y,特征为X。 
1. X,y = datasets.load_iris(return_X_y=True) 
2.设置30%的数据为测试集(2行代码)。 
3.导入逻辑回归模型(1行代码)。 
4.用逻辑回归模型拟合鸢尾花数据集(1行代码)。 
5.用训练完的模型进行预测(1行代码)。 
6.输出分类报告(2行代码)。

62机器学习入门基础(微课版) 
参考文献
[1] PEDREGOSAF,VAROQUAUXG,GRAMFORTA,etal.Scikit-learn:machinelearningin 
Python[J].JournalofMachineLearningResearch,2011,12:2825-2830.