Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
作者:韩信子@ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/41
本文地址:http://www.showmeai.tech/article-detail/203
声明:版权所有,转载请联系平台与作者并注明出处
收藏ShowMeAI查看更多精彩内容
引言
我们在上一篇SKLearn入门与简单应用案例里给大家讲到了SKLearn工具的基本板块与使用方法,在本篇内容中,我们展开讲解SKLearn的进阶与核心内容。SKLearn中有六大任务模块,如下图所示:分别是分类、回归、聚类、降维、模型选择和预处理。
- SKLearn官网:https://scikit-learn.org/stable/
- SKLearn的快速使用方法也推荐大家查看ShowMeAI的文章和速查手册 AI建模工具速查|Scikit-learn使用指南
在SKLearn中,因为做了上层的封装,分类模型、回归模型、聚类与降维模型、预处理器等等都叫做估计器(estimator),就像在Python里「万物皆对象」,在SKLearn里「万物皆估计器」。
在本篇内容中,我们将给大家进一步深入讲解scikit-learn工具库的使用方法,力求完整覆盖sklearn工具库应用的方方面面。本文的内容板块包括:
- ① 机器学习基础知识:机器学习定义与四要素:数据、任务、性能度量和模型。机器学习概念,以便和SKLearn对应匹配上。
- ② SKLearn讲解:API设计原理,sklearn几大特点:一致性、可检验、标准类、可组合和默认值,以及SKLearn自带数据以及储存格式。
- ③ SKLearn三大核心API讲解:包括估计器、预测器和转换器。这个板块很重要,大家实际应用时主要是借助于核心API落地。
- ④ SKLearn高级API讲解:包括简化代码量的流水线(Pipeline估计器),集成模型(Ensemble估计器)、有多类别-多标签-多输出分类模型(Multiclass 和 Multioutput 估计器)和模型选择工具(Model Selection估计器)。
1.机器学习简介
关于本节内容,强烈推荐大家阅读ShowMeAI文章 图解机器学习 | 机器学习基础知识 和 图解机器学习 | 模型评估方法与准则 ,ShowMeAI对相关知识内容展开做了详细讲解。
1.1 定义和构成元素
何为机器学习?大师汤姆米切尔(Tom Mitchell)对机器学习定义的原话是:
A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P if its performance at tasks in T, as measured by P, improves with experience E.
这段英文中有两个词computer program和learn,翻译成中文就是机器(计算机程序)和学习,整体翻译下来就是说:如果计算机程序在T任务上的性能(由P衡量)随着经验E而提高,则称计算机程序从经验E中学习某类任务T。
由上述机器学习的定义可知机器学习包含四个元素:
- 数据(Data)
- 任务(Task)
- 性能度量(Quality Metric)
- 算法(Algorithm)
1.2 数据
数据(data)是信息的载体。数据可以有以下划分方式:
-
从「数据具体类型」维度划分:结构化数据和非结构化数据。
- 结构化数据(structured data)是由二维表结构来逻辑表达和实现的数据。
- 非结构化数据是没有预定义的数据,不便用数据库二维表来表现的数据。非结构化数据包括图片,文字,语音和视频等。
-
从「数据表达形式」维度划分:原始数据和加工数据。
-
从「数据统计性质」维度划分:样本内数据和样本外数据。
对于非结构数据,通常神经网络有更好的效果,可以参考ShowMeAI的文章Python机器学习算法实践中的图像建模例子。
机器学习模型很多时候使用的是结构化数据,即二维的数据表。我们这里以iris花瓣数据集举例,如下图。
下面术语大家在深入了解机器学习前一定要弄清楚:
- 每行的记录(这是一朵鸢尾花的数据统计),称为一个「样本(sample)」。
- 反映样本在某方面的性质,例如萼片长度(Sepal Length)、花瓣长度(Petal Length),称为「特征(feature)」。
- 特征上的取值,例如「样本1」对应的5.1、3.5称为「特征值(feature value)」。
- 关于样本结果的信息,例如Setosa、Versicolor,称为「类别标签(class label)」。
- 包含标签信息的示例,则称为「样例(instance)」,即
样例=(特征,标签)
。 - 从数据中学得模型的过程称为「学习(learning)」或「训练(training)」。
- 在训练数据中,每个样例称为「训练样例(training instance)」,整个集合称为「训练集(training set)」。
1.3 任务
根据学习的任务模式(训练数据是否有标签),机器学习可分为几大类:
- 监督学习(有标签)
- 无监督学习(无标签)
- 半监督学习(有部分标签)
- 强化学习(有延迟的标签)
下图画出机器学习各类之间的关系。
1.4 性能度量
回归和分类任务中最常见的误差函数以及一些有用的性能度量如下,详细内容可以参考ShowMeAI文章 机器学习评估与度量准则。
2. SKLearn数据
SKLearn作为通用机器学习建模的工具包,包含六个任务模块和一个数据导入模块:
首先看看SKLearn默认数据格式和自带数据集。
2.1 SKLearn默认数据格式
Sklean里模型能直接使用的数据有两种形式:
- Numpy二维数组(ndarray)的稠密数据(dense data),通常都是这种格式。
- SciPy矩阵(scipy.sparse.matrix)的稀疏数据(sparse data),比如文本分析每个单词(字典有100000个词)做独热编码得到矩阵有很多0,这时用ndarray就不合适了,太耗内存。
2.2 自带数据集
SKLearn里面有很多自带数据集供用户使用。
比如在之前文章Python机器学习算法实践中用到的鸢尾花数据集,包含四个特征(萼片长/宽和花瓣长/宽)和三个类别。
我们可以直接从SKLearn里面的datasets模块中引入,代码如下(代码可以在 线上Jupyter环境 中运行):
| | # 导入工具库 |
| | from sklearn.datasets import load\_iris |
| | iris = load\_iris() |
| | |
| | #数据是以「字典」格式存储的,看看 iris 的键有哪些。 |
| | iris.keys() |
输出如下:
| | dict\_keys(['data', 'target', 'target\_names', 'DESCR', 'feature\_names', 'filename']) |
读取数据集的信息:
| | #输出iris 数据中特征的大小、名称等信息和前五个样本。 |
| | n\_samples, n\_features = iris.data.shape |
| | print((n\_samples, n\_features)) |
| | print(iris.feature\_names) |
| | print(iris.target.shape) |
| | print(iris.target\_names) |
| | iris.data[0:5] |
输出如下:
| | (150, 4) |
| | ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] |
| | (150,) |
| | ['setosa' 'versicolor' 'virginica'] |
| | array([[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]]) |
构建Dataframe格式的数据集:
| | # 将X和y合并为Dataframe格式数据 |
| | import pandas as pd |
| | import seaborn as sns |
| | iris\_data = pd.DataFrame( iris.data, |
| | columns=iris.feature\_names ) |
| | iris\_data['species'] = iris.target\_names[iris.target] |
| | iris\_data.head(3).append(iris\_data.tail(3)) |
输出如下:
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
147 | 6.5 | 3.0 | 5.2 | 2.0 | virginica |
148 | 6.2 | 3.4 | 5.4 | 2.3 | virginica |
149 | 5.9 | 3.0 | 5.1 | 1.8 | virginica |
我们使用seaborn来做一些数据分析,查看一下数据的分布特性。这里使用到的是成对维度的关联分析,关于seaborn的使用方法可以参阅ShowMeAI的文章 seaborn工具与数据可视化教程。
| | # 使用Seaborn的pairplot查看两两特征之间的关系 |
| | sns.pairplot( iris\_data, hue='species', palette='husl' ) |
2.3 数据集引入方式
前面提到的是鸢尾花iris数据集,我们通过load_iris加载进来,实际上SKLearn有三种引入数据形式。
- 打包好的数据:对于小数据集,用
sklearn.datasets.load_*
- 分流下载数据:对于大数据集,用
sklearn.datasets.fetch_*
- 随机创建数据:为了快速展示,用
sklearn.datasets.make_*
上面这个星号*
指代具体文件名,如果大家在Jupyter这种IDE环境中,可以通过tab制表符自动补全和选择。
- datasets.load_
- datasets.fetch_
- datasets.make_
比如我们调用load_iris
| | from sklearn import datasets |
| | datasets.load\_iris |
输出如下:
| | <function sklearn.datasets.base.load\_iris(return\_X\_y=False)> |
我们调用load_digits
加载手写数字图像数据集
| | digits = datasets.load\_digits() |
| | digits.keys() |
输出:
| | dict\_keys(['data', 'target', 'target\_names', 'images', 'DESCR']) |
我们再来看看通过fetch拉取数据的示例:
| | #加州房屋数据集 |
| | california\_housing = datasets.fetch\_california\_housing() |
| | california\_housing.keys() |
输出:
| | dict\_keys(['data', 'target', 'feature\_names', 'DESCR']) |
3.SKLearn核心API
我们前面提到SKLearn里万物皆估计器。估计器是个非常抽象的叫法,不严谨的一个理解,我们可以视其为一个模型(用来回归、分类、聚类、降维),或一套流程(预处理、网格搜索交叉验证)。
本节三大API其实都是估计器:
- 估计器(estimator)通常是用于拟合功能的估计器。
- 预测器(predictor)是具有预测功能的估计器。
- 转换器(transformer)是具有转换功能的估计器。
3.1 估计器
任何可以基于数据集对一些参数进行估计的对象都被称为估计器,它有两个核心点:
- ① 需要输入数据。
- ② 可以估计参数。
估计器首先被创建,然后被拟合。
-
创建估计器:需要设置一组超参数,比如
- 线性回归里超参数
normalize=True
- K均值里超参数
n_clusters=5
- 线性回归里超参数
-
拟合估计器:需要训练集
- 在监督学习中的代码范式为
model.fit(X_train, y_train)
- 在无监督学习中的代码范式为
model.fit(X_train)
- 在监督学习中的代码范式为
拟合之后可以访问model里学到的参数,比如线性回归里的特征系数coef,或K均值里聚类标签labels,如下(具体的可以在SKLearn文档的每个模型页查到)。
model.coef_
model.labels_
下面看看监督学习的「线性回归」和无监督学习的「K均值聚类」的具体例子。
(1) 线性回归
首先从SKLearn工具库的linear_model
中引入LinearRegression
;创建模型对象命名为model,设置超参数normalize
为True
(在每个特征值上做标准化,这样能保证拟合的稳定性,加速模型拟合速度)。