![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/3ede223eb868435588437d18e31af318/bfa82193-a864-45cb-a26c-9c49f44e25a7.png?x-oss-process=image/resize,w_100,m_lfit)
![](https://cdn1.deepmd.net/bohrium/web/static/images/level-v2-4.png?x-oss-process=image/resize,w_50,m_lfit)
快速开始 Scikit-Learn|使用 Scikit-Learn 建立机器学习模型
©️ Copyright 2023 @ Authors
作者:阙浩辉 📨
日期:2023-05-09
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
🎯 本教程旨在快速掌握使用 scikit-learn 建立机器学习模型的范式周期。
一键运行,你可以快速在实践中检验你的想法。
丰富完善的注释,对于入门者友好。
在 Bohrium Notebook 界面,你可以点击界面上方蓝色按钮 开始连接
,选择 bohrium-notebook
镜像及任何一款节点配置,稍等片刻即可运行。
目标
了解 Scikit-Learn 在建立机器学习模型中的基础功能,并能够使用 Scikit-Learn 的范式快速建立机器学习模型。
在学习本教程后,你将能够:
- 使用 Scikit-Learn 快速创建某一类型的数据或加载现有数据。
- 对数据进行预处理,例如归一化与标准化,以及快速划分数据集。
- 进行特征选择的一些方法,例如过滤法、包装法及嵌入法。
- 使用 Scikit-Learn 的范式快速建立机器学习模型。
- 使用 sklearn.metric 来评价模型质量。
- 使用交叉验证以及自动查找最佳的评估器参数。
阅读该教程【最多】约需 30 分钟,让我们开始吧!
1.1 什么是 Scikit-Learn
Scikit-learn(曾叫做scikits.learn还叫做sklearn)是基于 SciPy 构建的用于Python编程语言的自由软件机器学习库。并在 3-Clause BSD许可证下分发。它的特征是具有各种分类、回归和聚类算法,包括支持向量机、随机森林、梯度提升、k-平均聚类和DBSCAN,它被设计协同于Python数值和科学库NumPy和SciPy。[1,2]
它具有如下显著特点[3]:
- 用于数据分析与预测的简单高效的工具
- 每个人都可以访问,并且可以在各种环境中重复使用
- 基于 NumPy、SciPy 和 matplotlib 构建
- 开源,商业上可用 - BSD 许可证
1.2 安装 Scikit-Learn
本教程是一个 Bohrium Notebook。Python 程序可直接在浏览器中运行,Bohrium 已安装 Scikit-Learn。这是学习和使用 Scikit-Learn 的好方法。
要按照本教程进行操作,请点击本页顶部的按钮,在 Bohrium Notebook 中运行本笔记本。
你可以点击界面上方蓝色按钮
开始连接
,选择bohrium-notebook:2023-02-28
镜像及任何一款计算机型,稍等片刻即可运行。若要运行笔记本中的所有代码,请点击左上角“ 运行全部单元格 ”。若要一次运行一个代码单元,请选择需要运行的单元格,然后点击左上角 “运行选中的单元格” 图标。
如果你的 Bohrium 镜像尚未安装 Scikit-Learn, 最方便的方法是通过 pip 安装:
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Requirement already satisfied: scikit-learn==1.2.0 in /opt/conda/lib/python3.8/site-packages (1.2.0) Requirement already satisfied: numpy>=1.17.3 in /opt/conda/lib/python3.8/site-packages (from scikit-learn==1.2.0) (1.22.4) Requirement already satisfied: scipy>=1.3.2 in /opt/conda/lib/python3.8/site-packages (from scikit-learn==1.2.0) (1.7.3) Requirement already satisfied: joblib>=1.1.1 in /opt/conda/lib/python3.8/site-packages (from scikit-learn==1.2.0) (1.2.0) Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn==1.2.0) (3.1.0) WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
如果你需要使用更特定于你的平台或包管理器的安装方法,你可以在这里查看更完整的安装说明。
1.2.0
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/7c4379d794a14c44920e06b4bd457595/14ad4c533d144208b1e2cd2b4a830387.png)
sklearn.datasets 模块提供了一系列加载和获取著名数据集如鸢尾花、波士顿房价、Olivetti人脸、MNIST数据集等的工具。
鸢尾花识别是一个经典的机器学习分类问题,它的数据样本中包括了4个特征变量,1个类别变量,样本总数为150。
它的目标是为了根据花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)、花瓣宽度(petal width)这四个特征来识别出鸢尾花属于山鸢尾(iris-setosa)、变色鸢尾(iris-versicolor)和维吉尼亚鸢尾(iris-virginica)中的哪一种。
2 数据预处理(以标准化和归一化举例)
在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”。
- 譬如梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经网络,无量纲化可以加快求解速度;
- 而在距离类模型,譬如K近邻,K-Means聚类中,无量纲化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。
- (一个特例是决策树和树的集成算法们,对决策树我们不需要无量纲化,决策树可以把任意数据都处理得很好。)
数据的无量纲化可以是线性的,也可以是非线性的。
线性的无量纲化包括中心化 (Zero-centered或者Mean-subtraction) 处理和缩放处理 (Scale)。
中心化的本质是让所有记录减去一个固定值,即让数据样本平移到某个位置。
缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。
当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间。
这个过程,就叫做数据归一化(Normalization,又称 Min-Max Scaling)。
注意,Normalization 是归一化,不是正则化,真正的正则化是 regularization,不是数据预处理的一种手段。
归一化之后的数据服从正态分布,公式如下:
手动来实现一个归一化
使用 sklearn 来实现归一化
当数据 (x) 按均值 (μ) 中心化后,再按标准差 (σ) 缩放,数据就会服从为均值为 0,方差为 1 的正态分布(即标准正态分布)
这个过程,就叫做数据标准化 (Standardization,又称 Z-score normalization),
公式如下:
[-0.125 9. ] [ 0.546875 35. ]
0.0 1.0
4 特征选择
当数据预处理完成后,我们需要选择有意义的特征输入机械学习的算法和模型中进行训练。通常来说,从两个方面考虑来选择特征:
- 特征是否发散:如果一个特征不发散,例如方差接近于0或者基本上都是重复数据,也就是说样本在这个特征上基本上没有差异,这个特征对于样本区分并没有什么用。
- 特征与目标的相关性:这点比较显而易见,与目标相关性高的特征,应当优选选择。
最近邻算法 KNN,单棵决策树,支持向量机SVM,神经网络,回归算法,都需要遍历特征或升维来进行运算,所以他们本身的运算量就很大,需要的时间就很长,因此方差过滤这样的特征选择对他们来说就尤为重要。
但对于不需要遍历特征的算法,比如随机森林,它随机选取特征进行分枝,本身运算就非常快速,因此特征选择对它来说效果平平。
因此,过滤法的主要对象是:需要遍历特征或升维的算法们,而过滤法的主要目的是:在维持算法表现的前提下,帮助算法降低计算成本。
根据特征选择的形式又可以将特征选择的方法分为3种:
4.1.1 方差法
计算各个特征的方差,根据阀值,选择方差大于阀值的特征
4.1.2 卡方过滤 (分类算法相关性检验)
卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。
卡方检验类 featureselection.chi2 计算每个非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低为特征排名。
再结合 featureselection.SelectkBest 这个可以输入“评分标准"来选出前 K 个分数最高的特征的类,我们可以借此除去最可能独立于标签,与我们分类目的无关的特征。
卡方检验要求特征中均为非负值。
从特征工程的角度,我们希望选取卡方值很大,p 值小于 0.05 的特征,即和标签是相关联的特征。
而调用 SelectkBest 之前,我们可以直接从 chi2 实例化后的模型中获得各个特征所对应的卡方值和 P 值。
4.1.3 F 检验 (线性相关性)
F检验,又称ANOVA,方差齐性检验,是用来捕捉每个特征与标签之间的 线性关系 的过滤方法。
F检验的本质是寻找两组数据之间的线性关系,其原假设是'数据不存在显著的线性关系”。
它返回 F 值和 P 值两个统计量。
和卡方过滤一样,我们希望选取 p 值小于 0.05 或 0.01 的特征,这些特征与标签是显著线性相关的,
而 P 值大于 0.05 或 0.01 的特征则被我们认为是和标签没有显著线性关系的特征,应该被删除。
[1.66966919e-31 4.49201713e-17 2.85677661e-91 4.16944584e-85]
4.1.4 互信息法
互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。
和F检验相似,它既可以做回归也可以做分类,并且包含两个类featureselection.mutualinfoclassif(互信息分类)和 featureselection.mutualinforegression(互信息回归)。
这两个类的用法和参数都和F检验一模一样,不过互信息法比F检验更加强大,F检验只能够找出线性关系,而互信息法可以找出任意关系。
互信息法不返回 p 值或 F 值类似的统计量,它返口"每个特征与目标之间的互信息量的估计”,
这个估计量在 [0,1] 之间取值,为 0 则表示两个变量独立,为 1 则表示两个变量完全相关。以互信息分类为例的代码如下:
4.2.1 递归特征消除法
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
4.3 Embedded 嵌入法
嵌入法是一种让算法自己決定使用哪些特征的方法,即特征选择和算法训练同时进行。
在使用嵌入法时,我们先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数.
根据权值系数从大到小选择权值系数大的特征,权值系数往往代表了特征对于模型的某种贡献或重要性。
selectFromModel 是一个元变换器,可以与任何在拟合后具有 coef_,feature_importances_ 属性或具有惩罚项的评估器一起使用
(比如随机森林和树模型就具有属性 featureimportances_,逻辑回归就带有l1和l2惩罚项,线性支持向量机也支持l2惩罚项)。
参数 | 说明 |
---|---|
estimator | 使用的模型评估器, 只要是带 coef_,feature_importances_ 属性或具有惩罚项的评估器都可以使用。 |
threshold | 特征重要性的阈值,重要性低于这个阈值的特征都将被删除。 |
prefit | 默认False,判断是否将实例化后的模型直接传递给构造函数。如果为True,则必须直接调用 fit 和 transform,不能使用 fit_transform,并且 SelectFromModel 不能与 cross_val_score, GridSearchCV和克隆估计器的类似程序一起使用。 |
norm_order | k可输入非零整数,正无穷,负无穷,默认值为1在评估器的 coef_ 属性高于一维的情况下,用于过滤低于阈值的系数的向量的范数的阶数。 |
max_features | 在阈值设定下,要选择的最大特征数。要禁用阈值并仅根据 max_features 选择,设 置threshold = -np.inf |
[3.60360035e-03 5.84203561e-02 6.43556008e-03 1.21898803e-02 1.13200898e-02 3.30934631e-03 9.24397894e-03 5.79670705e-04 4.02999953e-03 9.70090553e-02 1.23106767e-03 1.08092186e-01 6.84535209e-01]
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/c3285a903f6d4bebba038a526368ab0f/3ee960facb2a4f9eb19728e05ca0fc14.png)
线性回归模型展示
The predict score is 0.7951077576074727
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/3d425b607a694be781e5e89aceb048e5/f684232fdc744087a499bd36abaf6e64.png)
决策树模型展示
The predict score is 0.968738980776025
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/e0dfe534207d4642aadee3ad73c5da5a/9690f301bdbc4c30964651eb61710d79.png)
KMeans 模型展示
The predict result is [0 0 0 0 0 2 0 0 2 0 0 1 0 0 2 0 0 2 0 0 2 2 0 0 0 1 0 0 1 1 1 1 2 2 0 1 0 0 0 2 2 0 1 1 1 2 0 0 0 2 1 0 1 0 0 2 0 1 1 0 0 1 1 0 0 2 2 0 0 0 0 1 0 0 2 2 1 0 0 0 0 2 0 0 1 1 1 0 2 0 0 0 1 1 0 2 2 0 1 0 0 0 2 2 0 0]
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/9e76505e76c0455bbaa510e4d1104db4/6f46ff53ff3f4187ab2e100c4d11306c.png)
可以看到,选择错误的模型会导致完全错误的结果。 🙅
支持向量机 SVM 模型展示
The predict score is 0.9301744087982504
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/83695cb42ca24dadba36804062dd4fc9/54ac706467c244ac8ae1beda00e3c1a6.png)
随机森林模型展示
The predict score is 0.9699573420845312
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/7fa44747d35249779ea50fd9c2e309ae/6040c204b1c5469abdb285c16428d406.png)
神经网络模型(多层感知机)效果展示
The predict score is 0.8914636746919842
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/ad25ec4495234bf1be608e47a2554df8/a811a556b10e42e191252a7a31e8ec7f.png)
可以看到,选择不同的机器学习模型,对预测效果存在重要影响。
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Requirement already satisfied: scikit-learn==1.2.0 in /opt/conda/lib/python3.8/site-packages (1.2.0) Requirement already satisfied: numpy>=1.17.3 in /opt/conda/lib/python3.8/site-packages (from scikit-learn==1.2.0) (1.22.4) Requirement already satisfied: scipy>=1.3.2 in /opt/conda/lib/python3.8/site-packages (from scikit-learn==1.2.0) (1.7.3) Requirement already satisfied: joblib>=1.1.1 in /opt/conda/lib/python3.8/site-packages (from scikit-learn==1.2.0) (1.2.0) Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn==1.2.0) (3.1.0) WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv ['accuracy', 'adjusted_mutual_info_score', 'adjusted_rand_score', 'average_precision', 'balanced_accuracy', 'completeness_score', 'explained_variance', 'f1', 'f1_macro', 'f1_micro', 'f1_samples', 'f1_weighted', 'fowlkes_mallows_score', 'homogeneity_score', 'jaccard', 'jaccard_macro', 'jaccard_micro', 'jaccard_samples', 'jaccard_weighted', 'matthews_corrcoef', 'max_error', 'mutual_info_score', 'neg_brier_score', 'neg_log_loss', 'neg_mean_absolute_error', 'neg_mean_absolute_percentage_error', 'neg_mean_gamma_deviance', 'neg_mean_poisson_deviance', 'neg_mean_squared_error', 'neg_mean_squared_log_error', 'neg_median_absolute_error', 'neg_negative_likelihood_ratio', 'neg_root_mean_squared_error', 'normalized_mutual_info_score', 'positive_likelihood_ratio', 'precision', 'precision_macro', 'precision_micro', 'precision_samples', 'precision_weighted', 'r2', 'rand_score', 'recall', 'recall_macro', 'recall_micro', 'recall_samples', 'recall_weighted', 'roc_auc', 'roc_auc_ovo', 'roc_auc_ovo_weighted', 'roc_auc_ovr', 'roc_auc_ovr_weighted', 'top_k_accuracy', 'v_measure_score']
8 参数优化
所有估计器都有可以调整的参数(在文献中通常称为超参数)。
估计器的泛化功效通常主要取决于几个参数。
例如,RandomForestRegressor 具有一个确定林中树数的 n_estimators 参数,以及一个确定每棵树最大深度的 max_depth 参数。
通常,不清楚这些参数的确切值应该是多少,因为它们取决于手头的数据。
Scikit-Learn提供了自动查找最佳参数组合的工具。在下面的示例中,我们使用 RandomizedSearchCV 方法随机搜索随机森林回归的参数空间。
搜索结束后,RandomizedSearchCV 就像一个 RandomForestRegressor,它已经拟合了最佳参数集。
你可在用户指南中了解更多内容:
最优的参数是: {'max_depth': 7, 'n_estimators': 1} ,其得分为 0.7601224720158413
总结
在本教程中,您学习了在 Scikit-Learn 的一些基础方法。
具体而言,您了解到:
- 使用 Scikit-Learn 快速创建某一类型的数据或加载现有数据。
- 对数据进行预处理,例如归一化于标准化,以及快速划分数据集。
- 进行特征选择的一些方法,例如过滤法、包装法及嵌入法。
- 使用 Scikit-Learn 的范式快速建立机器学习模型。
- 使用 sklearn.metric 来评价模型质量。
- 使用交叉验证以及自动查找最佳的评估器参数。
你有什么问题吗? 欢迎与我们联系 bohrium@dp.tech 。
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/3/28a8f1190b014961942c3f44218323c8/29a4b29e-4a08-4dba-84f3-decf91b22376.png?x-oss-process=image/resize,w_100,m_lfit)
![](https://cdn1.deepmd.net/bohrium/web/static/images/level-v2-3.png?x-oss-process=image/resize,w_50,m_lfit)
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/3ede223eb868435588437d18e31af318/bfa82193-a864-45cb-a26c-9c49f44e25a7.png?x-oss-process=image/resize,w_100,m_lfit)
![](https://cdn1.deepmd.net/bohrium/web/static/images/level-v2-4.png?x-oss-process=image/resize,w_50,m_lfit)
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/3ede223eb868435588437d18e31af318/bfa82193-a864-45cb-a26c-9c49f44e25a7.png?x-oss-process=image/resize,w_100,m_lfit)
![](https://cdn1.deepmd.net/bohrium/web/static/images/level-v2-4.png?x-oss-process=image/resize,w_50,m_lfit)
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/14076/3ede223eb868435588437d18e31af318/bfa82193-a864-45cb-a26c-9c49f44e25a7.png?x-oss-process=image/resize,w_100,m_lfit)
![](https://cdn1.deepmd.net/bohrium/web/static/images/level-v2-4.png?x-oss-process=image/resize,w_50,m_lfit)