pytorch&scikit-learn机器学1- 赋予计算机从数据中学习的能力

Posted pythontesting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch&scikit-learn机器学1- 赋予计算机从数据中学习的能力相关的知识,希望对你有一定的参考价值。

在我看来,机器学习即对数据有意义的算法的应用和科学,是所有计算机科学中最令人兴奋的领域!利用机器学习领域的自学算法,我们可以将这些数据转化为知识。

在本章中,我们将涵盖以下主题:

  • 机器学习的一般概念
  • 三种类型的学习和基本术语
  • 成功设计机器学习系统的基石
  • 安装和设置用于数据分析和机器学习的Python
  • 构建智能机器,将数据转化为知识

机器学习的一般概念

在这个现代技术的时代有大量的结构化和非结构化数据。在20世纪下半叶,机器学习作为人工智能(AI)的子领域发展起来,涉及到自学算法,从数据中得出知识,进行预测。

与其要求人类从分析大量数据中手动推导出规则并建立模型,机器学习提供了更有效的替代方案,捕捉数据中的知识,逐步提高预测模型的性能,做出数据驱动的决策。

由于机器学习,我们享有强大的电子邮件垃圾邮件过滤器,方便的文本和语音识别软件,可靠的网络搜索引擎,娱乐性电影的观看建议,移动支票存款,估计送餐时间,以及更多。希望不久之后,我们将把安全高效的自动驾驶汽车添加到这个列表中。此外,在医疗应用方面也取得了明显的进展;例如,研究人员证明,深度学习模型可以以接近人类的准确度检测皮肤癌。另一个里程碑是最近由DeepMind的研究人员取得的,他们使用深度学习来预测三维蛋白质结构,比基于物理学的方法要好得多。研究人员设计了提前四天预测COVID-19患者的氧气需求的系统,以帮助医院为需要的人分配资源。我们这个时代的另一个重要话题是气候变化,它是最大和最关键的挑战之一。研究人员旨在设计基于计算机视觉的机器学习系统,以优化资源配置,尽量减少肥料的使用和浪费。

机器学习的三种不同类型

在本节中,我们将看一下机器学习的三种类型:监督学习、无监督学习和强化学习。我们将了解这三种不同的学习类型之间的根本区别,并利用概念性的例子,对它们可以应用的实际问题领域进行了解:

  • 用监督学习对未来进行预测

监督学习的主要目标是从标记的训练数据中学习一个模型,使我们能够对未见的或未来的数据进行预测。在这里,术语 "监督 "指的是一组训练实例(数据输入),其中所需的输出信号(标签)已经知道。监督下的学习是对数据输入和输出之间的关系进行建模的过程。 因此,我们也可以把监督学习看作是 "标签学习"。

下图总结了典型的监督学习工作流程:标记的训练数据被传递给机器学习算法,用于拟合预测模型,该模型可以对新的、未标记的数据输入进行预测:

我们可以使用监督机器学习算法在已标记的邮件语料库上训练一个模型,这些邮件被正确地标记为垃圾邮件或非垃圾邮件,以预个新邮件是否属于这两个类别。有离散类标签的监督学习任务,如前面的垃圾邮件过滤例子,也被称为分类任务。监督学习的另一个子类别是回归,其中结果信号是一个连续值。

分类是监督学习的子类别,其目标是根据过去的观察结果来预测新实例或数据点的分类标签。这些类标签是离散的、无序的值,可以理解为数据点的组别成员。前面提到的垃圾邮件检测的例子代表了二元分类任务的典型例子,机器学习算法学习了一套规则来区分两个可能的类别:垃圾邮件和非垃圾邮件。

下图说明了给定30个训练实例的二元分类任务的概念;15个训练实例被标记为A类,15个训练实例被标记为B类。在这种情况下,我们的数据集是二维的,这意味着每个实例有两个与之相关的值:x1和x2。现在,我们可以使用监督下的机器学习算法来学习一条规则--用虚线表示的决策边界--它可以将这两个类别分开,并将新的数据分类到这两个类别中,因为它的值是x1和x2。

类标签的集合不一定是二进制性质的。由监督学习算法学习的预测模型可以将训练数据集中出现的任何类别标签分配给新的、未标记的数据点或实例。

多类分类任务的典型例子是手写字符识别。我们可以收集一个训练数据集,其中包括字母表中每个字母的多个手写例子。这些字母("A"、"B"、"C"等)将代表我们想要预测的不同无序类别或类标签。现在,如果用户通过输入设备提供新的手写字符,我们的预测模型将能够以一定的准确性预测出字母表中的正确字母。然而,我们的机器学习系统将无法正确识别0到9之间的任何数字,如果它们不是训练数据集的一部分。

第二种类型的监督学习是预测连续结果,这也被称为回归分析。在回归分析中,我们得到一些预测(解释)变量和连续的响应变量(结果),我们试图找到这些变量之间的关系,使我们能够预测结果。

注意,在机器学习领域,预测变量通常被称为 "特征",而响应变量通常被称为 "目标变量"。

例如,让我们假设我们对预测学生的数学SAT分数感兴趣。(SAT是美国大学录取时经常使用的一种标准化考试)。如果学习考试的时间和最终的分数之间有关系,我们可以用它作为训练数据来学习一个模型,用学习时间来预测未来计划参加这个考试的学生的考试分数。

他观察到,父母的身高并没有传给他们的孩子,相反,他们的孩子的身高会向人群的平均水平倒退。

下图说明了线性回归的概念。给定特征变量x和目标变量y,我们对这个数据拟合一条直线,使数据点和拟合线之间的距离最小--最常见的是平均平方距离。

  • 用强化学习解决互动问题

在强化学习中,目标是开发一个系统(代理),根据与环境的交互作用来提高其性能。由于关于环境当前状态的信息通常还包括奖励信号,我们可以认为强化学习是监督学习有关的领域。然而,在强化学习中,这种反馈不是正确的基础真理标签或价值,而是衡量该行动被奖励函数所衡量的程度。通过与环境的互动,代理可以使用强化学习来学习一系列的行动,通过探索性的试错方法或深思熟虑的规划来使这个奖励最大化。

强化学习的流行的例子是国际象棋程序。在这里,代理人根据棋盘(环境)的状态来决定一系列的动作,奖励可以定义为游戏结束时的赢或输:

强化学习有许多不同的子类型。然而普遍的方案是,强化学习中的代理人试图通过与环境的一系列互动来实现奖励的最大化。每个状态都可以与正或负的奖励相关联,奖励可以被定义为完成一个总体目标,如赢或输一盘棋。例如,在国际象棋中,每一步棋的结果可以被认为是环境的不同状态。

为了进一步探讨国际象棋的例子,我们可以认为访问棋盘上的某些配置与更有可能导致胜利的状态有关--例如,从棋盘上移走对手的棋子或威胁到皇后。而其他位置则与更有可能导致输掉比赛的状态有关,例如在下一回合输给对手一个棋子。现在,在国际象棋游戏中,奖励(赢棋的正面奖励或输棋的负面奖励)将在游戏结束时才会给出。此外,最后的奖励也将取决于对手如何下棋。例如,对手可能会牺牲皇后,但最终赢得比赛。

总之,强化学习关注的是学会选择一系列行动,使总奖励最大化,奖励可以在采取行动后立即获得,也可以通过延迟的反馈获得。

  • 用无监督学习发现隐藏结构

在监督学习中,当我们训练一个模型时,我们事先知道正确的答案(标签或目标变量),而在强化学习中,我们为代理进行的特定行动定义了奖励的措施。然而,在无监督学习中,我们要处理的是没有标签的数据或未知结构的数据。使用无监督学习技术,我们能够探索数据的结构,在没有已知的结果变量或奖励函数的指导下提取有意义的信息。

聚类是一种探索性的数据分析或模式发现技术,它允许我们将一堆信息组织成有意义的子组(聚类),而不需要事先了解它们的组员身份。在分析过程中产生的每个聚类定义了一组具有一定程度相似性的对象,但与其他聚类中的对象更不相似,这就是为什么聚类有时也被称为无监督分类。聚类是一种构造信息和从数据中得出有意义关系的伟大技术。例如,它允许营销人员根据客户的兴趣来发现客户群,以便制定不同的营销方案。

下图说明了聚类是如何应用于将无标签的数据根据其特征x1和x2的相似性组织成三个不同的群体或聚类(A、B和C,顺序任意):

无监督学习的另一个子领域是降维。通常情况下,我们要处理的是高维数据--每个观察值都有大量的测量值--这对有限的存储空间和机器学习算法的计算性能是一个挑战。无监督的降维是特征预处理中常用的方法,可以去除数据中的噪音,这可能降低某些算法的预测性能。降维将数据压缩到较小的维度子空间,同时保留大部分相关信息。

有时,降维对于数据的可视化也很有用;例如,高维特征集可以被投射到一维、二维或三维特征空间上,通过二维或三维散点图或直方图进行可视化。下图显示了一个应用非线性降维的例子,将三维瑞士卷压缩到一个新的二维特征子空间:

基本术语和记号的介绍

下图Iris数据集的节选,这是机器学习领域的一个经典案例(更多信息可以在https://archive.ics.uci.edu/ml/datasets/iris)。鸢尾花数据集包含来自三个不同品种的150朵鸢尾花的测量结果--Setosa, Versicolor, 和Virginica。

在这里,每个花的例子代表我们数据集中的一行,以厘米为单位的花的测量值被存储为列,我们也称之为数据集的特征:

为了使符号和实现简单而有效,我们将利用线性代数的一些基础知识。在下面的章节中,我们将使用矩阵符号来指代我们的数据。我们将遵循常见的惯例,将每个例子表示为特征矩阵X中的一个单独的行,其中每个特征被存储为一个单独的列。

Iris数据集由150个例子和4个特征组成,因此可以写成150×4的矩阵,形式上表示为 :

我们将使用上标i指代第i个训练实例,下标j指代训练数据集的第j个维度。

我们将使用小写的粗体字来指代向量,大写的粗体字来指代矩阵。为了指代向量或矩阵中的单个元素,我们将用斜体字写字母。

例如,指的是花例150的第一个维度,即萼片长度。矩阵X中的每一行代表一个花的实例,可以写成一个四维行向量, :

而每个特征维度是一个150维的列向量, 。举例来说:

同样,我们可以把目标变量(这里是指类标签)表示为150维的列向量:

机器学习是一个庞大的领域,也是非常跨学科的领域,因为它汇集了许多来自其他研究领域的科学家。恰好,许多术语和概念被重新发现或重新定义,可能已经为你所熟悉,但以不同的名称出现。为了方便起见,在下面的列表中,你可以找到一些常用的术语和它们的同义词,你在阅读本书和一般的机器学习文献时可能会发现它们很有用:

训练实例: 表中代表数据集的一行,与观察、记录、实例或样本同义(在大多数情况下,样本是指训练实例的集合)。
训练: 模型拟合,对于参数模型类似于参数估计。
特征,缩写为x: 数据表或数据(设计)矩阵中的一列。与预测器、变量、输入、属性或协变量同义。
目标,缩写为y: 与结果、输出、响应变量、因果变量、(类)标签和基本事实同义。

损失函数: 通常与成本函数同义使用。有时损失函数也被称为误差函数。在一些文献中,"损失 "一词指的是针对单个数据点测量的损失,而成本是计算整个数据集的损失(平均或加总)的测量。

构建机器学习系统的路线图

在前面的章节中,我们讨论了机器学习的基本概念和三种不同的学习类型。在本节中,我们将讨论机器学习系统中伴随着学习算法的其他重要部分。

  • 预处理--使数据成型

原始数据很少以学习算法的最佳性能所需的形式和形状出现。因此,数据的预处理是任何机器学习应用中最关键的步骤之一。

如果我们以上一节中的鸢尾花数据集为例,我们可以把原始数据看成是一系列的花卉图像,我们要从中提取有意义的特征。有用的特征可以围绕花的颜色或花的高度、长度和宽度。

许多机器学习算法还要求所选特征在同一尺度上以获得最佳性能,这通常是通过在[0, 1]范围内转换特征或具有零平均值和单位方差的标准正态分布来实现。

一些被选中的特征可能是高度相关的,因此在一定程度上是多余的。在这些情况下,降维技术对于将特征压缩到较低维度的子空间是很有用的。降低特征空间的维度需要更少的存储空间,而且学习算法可以运行得更快。在某些情况下,如果数据集包含大量不相关的特征(或噪声);也就是说,如果数据集的信噪比很低,降维也可以提高模型的预测性能。

为了确定我们的机器学习算法不仅在训练数据集上表现良好,而且对新数据也有很好的泛化作用,我们还想把数据集随机分成独立的训练和测试数据集。我们使用训练数据集来训练和优化我们的机器学习模型,而将测试数据集保留到最后以评估最终模型。

  • 训练和选择预测模型

每种分类算法都有其固有的偏见,如果我们不对任务做任何假设,没有任何分类模型有优势。因此,在实践中,必须至少比较一些不同的学习算法,以训练和选择性能最好的模型。但在比较不同的模型之前,我们首先要决定衡量性能的指标。常用的指标是分类精度,它被定义为正确分类的实例比例。

如果我们不使用这个测试数据集进行模型选择,而是保留它进行最终的模型评估,我们怎么知道哪个模型在最终的测试数据集和真实世界的数据上表现良好?为了解决这个问题中蕴含的问题,可以使用被总结为 "交叉验证 "的不同技术。在交叉验证中,我们将数据集进一步划分为训练子集和验证子集,以估计模型的泛化性能。

最后,我们也不能指望软件库提供的不同学习算法的默认参数对我们的具体问题任务来说是最优的。因此,我们将经常使用超参数优化技术,帮助我们在后面的章节中对模型的性能进行微调。

我们可以把这些超参数看作不是从数据中学习出来的参数,而是代表模型的旋钮,我们可以转动它来提高其性能。在后面的章节中,当我们看到实际的例子时,这将变得更加清晰。

  • 评估模型和预测未见过的数据实例

在我们选择了一个在训练数据集上拟合的模型后,我们可以使用测试数据集来估计它在这些未见过的数据上的表现,以估计所谓的泛化误差。如果我们对它的表现感到满意,我们现在可以用这个模型来预测新的、未来的数据。需要注意的是,前面提到的程序的参数,如特征缩放和降维,完全是从训练数据集中获得的,同样的参数后来被重新应用于转换测试数据集,以及任何新的数据实例--否则在测试数据上测量的性能可能过于乐观了。

使用Python进行机器学习

  • Anaconda

Python是数据科学中最流行的编程语言,由于其非常活跃的开发者和开源社区,已经开发了大量有用的科学计算和机器学习的库。

尽管Python等解释型语言在计算密集型任务方面的性能不如低级别的编程语言,但NumPy和SciPy等扩展库已经被开发出来,它们建立在低级别的Fortran和C实现之上,用于对多维数组进行快速矢量操作。

对于机器学习编程任务,我们将主要参考scikit-learn库,它是目前最流行和最容易获得的开源机器学习库之一。在后面的章节中,当我们关注机器学习的一个子领域--深度学习时,我们将使用最新版的PyTorch库,它专门通过利用显卡非常有效地训练所谓的深度神经网络模型。

强烈推荐的用于科学计算背景下安装Python的开源软件包管理系统是Continuum Analytics的Conda。Conda是免费的,并在许可性的开源许可证下授权。它的目标是帮助数据科学、数学和工程的Python包在不同的操作系统上进行安装和版本管理。如果你想使用conda,它有不同的版本,即Anaconda、Miniconda和Miniforge:

Anaconda预装了许多科学计算软件包。Anaconda的安装程序可以在https://docs.anaconda.com/anaconda/install/,而Anaconda的快速入门指南可以在https://docs.anaconda.com/anaconda/user-guide/getting-started/。
Miniconda是Anaconda的一个更精简的替代品(https://docs.conda.io/en/latest/miniconda.html)。本质上,它与Anaconda相似,但没有预装任何软件包,许多人(包括作者)都喜欢这样。
Miniforge与Miniconda类似,但由社区维护,并使用与Miniconda和Anaconda不同的包库(conda-forge)。我们发现Miniforge是Miniconda的很好的替代品。下载和安装说明可以在GitHub仓库中找到:https://github.com/conda-forge/miniforge。
在通过 Anaconda、Miniconda 或 Miniforge 成功安装 conda 后,我们可以使用以下命令安装新的 Python 包:

conda install SomePackage
conda update SomePackage

不能通过官方conda渠道获得的软件包可能会通过社区支持的conda-forge项目(https://conda-forge.org)获得,这可以通过-channel conda-forge标志指定。比如说

conda install SomePackage --channel conda-forge

不能通过默认的conda通道或conda-forge获得的软件包可以通过pip安装,如前所述。比如说

pip install SomePackage
  • 用于科学计算、数据科学和机器学习的软件包

在本书的前半部分,我们将主要使用NumPy的多维数组来存储和处理数据。偶尔,我们会使用pandas,这是建立在NumPy之上的库,它提供了额外的高级数据操作工具,使处理表格数据更加方便。为了增强你的学习体验,并将定量数据可视化,这对理解数据往往非常有用,我们将使用非常可定制的Matplotlib库。

NumPy
SciPy
Scikit-learn 
Matplotlib 
pandas

skLearn 支持向量机

## 版权所有,转帖注明出处

章节


前面章节尝试了K均值聚类模型,准确率并不高。接下来我们尝试一种新方法:支持向量机(SVM)。

支持向量机

支持向量机(support vector machine/SVM),通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。本系列教程聚焦于SciKit-Learn 库的使用介绍,关于支持向量机详细原理,限于篇幅不再赘述,读者可参考相关资料。

如前所诉,K均值聚类模型是一种无监督学习模型,与此不同,支持向量机是一种有监督学习模型,是很常用的一种机器学习模型。

创建模型

下面的代码,创建了一个支持向量机模型。


import numpy as np
from sklearn import datasets

# 加载 `digits` 数据集
digits = datasets.load_digits()

# 导入 `train_test_split`
from sklearn.model_selection import train_test_split

# 数据分成训练集和测试集
# `test_size`:如果是浮点数,在0-1之间,表示测试子集占比;如果是整数的话就是测试子集的样本数量,`random_state`:是随机数的种子
X_train, X_test, y_train, y_test, images_train, images_test = train_test_split(digits.data, digits.target, digits.images, test_size=0.33, random_state=42)

# 导入“svm”模型
from sklearn import svm

# 创建SVC/Support Vector Classification/支持向量机分类器模型
svc_model = svm.SVC(gamma=0.001, C=100., kernel='linear')

# 将数据拟合到SVC模型中,此处用到了标签值y_train,是有监督学习
svc_model.fit(X_train, y_train)

可以看到,我们使用X_trainy_train数据来训练SVC模型(Support Vector Classification/支持向量机分类器模型),此处用到了标签值y_train,是有监督学习。

另外,我们手动设置了gamma的值,通过使用网格搜索和交叉验证等工具,可以自动找到合适的参数值。

测试模型

接下来,我们使用测试数据测试模型。

# 预测“X_test”标签
print(svc_model.predict(X_test))

# 打印' y_test '检查结果
print(y_test)

输出:

[6 9 3 7 2 1 5 2 5 2 1 4 4 0 4 2 3 7 8 8 4 3 9 7 5 6 3 5 6 3 4 9 1 4 4 6 9
 4 7 6 6 9 1 3 6 1 3 0 6 5 5 1 9 5 6 0 9 0 0 1 0 4 5 2 4 5 7 0 7 5 9 5 5 4
 7 0 4 5 5 9 9 0 2 3 8 0 6 4 4 9 1 2 8 3 5 2 9 0 4 4 4 3 5 3 1 3 5 9 4 2 7
 7 4 4 1 9 2 7 8 7 2 6 9 4 0 7 2 7 5 8 7 5 7 9 0 6 6 4 2 8 0 9 4 6 9 9 6 9
 0 5 5 6 6 0 6 4 3 9 3 9 7 2 9 0 4 5 3 6 5 9 9 8 4 2 1 3 7 7 2 2 3 9 8 0 3
 2 2 5 6 9 9 4 1 5 4 2 3 6 4 8 5 9 5 7 8 9 4 8 1 5 4 4 9 6 1 8 6 0 4 5 2 7
 4 6 4 5 6 0 3 2 3 6 7 1 5 1 4 7 6 5 8 5 5 1 6 2 8 8 9 9 7 6 2 2 2 3 4 8 8
 3 6 0 9 7 7 0 1 0 4 5 1 5 3 6 0 4 1 0 0 3 6 5 9 7 3 5 5 9 9 8 5 3 3 2 0 5
 8 3 4 0 2 4 6 4 3 4 5 0 5 2 1 3 1 4 1 1 7 0 1 5 2 1 2 8 7 0 6 4 8 8 5 1 8
 4 5 8 7 9 8 5 0 6 2 0 7 9 8 9 5 2 7 7 1 8 7 4 3 8 3 5 6 0 0 3 0 5 0 0 4 1
 2 3 4 5 9 6 3 1 8 8 4 2 3 8 9 8 8 5 0 6 3 3 7 1 6 4 1 2 1 1 6 4 7 4 8 3 4
 0 5 1 9 4 5 7 6 3 7 0 5 9 7 5 9 7 4 2 1 9 0 7 5 8 3 6 3 9 6 9 5 0 1 5 5 8
 3 3 6 2 6 5 7 2 0 8 7 3 7 0 2 2 3 5 8 7 3 6 5 9 9 2 9 6 3 0 7 1 1 9 6 1 8
 0 0 2 9 3 9 9 3 7 7 1 3 5 4 6 1 2 1 1 8 7 6 9 2 0 4 4 8 8 7 1 3 1 7 1 8 5
 1 7 0 0 2 2 6 9 4 1 9 0 6 7 7 9 5 4 7 0 7 6 8 7 1 4 6 2 8 7 5 9 0 3 9 6 6
 1 9 1 2 9 8 9 7 4 8 5 5 9 7 7 6 8 1 3 5 7 9 5 5 2 4 1 2 2 4 8 7 5 8 8 9 4
 9 0]
[6 9 3 7 2 1 5 2 5 2 1 9 4 0 4 2 3 7 8 8 4 3 9 7 5 6 3 5 6 3 4 9 1 4 4 6 9
 4 7 6 6 9 1 3 6 1 3 0 6 5 5 1 9 5 6 0 9 0 0 1 0 4 5 2 4 5 7 0 7 5 9 5 5 4
 7 0 4 5 5 9 9 0 2 3 8 0 6 4 4 9 1 2 8 3 5 2 9 0 4 4 4 3 5 3 1 3 5 9 4 2 7
 7 4 4 1 9 2 7 8 7 2 6 9 4 0 7 2 7 5 8 7 5 7 7 0 6 6 4 2 8 0 9 4 6 9 9 6 9
 0 3 5 6 6 0 6 4 3 9 3 9 7 2 9 0 4 5 3 6 5 9 9 8 4 2 1 3 7 7 2 2 3 9 8 0 3
 2 2 5 6 9 9 4 1 5 4 2 3 6 4 8 5 9 5 7 8 9 4 8 1 5 4 4 9 6 1 8 6 0 4 5 2 7
 4 6 4 5 6 0 3 2 3 6 7 1 5 1 4 7 6 8 8 5 5 1 6 2 8 8 9 9 7 6 2 2 2 3 4 8 8
 3 6 0 9 7 7 0 1 0 4 5 1 5 3 6 0 4 1 0 0 3 6 5 9 7 3 5 5 9 9 8 5 3 3 2 0 5
 8 3 4 0 2 4 6 4 3 4 5 0 5 2 1 3 1 4 1 1 7 0 1 5 2 1 2 8 7 0 6 4 8 8 5 1 8
 4 5 8 7 9 8 5 0 6 2 0 7 9 8 9 5 2 7 7 1 8 7 4 3 8 3 5 6 0 0 3 0 5 0 0 4 1
 2 8 4 5 9 6 3 1 8 8 4 2 3 8 9 8 8 5 0 6 3 3 7 1 6 4 1 2 1 1 6 4 7 4 8 3 4
 0 5 1 9 4 5 7 6 3 7 0 5 9 7 5 9 7 4 2 1 9 0 7 5 3 3 6 3 9 6 9 5 0 1 5 5 8
 3 3 6 2 6 5 5 2 0 8 7 3 7 0 2 2 3 5 8 7 3 6 5 9 9 2 5 6 3 0 7 1 1 9 6 1 1
 0 0 2 9 3 9 9 3 7 7 1 3 5 4 6 1 2 1 1 8 7 6 9 2 0 4 4 8 8 7 1 3 1 7 1 9 5
 1 7 0 0 2 2 6 9 4 1 9 0 6 7 7 9 5 4 7 0 7 6 8 7 1 4 6 2 8 7 5 9 0 3 9 6 6
 1 9 8 2 9 8 9 7 4 8 5 5 9 7 7 6 8 1 3 5 7 9 5 5 2 1 1 2 2 4 8 7 5 8 8 9 4
 9 0]

我们也可以使用matplotlib可视化测试数据及其预测标签:

# 导入 matplotlib
import matplotlib.pyplot as plt

# 将预测值赋给 `predicted`
predicted = svc_model.predict(X_test)

# 将images_test和images_prediction中的预测值压缩在一起
images_and_predictions = list(zip(images_test, predicted))

# 对于images_and_prediction中的前四个元素
for index, (image, prediction) in enumerate(images_and_predictions[:4]):
    # 在坐标i+1处初始化一个1×4的网格中的子图
    plt.subplot(1, 4, index + 1)
    # 不显示坐标轴
    plt.axis('off')
    # 在网格中的所有子图中显示图像
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    # 添加标题
    plt.title('Predicted: ' + str(prediction))

# 显示图形
plt.show()

显示:

技术图片

可以看到显示的这几张图形,预测的标签都是正确的。

评估模型

最后,我们来评估一下模型的性能,看看它准确率怎么样。

# 导入 `metrics`
from sklearn import metrics

# 打印的分类报告 `y_test` 与 `predicted`
print(metrics.classification_report(y_test, predicted))

# 打印“y_test”和“predicted”的混淆矩阵
print(metrics.confusion_matrix(y_test, predicted))

输出:

              precision    recall  f1-score   support

           0       1.00      1.00      1.00        55
           1       0.98      0.96      0.97        55
           2       1.00      1.00      1.00        52
           3       0.98      0.96      0.97        56
           4       0.97      1.00      0.98        64
           5       0.97      0.97      0.97        73
           6       1.00      1.00      1.00        57
           7       0.98      0.98      0.98        62
           8       0.94      0.94      0.94        52
           9       0.97      0.97      0.97        68

    accuracy                           0.98       594
   macro avg       0.98      0.98      0.98       594
weighted avg       0.98      0.98      0.98       594

[[55  0  0  0  0  0  0  0  0  0]
 [ 0 53  0  0  1  0  0  0  1  0]
 [ 0  0 52  0  0  0  0  0  0  0]
 [ 0  0  0 54  0  1  0  0  1  0]
 [ 0  0  0  0 64  0  0  0  0  0]
 [ 0  0  0  0  0 71  0  1  0  1]
 [ 0  0  0  0  0  0 57  0  0  0]
 [ 0  0  0  0  0  0  0 61  0  1]
 [ 0  1  0  1  0  1  0  0 49  0]
 [ 0  0  0  0  1  0  0  0  1 66]]

可以看到,这个模型比前面章节的K均值聚类模型,效果要好得多。

我们再看一下预测标签与实际标签的散点图。

# 导入 `Isomap()`
from sklearn.manifold import Isomap

# 创建一个isomap,并将“digits”数据放入其中
X_iso = Isomap(n_neighbors=10).fit_transform(X_train)

# 计算聚类中心并预测每个样本的聚类指数
predicted = svc_model.predict(X_train)

# 在1X2的网格中创建带有子图的图
fig, ax = plt.subplots(1, 2, figsize=(8, 4))

# 调整布局
fig.subplots_adjust(top=0.85)

# 将散点图添加到子图中 
ax[0].scatter(X_iso[:, 0], X_iso[:, 1], c=predicted)
ax[0].set_title('Predicted labels')
ax[1].scatter(X_iso[:, 0], X_iso[:, 1], c=y_train)
ax[1].set_title('Actual Labels')


# 加标题
fig.suptitle('Predicted versus actual labels', fontsize=14, fontweight='bold')

# 显示图形
plt.show()

显示

技术图片

从图中可以看出,模型的预测结果与实际结果匹配度非常好,模型的准确率很高。

参数值

前面在创建模型时,手动设置了gamma等参数的值,通过使用网格搜索和交叉验证等工具,可以自动找到合适的参数值。

尽管这不是本篇教程的重点,本节内容演示如何使用网格搜索和交叉验证等工具,自动找到合适的参数值。


import numpy as np
from sklearn import datasets

# 加载 `digits` 数据集
digits = datasets.load_digits()

# 导入 `train_test_split`
from sklearn.model_selection import train_test_split

# 将 `digits` 数据分成两个相等数量的集合 
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.5, random_state=0)

# 导入“svm”模型
from sklearn import svm

# 导入 GridSearchCV
from sklearn.grid_search import GridSearchCV

# 设置参数候选项
parameter_candidates = [
  'C': [1, 10, 100, 1000], 'kernel': ['linear'],
  'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf'],
]

# 使用参数候选项创建分类器
clf = GridSearchCV(estimator=svm.SVC(), param_grid=parameter_candidates, n_jobs=-1)

# 根据训练数据训练分类器
clf.fit(X_train, y_train)

# 打印结果
print('训练数据的最佳得分:', clf.best_score_)
print('最佳惩罚参数C:',clf.best_estimator_.C)
print('最佳内核类型:',clf.best_estimator_.kernel)
print('最佳gamma值:',clf.best_estimator_.gamma)

# 将分类器应用到测试数据上,查看准确率得分
clf.score(X_test, y_test)  

# 用网格搜索参数训练一个新的分类器,评估得分
score = svm.SVC(C=10, kernel='rbf', gamma=0.001).fit(X_train, y_train).score(X_test, y_test)
print(score)

输出

训练数据的最佳得分: 0.9844097995545658
最佳惩罚参数C: 10
最佳内核类型: rbf
最佳gamma值: 0.001
0.9911012235817576

可以看到,我们获取到了合适的参数。

以上是关于pytorch&scikit-learn机器学1- 赋予计算机从数据中学习的能力的主要内容,如果未能解决你的问题,请参考以下文章

02-35 scikit-learn库之支持向量机

使用 scikit-learn 对多类支持向量机进行参数优化

scikit-learn:支持向量机。精度和/或准确度?

python机器学习——使用scikit-learn训练感知机模型

想要在不使用 Scikit-Learn 的情况下在 python 中构建支持向量机的真正建议 [关闭]

scikit-learn库的安装及使用,以支持向量机svm为例