Python高级机器学习(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-10 13:36:59

点击下载

作者:(英) 约翰·哈蒂(John Hearty)

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python高级机器学习

Python高级机器学习试读:

前言

什么是高级机器学习

你将从本书中得到什么

本书导读

阅读前提

读者对象

排版约定

读者反馈

用户支持

下载示例代码

下载本书的彩色图片

勘误

反盗版

问题

致谢

电子书

第 1 章 无监督机器学习

1.1 主成分分析

1.1.1 主成分分析入门

1.1.2 应用主成分分析

1.2 k均值聚类

1.2.1 聚类入门

1.2.2 开始聚类分析

1.2.3 调整聚类参数

1.3 自组织映射

1.3.1 自组织映射入门

1.3.2 部署自组织映射

1.4 扩展阅读

1.5 小结

第 2 章 深度信念网络

2.1 神经网络入门

2.1.1 神经网络的组成

2.1.2 网络拓扑结构

2.2 受限玻尔兹曼机

2.2.1 受限玻尔兹曼机简介

2.2.2 受限玻尔兹曼机的应用

2.2.3 受限玻尔兹曼机的扩展应用

2.3 深度信念网络

2.3.1 训练深度信念网络

2.3.2 应用深度信念网络

2.3.3 验证深度信念网络

2.4 扩展阅读

2.5 小结

第 3 章 堆叠式降噪自编码机

3.1 自编码机

3.1.1 自编码机简介

3.1.2 降噪自编码机

3.1.3 应用降噪自编码机

3.2 堆叠式降噪自编码机

3.2.1 应用堆叠式降噪自编码机

3.2.2 评估堆叠式降噪自编码机的性能

3.3 扩展阅读

3.4 小结

第 4 章 卷积神经网络

4.1 CNN介绍

4.1.1 CNN拓扑结构

4.1.2 应用CNN

4.2 扩展阅读

4.3 小结

第 5 章 半监督学习

5.1 简介

5.2 何为半监督学习

5.3 半监督算法实战

5.3.1 自训练

5.3.2 对比悲观似然估计

5.4 扩展阅读

5.5 小结

第 6 章 文本特征工程

6.1 介绍

6.2 文本特征工程

6.2.1 清洗文本数据

6.2.2 根据文本数据构造特征

6.2.3 测试准备好的数据

6.3 扩展阅读

6.4 小结

第 7 章 特征工程II

7.1 介绍

7.2 创建特征集

7.2.1 为机器学习应用构建特征

7.2.2 运用特征选择技术

7.3 特征工程实战

通过RESTful API获取数据

7.4 扩展阅读

7.5 小结

第 8 章 集成方法

8.1 集成简介

8.1.1 理解平均集成

8.1.2 应用提升法

8.1.3 使用堆叠集成

8.2 在动态应用中使用模型

8.2.1 理解模型稳健性

8.2.2 控制模型稳健性的策略

8.3 扩展阅读

8.4 小结

第 9 章 其他Python机器学习工具

9.1 可选的开发工具

9.1.1 Lasagne简介

9.1.2 TensorFlow简介

9.1.3 何时使用这些库

9.2 扩展阅读

9.3 小结

附录 代码运行要求版权声明

Copyright © 2016 Packt Publishing. First published in the English language under the title Advanced Machine Learning with Python.

Simplified Chinese-language edition copyright © 2020 by Posts & Telecom Press. All rights reserved.

本书中文简体字版由Packt Publishing授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。

版权所有,侵权必究。

前言

你好!欢迎阅读这本基于Python的高级机器学习指南。你很可能是因为最初萌发的兴趣而翻开本书,但并不确定能从中获得什么。简单地说,学习和运用机器学习技术从未像现在这样激动人心,而且,在机器学习领域中工作会使你长期受益。要想了解更高级的数据建模技术的最新知识或积累应用这些技术解决难题的经验,本书便是你的绝佳选择!什么是高级机器学习

受计算能力持续高速增长(根据摩尔定律)的影响,机器学习已经从曾经的研究型学科逐渐演化为活跃在各个商业领域的技术。这导致了新应用和新的(或重新发掘的)技术大量涌现,也使得原本不为大众所熟知的数据科学、人工智能和机器学习等概念迅速走进人们的视野,并成为全球企业战略规划的一部分。

机器学习应用的飞速发展得益于人们对持续创新的不断追求和大量研究资源的投入。这些先驱开发的技术开拓了新的应用领域,并让大众进一步了解了这些技术。人工智能和机器学习在个别领域的应用革新仍然很难实现,但有些则已经成为现实,如自动驾驶汽车、复杂图像的识别和修正、基因研究的更大胆尝试,而最为普遍的可能是在线商店、电子邮件收件箱和网络生活中逐渐成熟的个性化内容推荐。

面对众多可能性,在数据科学家专注的努力下,这个行业正经历着虽有些坎坷但飞速的成长。不但数据科学家和人工智能从业者的数量比几年前(2014年初)多了很多,而且高端机器学习研究的解决方案也变得更开放和更容易获取。

谷歌和Facebook的研究团队逐渐开始共享其架构、语言、模型和工具,以期它们能得到更多数据科学家的应用和改进。

机器学习社区已经足够成熟,能够不断创造或重新挖掘许多先进算法,而且这种趋势已经日益明显。更准确地说,曾经主要属于学术界的研究方向如今已经得到了业界的高度重视。成果之一是,现在出现了很多跨越业界和学术界的机器学习专家。另一个成果是,人们逐渐认识到一些高级算法可以用于攻克当今的一些前沿难题。随着时间的推移,我们也目睹了不断取得的新进展,其效果越来越好,前沿边界也在逐步推进。

综上所述,如果你想进入数据科学领域并培养机器学习技能,那么现在就是最好的时机。有关入门算法(包括聚类、回归模型和神经网络架构)及其工具的内容可以在众多在线课程和各类博文中找到。虽然掌握最前沿的数据科学技术(包括深度学习、半监督算法和集成模型)依然有难度,但这些技术本身已经可以在多种编程语言的软件库中使用了。你需要做的只是学习如何将理论知识与实际指导相结合,从而正确应用各种模型,这正是本书被赋予的使命。你将从本书中得到什么

本书致力于解读近年来出现的一些高级建模技术。无论你是经验丰富的数据科学家,还是想充分利用现有技能进入新领域的开发人员,都可以通过本书学习这些算法。

我的首要目标是确保你能够理解书中所探讨的算法。其中一些算法非常棘手,而且它们与统计学和机器学习中的其他概念紧密相关。

强烈建议新手先大致了解以下重要概念。● 包括MLP架构在内的神经网络架构● 包括梯度下降法和反向传播算法在内的学习算法● 网络模型的性能评估指标,如均方根误差● 均值聚类

有时,本书对所涉及的主题探讨得不够充分。因为本书的内容范围较广,所以进度会略快。在每章末尾,我都会推荐一些书或在线文章作为补充阅读材料,以便你就相关知识建立更广泛的基础。在阅读本书的过程中,如果遇到任何陌生概念,建议你进行一些额外的阅读,因为机器学习的知识之间具有协同的关联性;掌握得越多,就越容易在积累新的知识与技能时理解新概念。

持续积累新的知识与技能这一理念对于本书要达成的目标至关重要。每章都会介绍一种或多种算法,以期达成以下目标:● 从高层次上解释某算法的功能、适合解决的问题及其应用方法● 浏览算法的关键部分,包括拓扑结构、学习方法和性能评估● 通过评估模型输出确定如何提升性能

除了传授知识和技能,本书还希望达到一个更重要的目的:讨论和传达出资深机器学习从业者常见的一些品质。其中一种品质是创造力,主要体现在定义复杂结构和处理特定问题中。另一种重要品质则是严谨,本书通篇强调了这种品质,特别是在有意义的目标的性能测定和早期工作的严格评估方面。

最后,本书无意掩盖挑战数据难题时的现实:早期试验好坏参半的结果、大量的反复计算和频繁出现的绝境。与此同时,我会用一系列示例、对专业方法的剖析,以及更符合现实的难题(直到本书末尾)来展示如何用具有创造性、可靠和严谨的方法破除这些障碍,从而取得有意义的结果。

希望你在阅读过程中一切顺利,也希望你能够在解决为你准备的问题、将所学知识应用于新领域或新数据的过程中获得乐趣。

我们现在就开始吧!本书导读

第1章,无监督机器学习,介绍了如何用无监督学习技术来识别数据集的内在模式与结构。

第2章,深度信念网络,解释了受限玻尔兹曼机算法和深度信念网络算法的工作原理。通过学习这一章,你将了解如何应用这些算法,且更有把握通过评估输出结果来实现算法模型的改进与优化。

第3章,堆叠式降噪自编码机,通过用堆叠式降噪自编码机学习高维输入数据的特征表示,进一步提高你对深度架构的掌握程度。

第4章,卷积神经网络,展示了如何应用卷积神经网络(Convnet)。

第5章,半监督学习,阐释了如何应用多种半监督学习技术,如CPLE、自主学习和S3VM。

第6章,文本特征工程,探讨了一些数据预处理技巧,用于显著提高前述模型的性能和有效性。

第7章,特征工程II,展示了如何清除或缓解数据质量问题来实现数据治理,以及如何针对具体的算法进行数据转换,并介绍了增强数据的一些技巧。

第8章,集成方法,探究了如何构建更复杂的集成模型,并介绍了提升模型结果稳健性的方法。

第9章,其他Python机器学习工具,回顾了近期数据科学家使用的最佳工具,阐述了各工具的优势,并以贯穿全书的工作过程讨论了如何配合前文介绍的工具和技术来应用这些工具。

附录,代码运行要求,讨论了本书所需要的工具,且分别指明了每一章所需要的库。阅读前提

本书所使用的数据和代码都是公开的,包括开源Python库和框架。虽然每一章的示例代码都附有一个README文件,用于指明运行该章附带脚本中的代码需要安装的库,但我还是会将文件内容整理出来,以便你查阅。

建议你在阅读前几章时就安装好所需要的库,以便运行后续各章中的代码时使用。最好能提早安装第1章所需要的库,以便后文使用。读者对象

本书面向渴望了解近期数据科学领域中最新的进展,以提高自身技能的Python开发人员、分析师和数据科学家。例如,如果你想构造自己的图片或文本标注解决方案,或者想要参加Kaggle大赛,那么本书就是为你而写!

如果具备一定的Python功底并了解机器学习的一些核心概念,那么你将可以更轻松地阅读本书。排版约定

本书采用多种文本样式,以表示不同类型的信息。以下是一些样式的例子及其含义。

正文中的代码、数据库表名、用户输入将按如下样式显示:“通过使用下列代码,我们将PCA应用到手写digits数据集。”

代码块的格式如下所示:import numpy as npfrom sklearn.datasets import load_digitsimport matplotlib.pyplot as pltfrom sklearn.decomposition import PCAfrom sklearn.preprocessing import scalefrom sklearn.lda import LDAimport matplotlib.cm as cmdigits = load_digits()data = digits.datan_samples, n_features = data.shapen_digits = len(np.unique(digits.target))labels = digits.target

命令行输入或输出的格式如下所示:[ 0.39276606 0.49571292 0.43933243 0.53573558 0.42459285 0.55686854 0.4573401 0.49876358 0.50281585 0.4689295 ]0.4772857426 此图标表示警告或重要注释。 此图标表示提示或技巧。读者反馈

欢迎你随时提供阅读反馈,告诉我们你对本书的看法。读者反馈对我们很重要,它可以帮助我们开发更多读者能够真正充分利用的图书。

如有常规问题的反馈,请发送邮件至feedback@packtpub.com,并在主题处注明书名。

如果你擅长某个话题,而且愿意撰写相关文章或投稿,请登录www.packtpub.com/authors阅读我们的作者指南。用户支持

现在你已经成为Packt出版社作品的拥有者,因此我们为你准备了一系列内容,以帮助你充分发挥所购图书的作用。下载示例代码

如果你是从http://www.packtpub.com网站购买的图书,登录自己的账号后就可以下载所有已购图书的示例代码。如果你是从其他地方购买的图书,请访问http://www.packtpub.com/support网站并注册,我们会将代码文件直接发送到你的电子邮箱。

你也可以通过以下步骤下载代码文件。

(1) 使用你的电子邮箱地址和密码在我们的网址上登录或注册。

(2) 将鼠标移到页面上方的SUPPORT标签。

(3) 点击Code Downloads & Errata。

(4) 在Search框中输入书名。

(5) 选择你需要下载代码文件的图书。

(6) 在下拉菜单中选择你购买本书的途径。

(7) 点击Code Download。

下载文件后,确保使用以下工具的最新版本来解压或提取文件夹:● WinRAR / 7-Zip(Windows)● Zipeg / iZip / UnRarX(Mac)● 7-Zip / PeaZip(Linux)

本书代码也托管在GitHub上,访问https://github.com/bonzanini/Book-SocialMediaMiningPython即可获取。Packt拥有丰富的图书和视频资源,GitHub仓库https://github.com/PacktPublishing/提供了这些资源的相关代码。欢迎查阅!下载本书的彩色图片

我们也为你提供了一份PDF文件,其中包含了本书中的截屏和图表等彩色图片。这些彩色图片可以帮助你更好地理解输出的变化。下载地址:https://www.packtpub.com/sites/default/files/downloads/AdvancedMachineLearningwithPython_ColorImages.pdf。勘误

虽然我们竭力确保图书内容的正确性,但错误在所难免。如果你在我们出版的任何一本图书中发现了文本或代码错误,希望你能告知我们,我们将非常感激。你的善举足以减少其他读者在阅读出错内容时的纠结和不快,并帮助我们在后续版本中更正错误。如果你发现任何错误,请访问http://www.packtpub.com/submit-errata,选择相应图书,点击Errata Submission Form链接,并输入有关错误的具体信息。1提交的错误得到验证后,我们就会接受你的建议,并将该处错误信息上传到我们的网站或添加到已有勘误表的相应位置。

1本书中文版勘误请到https://www.ituring.com.cn/book/1941查看和提交。——编者注

访问https://www.packtpub.com/books/content/support并在搜索框中输入书名,即可查看该图书已有的勘误信息。这部分信息会在Errata部分显示。反盗版

任何媒体都会面临版权内容在互联网上的盗版问题,Packt也不例外。Packt非常重视版权保护。如果你发现我们的作品在互联网上被非法复制,不管以什么形式,都请立即为我们提供相关网址或网站名称,以便我们进行补救。

请将疑似盗版材料的网址发送到copyright@packtpub.com。

你的反盗版行动就是在保护作者和出版社,只有这样,我们才能继续以优质内容回馈像你这样的热心读者。问题

如果对本书存有任何方面的疑问,可以通过questions@packtpub.com邮箱联系我们,我们将尽力为你答疑解惑。致谢

我要感谢许多人,尤其是我的父母……感谢他们的耐心。还要感谢Tyler Lowe真挚的友情,感谢Mark Huntley对准确性的再三强调,感谢我之前在Lionhead工作室的团队。我还非常感谢Jared Huffman和Packt出版社勤勉的编辑团队所做的出色工作,在本书的创作过程中,他们一直给予我极大的信心和支持。

最后,我想把这本书献给你,我的读者。若想掌握本书的主题,没有比现在更好的时机了。如今的世界充满新机遇,而你可以用创造性的头脑和恰当的模型来抓住机会。希望你在寻求解决方案时,总是能够取得成功。电子书

扫描如下二维码,即可购买本书电子版。第 1 章 无监督机器学习

本章将介绍如何用无监督学习技术来识别数据集中的模式和结构。

无监督学习是用于探索性分析的一系列很有价值的技术。它们能够挖掘出隐藏在数据集中的模式和结构,获取有用的信息或为进一步分析提供指导。拥有一套可靠的无监督学习工具集至关重要,你可以应用它们将陌生或复杂的数据集分解为可用信息。

我们将先从主成分分析(principal component analysis,PCA)这个基本的数据操作技术开始,并结合一系列的降维应用。接着探讨一项应用广泛且简单易用的无监督学习技术——k均值聚类。随后会讨论一种能将复杂数据集映射到二维的拓扑聚类方法——Kohenen提出的自组织映射(self-organizing map,SOM)。

本章会用一些篇幅来探讨如何有效应用这些技术将高维数据集整合为易于处理的形式。我们将使用UCI手写数字数据集来展示每种算法的技术应用。在探讨和应用每种技术的过程中,我们将回顾一些实际应用和方法论的问题,尤其是如何校准和验证每种技术,以及哪些性能评测方法是有效的。综上,我们将按顺序讨论以下主题:● 主成分分析● 均值聚类● 自组织映射1.1 主成分分析

为了有效处理高维数据集,我们必须有一套技术能将维度降至可处理的水平。降维的优势包括:可以在二维空间中对多维数据进行可视化、用最少的特征描述数据集所包含的信息,以及在某些情况下识别模型向量的共线性。 在机器学习的背景下,所谓的共线性是指模型特征

共有的接近线性的关系。这些特征一般用处不大,原因很明

显,相关特征不大可能比它们独立时提供更多的信息量。而

且,共线特征可能会突出局部极小值或给出其他错误的线

索。

当今应用最广泛的降维技术可能就是主成分分析了。本书将在多处使用主成分分析,因此最好先回顾一下该技术、理解其背后的理论,并编写能够有效应用主成分分析的Python代码。1.1.1 主成分分析入门

主成分分析是一种强大的分解方法,它能够将变量极多的数据集分解为一系列正交向量。取足够多的正交向量,就能够解释数据集中近乎全部的方差了。从本质上来说,集合中的这些正交向量就是数据集的精简版描述。主成分分析用途广泛,很值得我们花时间学习。 这里稍微提醒一下,当分解后的向量维度小于原始

数据集的变量个数时,往往会损失一些原始数据集中的信

息。若向量数目足够多,这种损失通常很小,但如果将变量

极多的数据集分解成很少的向量,那么就会损失“惨重”。

因此,在应用主成分分析时,必须考虑对数据集有效建模所

需要的向量数目。

主成分分析通过逐一辨别数据集中方差最大的方向(主成分)来提取向量,步骤如下所示:

(1) 找出数据集的中心点;

(2) 计算数据的协方差矩阵;

(3) 计算协方差矩阵的特征向量;

(4) 将特征向量标准正交化;

(5) 计算每个特征向量表示的方差比例。

我们来简要介绍一下这些概念。● 协方差:多维数据的方差,两个或多个变量之间的方差。一维或

一个变量的方差可由一个值来描述,两个变量之间的方差需要用

一个2×2的矩阵来描述,三个变量之间的方差需要用一个3×3的

矩阵来描述,以此类推。因此,主成分分析的第一步就是计算协

方差矩阵。● 特征向量:一种针对数据集或线性变换的向量。具体来说,这种

向量的方向在转换前后不会发生变化。为便于理解,假设你的两

手之间有一根直的橡皮筋,你伸展橡皮筋,直到它绷紧为止。特

征向量正是伸展前和伸展过程中不会发生方向变化的向量,也就

是本例中直接穿过橡皮筋中心从一只手到另一只手的向量。● 正交化:寻找两个相互正交(成直角)的向量的过程。在维数据

空间中,正交化的过程就是选取一系列向量,然后转化为一系列

正交向量。● 标准正交化:对积进行标准化的正交化过程。● 特征值:(大致相当于特征向量的长度)用于计算由每个特征向

量表示的方差比例,该比例由每个特征向量的特征值除以所有特

征向量的特征值之和得到。

总的来说,协方差矩阵用于计算特征向量,标准正交过程则是根据特征向量得出正交的、标准化向量。特征值最大的特征向量是第一个主成分,其他成分的特征值都相对较小。这样一来,主成分分析算法就能够将数据集转化为用新的低维坐标系来表示。1.1.2 应用主成分分析

概略地回顾了主成分分析算法后,接下来我们将其应用于一个重要的Python数据集,即UCI手写数字数据集(digits),它是作为scikit-learn的一部分发布的。

该数据集包含了来自44位作者的1797个手写数字。对这些作者的手写数字的笔压和位置信息使用8×8的点阵,经过两次重复采样后,得到了图1-1中的映射。

图 1-1

这些映射可以转化为维度为64的特征向量,从而作为分析输入项。对于含有64个特征的输入数据集,我们往往会立即想到使用诸如主成分分析的技术,从而将变量减少到可处理的数量。目前来看,我们无法用可视化探索来有效地分析数据集。

先对digits数据集应用主成分分析技术,代码如下所示:import numpy as npfrom sklearn.datasets import load_digitsimport matplotlib.pyplot as pltfrom sklearn.decomposition import PCAfrom sklearn.preprocessing import scalefrom sklearn.lda import LDAimport matplotlib.cm as cmdigits = load_digits()data = digits.datan_samples, n_features = data.shapen_digits = len(np.unique(digits.target))labels = digits.target

这段代码完成了以下工作。

首先,它加载了一系列必要的库,包括numpy库、scikit-learn库和用于绘图的matplotlib库。其中scikit-learn库主要包括digits数据集、主成分分析算法和数据标准化函数等一系列相关数据、算法和函数。

接着,开始准备digits数据集。步骤如下所示。● 首先,在构造有用的变量前加载数据集。● 创建data变量用于表示数据集,并根据digits数据集中的目标向

量计算出因变量的类别数(因为数字取值范围为0~9,所以

n_digits = 10)并存为变量,以供后续分析使用。● 将target向量存为变量,并命名为labels,以便后续使用。● 以上变量构造均是为了简化后续分析。

准备好数据集后,对主成分分析算法进行初始化并将其应用于数据集。pca = PCA(n_components=10)data_r = pca.fit(data).transform(data)print('explained variance ratio (first two components): %s' % str(pca.explained_variance_ratio_))print('sum of explained variance (first two components): %s' % str(sum(pca.explained_variance_ratio_)))

以上代码会输出由前10个主成分解释的方差,按解释能力由高到低排序。

本例中的10个主成分共同解释了0.589的总方差。这结果不算太差,毕竟我们将64个变量减少到10个主成分,但也的的确确反映出了主成分分析带来的潜在损失。然而,关键问题是,精简后的变量集能否便于后续的分析或分类,也就是说,降维向量保留的方差信息是否会影响分类预测效果。

用pca处理digits数据集,并将输出结果保存到新变量data_r中后,可以对输出进行可视化。为此,首先需要构建colors向量来给类上色,然后便可以绘制散点图:X = np.arange(10)ys = [i+x+(i*x)**2 for i in range(10)]plt.figure()colors = cm.rainbow(np.linspace(0, 1, len(ys)))for c, i target_name in zip(colors, [1,2,3,4,5,6,7,8,9,10], labels): plt.scatter(data_r[labels == I, 0], data_r[labels == I, 1], c=c, alpha = 0.4) plt.legend() plt.title('Scatterplot of Points plotted in first \n' '10 Principal Components') plt.show()

得到的散点图如图1-2所示。

图 1-2

这幅图告诉我们,虽然前两个主成分之间有一些间隔,但很难用本数据集来高度精确地区分。然而,很多类的内部的确出现了一些聚合现象,我们可以通过聚类分析获取一些有用信息。照此方法,我们可以利用主成分分析初步了解数据集的结构,然后再进一步分析。

接下来,应用均值聚类算法来继续探索聚类结果。1.2 k均值聚类

前面已经介绍过,无监督机器学习算法通常用于从复杂的大型数据集中提取关键的结构或内容信息。这些算法对手动输入的要求很低或无要求,并且不需要训练数据(即用一系列带标签的解释变量和响应变量来训练算法,以识别所需要的分类边界)。这意味着,无监督算法能有效生成新数据集或陌生数据集的结构和内容信息,以便分析师在短时间内深入理解数据。1.2.1 聚类入门

聚类可能是最典型的无监督学习技术,原因如下。

聚类算法经过了长久而深入的发展和优化,包括Python在内的大部分数据科学语言都进行了高效实现。

聚类算法执行高效,算法实现的平滑复杂度在多项式级别。这使得同时执行多个聚类过程变得没有那么复杂,即便是在大规模数据集上。另外,可扩展的实现方法也是存在的,它们可以在TB级规模的数据集上并行运行聚类算法。

聚类算法通常比较容易理解,若有必要,其操作过程也比较容易解释。

最常用的聚类算法是均值。通过在数据空间中随机确定个点,该算法可以构建个簇,每个点都是对应簇的均值。然后可以进行如下循环过程:● 根据(簇内)最小平方和原则,即距离最近原则,将数据点分配

至不同簇;● 将每个簇的中点(质心)作为新的均值,这会导致均值的位置发

生变化。

经过足够多的迭代后,质心就会移到能使性能指标(最常用的是“簇内最小平方和”指标)最小化的位置,此时观测点不会再随迭代而变化,算法也得到了收敛,从而得出聚类的一个解。1.2.2 开始聚类分析

回顾过聚类算法后,接下来运行以下代码并观察聚类的效果。from time import timeimport numpy as npimport matplotlib.pyplot as pltnp.random.seed()digits = load_digits()data = scale(digits.data)n_samples, n_features = data.shapen_digits = len(np.unique(digits.target))labels = digits.targetsample_size = 300print("n_digits: %d, \t n_samples %d, \t n_features %d" % (n_digits, n_samples, n_features))print(79 * '_')print('% 9s' % 'init'' time inertia homo compl v-measARI AMI silhouette')def bench_k_means(estimator, name, data): t0 = time() estimator.fit(data) print('% 9s %.2fs %i %.3f %.3f %.3f %.3f %.3f %.3f' % (name, (time() - t0), estimator.inertia_, metrics.homogeneity_score(labels, estimator.labels_), metrics.completeness_score(labels, estimator.labels_), metrics.v_measure_score(labels, estimator.labels_), metrics.adjusted_rand_score(labels, estimator.labels_), metrics.silhouette_score(data, estimator.labels_, metric='euclidean', sample_size=sample_size))) 上面的代码和之前的主成分分析代码的关键区别

是,这里的代码先对digits数据集应用了标准化函数,将数

据集的值限制在0~1。必须在必要时对数据进行标准化,既

可以是对数标准化,也可以是边界限制的标准化,以防不同

量级的变量值对数据集造成不成比例的重大影响。数据是否

需要进行标准化(以及何种标准化、标准化到什么范围等),

很大程度上取决于数据的形态和性质。如果数据的分布中出

现了离群点或大范围的波动,那么应用对数标准化更为合

适。通过可视化和探索性分析还是统计分析结果来进行手动

标准化,标准化决策往往与数据以及使用的分析方法紧密相

关。如果想要进一步了解标准化的决策和考虑,参见第7章。

scikit-learn的优点是默认应用均值++算法。均值++算法在原始均值算法的基础上进行了优化,兼顾了运行时间效率和聚类成功率,以避开糟糕的聚类结果。

均值++算法通过运行初始化过程来寻找逼近簇内最小方差的簇质心。

你可能已经从前面的代码中看出,我们用了一系列性能评估指标来跟踪均值聚类的效果。仅依赖正确率或其他算法常用的类似性能指标来评估聚类算法是不现实的。聚类算法的成功可以定义为它能够解释数据中蕴含的分组方式,而这些方式会受到包括类的分离度、组间相似性和组间差异在内的各种因素的影响。

同质性得分是一个取值在0~1的简单指标,用于度量簇内的数据点仅归属于某一类的程度。1代表所有簇内的数据点都属于同一类。该指标可与完整性得分一起使用,后者是一个类似的有界指标,度量给定类的成员被分配到同一个簇的程度。因此,完整性得分和同质性得分都为1的聚类就是完美的聚类。

有效性测度(v值)是同质性得分和完整性得分的调和平均数,与二元分类的F值非常类似,其本质上是用一个0~1范围内的值来代表聚类的同质性和完整性。

调整兰德指数(Adjusted Rand Index,ARI)是一个相似性指标,用于表示数据点集合间的一致性。对聚类来说,该指标度量的是已知的真实数据标签和基于聚类算法的预测标签之间的一致性。兰德指数在0~1有界范围内度量标签相似性,其中1代表完美地预测了标签。

上文提及的所有性能指标和其他相似指标(如赤池互信息准则)的主要问题是,它们都要基于对真实状况的理解,也就是说,被分析的部分数据或所有数据需要具有标签。如果标签不存在或无法生成,则这些方法无效。在实际工作中,这是一个极大的劣势,因为极少数据集是事先标注的,而且标注数据的过程非常耗时。

无须标注数据就能度量均值聚类效果的一种指标是轮廓系数。它能度量模型内聚类的明确程度。数据集的轮廓系数指的是每个样本系数的均值,其中系数的计算方法如下所示:

公式中每项的定义如下所示。● :样本和簇内其他所有数据点的距离的均值。● :样本和最近邻簇内所有数据点的距离的均值。

该式取值范围为-1~1,其中-1代表错误聚类,1代表密度极大的聚类,0代表重叠聚类。上述属性与我们对一个良好聚类方案的期望相吻合。

可以对digits数据集应用前面提及的所有性能测量方法。因此,可以在digits数据集上初始化bench_k_means函数来完成前面的示例:bench_k_means(KMeans(init='k-means++', n_clusters=n_digits, n_init=10), name="k-means++", data=data)print(79 * '_')

这段代码会得到如图1-3所示的输出(注意,随机数种子的不同会导致结果不同)。

图 1-3

我们来仔细地观察一下这个结果。

轮廓评分为0.123,相当低,但在意料之中,毕竟手写数字数据本来就有很多噪声,的确容易出现重叠。然而,其他一些分数就不那么突出了。0.619的v值是比较合理的,但同质性得分很糟糕,这意味着簇质心不够完美。另外,0.465的ARI也不够理想。 这么说吧,最差的分类(即随机分类)最高能达到

10%的分类精度。所有性能测量指标的值也会非常低。虽然

肯定比随机分类更准确,但跟最优的分类算法相比,我们所

达到的效果还差得远。第4章会介绍,当卷积神经网络应用

于手写数字数据集时,分类错误将非常少。传统的均值聚类

几乎无法达到这样的精确度水平。

总而言之,有理由相信,我们可以做得更好。

因此我们再试一次,这一次多加一个处理环节。先应用前面用过的主成分分析技术为输入数据集降维。代码很简单,如下所示:pca = PCA(n_components=n_digits).fit(data) bench_k_means(KMeans(init=pca.components_, n_clusters=10), name="PCA-based", data=data)

这段代码将PCA应用到digits数据集,所获得的主成分数与数据集的标签类别数(本例即为数字的种类数)一致。进行下一步前,我们应该先检查一下PCA的输出结果,因为主成分维度过低可能代表数据集中存在共线性,或者需要进一步研究。

这一次的聚类效果得到了显著提升(见图1-4)。

图 1-4

v值和ARI大约提高了0.08,v值甚至达到了相当优秀的0.693。轮廓系数并没有发生很大改变。因为数据集非常复杂,而且簇间覆盖非常严重,所以现有结果已经很理想了,尤其是只添加一小段简单代码就得到了这种提升!

对digits数据集进行聚类后,就可以看到一些有意义的簇。图1-5同样表明,很难从输入的特征向量中挖掘出特征。

图 1-51.2.3 调整聚类参数

前面的示例描述了均值聚类的应用,并用相关代码展示了如何将聚类分析结果可视化,还介绍了一些适用的性能度量指标。然而,对真实的数据集应用均值聚类时,还必须考虑其他问题,后文会对此进行讨论。

另一个关键点是,如何选择恰当的值。以特定值对均值聚类进行初始化没有坏处,但很多情况下,我们一开始可能并不知道最终要确定多少个簇,因而不知道将定为多少合适。

可以用不同的值重新运行前面的代码,并观察性能测量方法的值,但这无法告诉我们最能捕捉数据特征的值是多少。值调整存在的风险是:随着的增大,轮廓系数或未解释方差可能会大幅减小,但我们无法得到有意义的聚类。极端情况是,当时(为样本数据的观测数),即每个数据点都自成一簇时,轮廓系数会很小,但聚类结果毫无意义。同时,还有许多值过高导致过度拟合的例子。

为缓解这种风险,可以用几种辅助方法(如肘部方法)先确定的几个可能取值。肘部方法很简单,绘制解释方差随值变化的图像即可。这样的图像一般看起来很像一只弯曲的手臂。

对主成分分析降维过的数据集来说,代码如下所示:import numpy as npfrom sklearn.cluster import KMeans

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载