机器学习实战 | SKLearn最全应用指南

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中,因为做了上层的封装,分类模型、回归模型、聚类与降维模型、预处理器等等都叫做估计器(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,设置超参数normalizeTrue(在每个特征值上做标准化,这样能保证拟合的稳定性,加速模型拟合速度)。

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值