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


发布时间:2020-08-01 21:03:04

点击下载

作者:[斯洛文尼亚]博思蒂安·卡鲁扎(Botjan Kalua)

出版社:人民邮电出版社

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

Java机器学习

Java机器学习试读:

前言

机器学习是人工智能的一个分支,它在算法与数据的协助下,让计算机像人类一样学习和行动。针对给定的数据集,机器学习算法会学习数据的不同属性,并对以后可能遇到的数据属性进行推断。

本书教你如何使用Java创建并实现机器学习算法,既有基础概念的讲解,也有示例供你学习。当然,还会介绍一些常用的机器学习库,如Weka、Apache Mahout、Mallet等。阅读本书后,你将懂得如何为特定问题选择合适的机器学习方法,以及如何比较与评估不同技术的优劣。书中还会讲解性能提升技术,包括输入预处理以及合并不同方法产生的输出。

我们将探讨使用Java库进行机器学习的技术细节,并配有清晰易懂的示例。同时,你还将学习如何准备要分析的数据、如何选择机器学习方法,以及如何衡量流程的有效性。

本书内容

第1章 机器学习应用快速入门。讲解机器学习的基础知识、常见概念、原理,以及机器学习的应用流程。

第2章 面向机器学习的Java库与平台。介绍各种机器学习专用的Java库与平台。你将了解每个库提供的功能,以及可以用于解决哪些问题。涉及的机器学习库有Weka、Java-ML、Apache Mahout、Apache Spark、Deeplearning4j和Mallet。

第3章 基本算法——分类、回归和聚类。从最基本的机器学习任务入手,使用小巧又易懂的数据集,介绍分类、回归和聚类的关键算法。

第4章 利用集成方法预测客户关系。深入研究一个真实的客户营销数据库,目标是对可能流失以及可进行追加推销与交叉推销的客户进行预测。我们将使用集成方法解决这个问题,并且采用在KDD Cup竞赛中获胜的解决方案。

第5章 关联分析。讲解如何使用关联规则挖掘分析共生关系。我们将通过“购物篮分析”了解顾客的购买行为,并讨论如何将这种方法应用到其他领域。

第6章 使用Apache Mahout制作推荐引擎。讲解一些基本概念,帮助你了解推荐引擎原理,然后利用Apache Mahout实现两个应用——基于内容的过滤与协同推荐器。

第7章 欺诈与异常检测。介绍异常和可疑模式检测的背景,然后讲解两个实际应用——保险索赔欺诈检测与网站流量异常检测。

第8章 利用Deeplearning4j进行图像识别。介绍图像识别与基本的神经网络架构,然后讨论如何利用Deeplearning4j库实现各种深度学习架构,以实现对手写体数字的识别。

第9章 利用手机传感器进行行为识别。借助传感器数据解决模式识别问题。这一章介绍行为识别过程,讲解如何使用Android设备收集数据,并提出一个分类模型以对日常生活行为进行识别。

第10章 利用Mallet进行文本挖掘——主题模型与垃圾邮件检测。讲解文本挖掘的基础知识,介绍文本处理管道,演示如何将其应用于两个实际问题(主题建模与文档分类)。

第11章 机器学习进阶。这是全书最后一章,提供关于如何部署模型的实用建议,并进一步给出提示,告诉你去哪里寻找更多资源、资料、场所和技术,以便深入了解机器学习。

阅读前提

为了实际运行书中示例,你需要一台安装有JDK的个人计算机。所有能下载的示例与源代码都假定你使用的是支持Maven(一个依赖管理与自动创建工具)与Git(版本控制系统)的Eclipse IDE开发环境。各章示例依赖Weka、Deeplearning4j、Mallet、Apache Mahout等各种库。关于如何获取与安装这些库,会在各章首次用到它们时进行讲解。

读者对象

本书为那些想学习如何使用Java机器学习库进行数据分析的人而写。或许你已经对机器学习有了一点了解,但从未用过Java;又或许你懂得一点Java,而在机器学习方面是个新手。不论你属于哪种情况,本书都能让你快速上手,并提供必需的技能,让你能够成功创建、定制,以及在实际生活中部署机器学习应用。如果你懂得一点基本的编程知识以及数据挖掘相关概念会更好,但不要求你必须拥有与数据挖掘程序包相关的开发经验。

配套资料

本书专门配有一个在线支持网站(http://machine-learning-in-java.com),从中可以找到所有示例代码、勘误表,以及其他入门资料。

排版约定

本书中,你会发现许多不同体例,它们用于区分不同类型的信息。下面给出一些例子,并对其含义进行说明。

正文中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、伪URL、用户输入和Twitter用户名显示如下:Bobheighteyecolorhobbies“比如,拥有、 、三个属性,对应值依次为185cmblueclimbingskydiving、、与 ”。

代码块表示如下:Bob={height: 185cm,eye color: blue,hobbies: climbing, sky diving}

所有命令行输入或输出写成如下形式:12,3,7,2,0,1,8,9,13,4,11,5,15,10,6,14,16

新术语与重要词语使用黑体显示。你在屏幕上看到的词,比如菜单或对话框中的词,在正文中显示如下:“在项目属性上点击鼠标右Java Build PathLibrariesAdd External JARs键,选择,单击选项卡,选择。” 警告或重要的注意事项。

  提示和技巧。

读者反馈

欢迎提供反馈,请将你对本书的看法告诉我们:哪些方面是你喜欢的,哪些方面你不喜欢。读者反馈对我们来说很重要,因为这可以帮助我们推出更符合读者需求的著作。

要给我们提供反馈,只需向feedback@packtpub.com发送电子邮件,并在邮件主题中指出书名。

如果你有擅长的主题,并有志于写书或撰稿,请参阅www.packtpub.com/authors的撰稿指南。

读者支持

购买本社图书后,你将获得各种帮助,让手中图书最大限度地发挥功效。● 下载示例代码

你可以从本书配套网站(http://machine-learning-in-java.com)下载书中示例代码。导航到Downloads版块,点击到Git仓库链接。

当然,你也可以使用自己的账号登录http://www.packpub.com网站下载本书示例代码。不论你在哪里购买本书,都可以访问http://www.packtpub.com/support。注册之后,我们会使用电子邮件将示例代码直接发送给你。

下载示例代码时,请按照如下步骤进行:

(1) 使用你的电子邮件地址与密码登录我们的网站,如果尚未加入会员,请先注册加入;

(2) 移动鼠标到SUPPORT菜单之上;

(3) 点击Code Downloads & Errata;

(4) 在Search文本框中输入书名;

(5) 选择你想下载代码文件的图书;

(6) 从下拉菜单中选择你购买本书的地点;

(7) 点击Code Download。

示例文件下载完成后,请使用如下最新版本的解压缩软件对文件进行解压。● WinRAR/7-Zip for Windows● Zipeg/iZip/UnRarX for Mac● 7-Zip/PeaZip for Linux

勘误

虽然我们力图让图书内容准确无误,但错误仍不可避免。如果你在本社图书中发现错误(包括正文和代码),请告诉我们,我们将感激不尽。你这样做不仅可以让其他读者免遭同样的挫折,还可帮助我们改进该书的后续版本。无论你发现什么错误,都请告诉我们。为此,可以访问http://www.packtpub.com/submit-errata,输入书名,单击链接Errata Submission Form,再输入错误详情。提交的勘误得到确认后,将被上传到我们的网站或添加到既有的勘误列表。

要查看已提交的勘误,请访问https://www.packtpub.com/books/content/support,并在搜索框中输入书名,Errata栏将列出你搜索的信息。

打击盗版

网上散布的盗版材料是各类媒体屡禁不绝的问题。在保护版权和许可方面,本社的态度非常严肃。如果你在网上看到本社作品的非法复制品,请马上把网址或网站名告诉我们,以便我们能够采取补救措施。

请通过copyright@packtpub.com与我们取得联系,并提供可疑的盗版材料链接。

感谢你为保护我们的作者提供的帮助,也十分感激对于我们提供有价值内容的能力给予的保护。

答疑

只要有与本书相关的问题,都可通过questions@packtpub.com与我们联系,我们将尽力解决。

电子书

扫描如下二维码,即可购买本书电子版。第1章机器学习应用快速入门

本章介绍机器学习的基础知识,包括常见主题与概念,这些内容将让你更容易理解相关逻辑以及所讲主题。本章的目标是让你快速了解应用机器学习的详细步骤,掌握机器学习的主要原理。本章涵盖以下内容:● 介绍机器学习及其与数据科学的关系● 讨论机器学习应用的基本步骤● 讨论所处理数据的类型及其重要性● 讨论收集数据以及对数据进行预处理的方法● 使用机器学习理解数据● 使用机器学习从数据获取有用信息并创建预测器

如果你已经熟悉机器学习,并急于开始编写代码,请跳过本章内容,直接阅读其他章节。然而,如果你想重温这些内容或者搞清一些概念,强烈建议你认真学习本章。1.1 机器学习与数据科学

如今,每个人都在谈论机器学习与数据科学。那么,机器学习究竟是什么?它与数据科学有着怎样的联系呢?这两个术语常被混淆,因为它们经常使用相同的方法,有着明显的重叠。因此,下面先区分这两个术语。

Josh Wills在Twitter上说:

“所谓的数据科学家指这样一类人,他们比软件工程师更懂统计学,比统计学家更懂软件工程。”

更具体地说,数据科学包含从数据获取知识的整个过程,它综合运用统计学、计算机科学以及其他领域的各种方法,帮助人们从数据中获取有用的知识与信息。事实上,数据科学是一个不断反复的过程,包括数据的采集、清洗、分析、可视化和部署。

另一方面,机器学习主要涉及数据科学的分析与建模阶段使用的通用算法与技术。对于机器学习,Arthur Samuel在1959年提出如下定义:

“机器学习是指研究、设计与开发某些算法,让计算机获得学习的能力,而不需要明确的编程。”1.1.1 机器学习能够解决的问题

机器学习方法主要有如下三种:● 监督学习● 无监督学习● 强化学习

给定一组样本输入X与它们的结果Y,监督学习的目标是产生一个通用的映射函数f,使得每一个输入都有对应的确定输出,即f :X Y。

监督学习的一个应用例子是检测信用卡欺诈。学习算法会学习所有带有“正常”或“可疑”标记(向量Y)的信用卡交易(矩阵X),并最终产生一个决策模型(即f 函数),对未见过的交易打标记(“正常”或“可疑”)。

相反,无监督学习算法所学的数据没有给定的结果标签Y,它主要学习数据的结构,比如将相似的输入数据归入某个聚类。因此,使用无监督学习能够发现隐藏在数据中的模式。无监督学习的一个应用例子是基于物品(Item-based)的推荐系统,其学习算法会发现购物者一同购买的相似商品,比如购买了书A的人也购买了书B。

强化学习从完全不同的角度处理学习过程。它假设有一个智能体(agent,可以是机器人、自动程序或计算机程序)与动态环境进行交互,以实现某个特定目标。环境由一组状态描述,智能体可以做出不同行为,以从一种状态变为另一种状态。有些状态被标为目标状态,如果智能体实现了这种状态,就会获得很大的奖励;而在其他状态中,智能体得到的奖励很少或没有,甚至还会被“惩罚”。强化学习的目标是找到最优策略,即映射函数,指定每个状态要采取的行为动作,而没有指导者(teacher)明确告知这样做是否会实现目标状态。强化学习的一个例子是汽车自动驾驶程序,其中“状态”与“驾驶条件”(比如当前速度、路况信息、周围交通状况、速度限制、路障)相对应,行为会驱动汽车做出诸如左转、右转、停止、加速、前行等动作。学习算法会产生一个策略,指定汽车在特定驾驶条件下要采取的动作。

本书中,我们把学习重点放在监督学习与无监督学习上,因为它们有许多相同的概念。如果强化学习激起了你的兴趣,建议阅读Richard S. Sutton与Andrew Barto二人合写的Reinforcement Learning: An Introduction,它是一本很好的入门书。1.1.2 机器学习应用流程

本书讲解的重点是机器学习的应用。我们将提供切实可用的技能,帮助你顺利地将学习算法应用于各种不同的情景设置。相比于机器学习相关的理论与数学知识,我们将把更多时间用来学习如何将机器学习技术应用于具体实践。借助这些实际应用技术,你可以让机器学习在具体应用中发挥强大作用。我们把讲解重点放在监督学习与无监督学习上,涵盖从数据科学到创建机器学习应用流程的所有必需步骤。

标准的机器学习应用流程就是回答一系列问题,可概括成如下5个步骤。

(1) 数据与问题定义:第一步是要问一些有趣的问题。你试图解决的问题是什么?它为何重要?哪种形式的结果能够回答你的问题?回答是简单的“是与否”吗?你需要从现有问题中挑选吗?

(2) 数据收集:一旦有问题要解决,你就需要使用相关数据。问一问自己,哪种数据能够帮助你回答问题。你能从现有可用来源获取所需数据吗?你必须对多个来源进行合并吗?你必须生产数据吗?存在取样偏差吗?你需要多少数据?

(3) 数据预处理:数据预处理的第一项任务是数据清洗,比如填补缺失值、平整噪声数据、移除异常值、解决数据一致性。通常,随后会有对多个数据源的整合以及数据转换,包括把数据转换到特定范围(数据标准化)、将数据分成一系列值段(数据离散化)、降低数据维数。

(4) 利用无监督学习与监督学习进行数据分析与建模:数据分析与建模包括无监督机器学习与监督机器学习、统计推断和预测。这个阶段有多种机器学习算法可供选用,比如k最近邻算法、朴素贝叶斯算法、决策树、支持向量机、逻辑回归、K均值算法等。至于选用哪种算法,取决于第一步中提到的问题定义以及所收集的数据类型。经过这一步,我们最终会从数据推导出模型。

(5) 模型评价:最后一步是对模型进行评价。通过机器学习创建模型后,接下来检查模型对源数据的拟合程度。如果模型的针对性太强,即对训练数据过拟合,那么它对新数据的预测效果就很有可能比较差;如果模型太通用,这意味着模型对训练数据欠拟合。比如,向欠拟合的天气预测模型询问加利福尼亚州的天气时,得到的回答总是“晴朗”。大多数时候这个回答是对的,但就有效预测天气来说,这个模型真的没什么用。这一步的目标是准确评价模型,确保模型面对新数据也能正常工作。进行模型评价时,常用的方法有独立测试、训练集、交叉验证、留一法交叉验证。

接下来,我们将详细讲解每个步骤,并且尝试理解机器学习应用流程过程中必须回答的问题类型,还要了解与数据分析、评估相关的概念。1.2 数据与问题定义

简单地说,数据就是一系列测量值,表现形式多样,比如数值、文字、测量值、观测值、事物描述、图像等。测量尺度

数据最常见的表示方式是使用一组属性值对。请看如下例子:Bob={height: 185cm,eye color: blue,hobbies: climbing, sky diving}Bobheighteye colorhobbies拥有、、三个属性,它们对应的值依次为185cmblueclimbing, sky diving、、。

上面这组数据可以简单表示如下表。表格的列对应属性或特征,表格的行对应特定的数据样本或实例。监督机器学习中,属性代表类或者目标变量,其值是我们想从其他属性值(X)进行预测得到的结果(Y),如表1-1所示。表1-1 示例列表姓名身高[cm]眼球颜色兴趣爱好Climbing, sky divingBob185.0BlueReadingAnna163.0Brown............

我们首先注意到的是属性值的类型。比如,身高是一个数值,眼球颜色是一个文本,兴趣爱好是一个列表。为了更好地理解属性值的类型,下面详细了解数据或测量尺度的不同类型。Stevens(1946)定义了如下4种测量尺度,它们的表现属性在不断增加。● 称名数据(Nominal data)相互排斥,但不分顺序,比如眼球颜色、婚姻状况、汽车的品牌等。● 顺序数据(Ordinal data)是数据顺序有意义的分类数据,但值之间没有区别,比如疼痛程度、学习成绩字母等级、服务质量评级、IMDB电影评分等。● 等距数据(Interval data)中两个值之间的不同具有意义,但是无“绝对0”概念。比如标准化后的考试分数、华氏温度等。● 等比数据(Ratio data)拥有等距变量(interval variable)的所有属性,并且还有明确的“0点”定义。变量为0时,表示该变量代表的某种事物或特征不存在。身高、年龄、股票价格、每周伙食支出等都是等比变量。

我们为什么要关注测量尺度呢?机器学习在很大程度上依赖于数据的统计属性,因此应该注意每个数据类型自身具有的限制。有些机器学习算法只能被应用到测量尺度的一个子集上。

表1-2总结了每种测量类型的主要操作与统计特性。表1-2 不同测量类型的主要操作与统计特性特性称名顺序等距等比频率分布√√√√ 中位数和众数√√√ 值顺序已知√√√  每个值之间的不同可以量化√√  值可以加减√√   值可以乘除√   拥有真0点√

此外,称名数据与顺序数据对应于离散值,而等距数据与等比数据还可以对应于连续值。监督学习中,我们想要预测的属性值的测量尺度决定哪种机器算法可用。例如,从有限列表预测离散值称为“分类”,它可以使用决策树算法实现;而预测连续值称为“回归”,可以使用模型树算法实现。1.3 数据收集

那么,数据从何而来呢?我们有两种选择:从现有源观察并获取数据,或者通过调查、模拟、实验生成数据。下面详细学习这两种方法。1.3.1 发现或观察数据

我们可以从很多地方发现或观察到数据,互联网就是最明显的数据源。英特尔(2013)给出图1-1,显示通过不同互联网服务收集的海量数据。2013年,数字设备产生了4泽字节(1021=10亿太字节)的数据。2017年,入网设备数量预计达到地球总人数的3倍,这些设备产生与收集的数据量将进一步增加。

有多种方法可以从互联网获取数据。● 从维基百科、IMDb、Million Song Dataset等网站批量下载。● 通过API(《纽约时报》、推特、脸书、Foursquare)访问数据。● 网页抓取:从网页上抓取公开、非敏感、匿名数据是可行的。抓取之前,请认真阅读版权条款与完整的引用信息。图1-1 通过不同互联网服务收集的海量数据

找到数据之后,我们面对的主要问题是要花时间与空间积累数据。这些数据只表明发生了什么,而不收集意图、动机或内在动机。最后,这样的数据中可能充斥着噪声,它们可能不完整、不一致,甚至会随时间发生变化。

获取数据的另一种方法是从各种传感器收集测量数据,比如移动设备中的惯性和位置传感器、环境传感器、软件代理关键性能监控指示器等。1.3.2 生成数据

另一种替代方法是你自己生成数据,比如通过调查。做调查设计时,我们必须把注意力放在数据采集上,明确被调查的对象是谁。我们只能从那些愿意参与调查并回答问题的被调查者处获取数据,并且,被调查者可以做出符合他们自身形象与研究者期望的回答。

其次,我们也可以通过模拟收集数据。这个过程中,领域专家在微观水平上指定用户行为模型。例如,群体模拟(crowd simulation)需要指定不同类型的用户在群体中如何行动,比如是随大流还是伺机逃离等。接着在不同条件下运行模拟,观察不同条件下会发生什么(Tsai等,2011)。模拟适用于研究宏观现象与突现行为(emergent behavior),然而这些模拟往往很难在实际生活中进行验证。

此外,你可以设计一些实验,彻底覆盖所有可能的结果,让所有变量保持不变,一次只操作一个变量。使用这种方法的代价很高,但通常都能得到质量最好的数据。1.3.3 采样陷阱

收集数据时可能碰到许多陷阱。为了证实这一点,我们先设想下面一个场景。假设存在一个通用的、不成文的规则,用于在学生之间免费发送普通邮件。如果你在贴邮票的地方写上“学生到学生”,这封邮件就会被免费投递到接收方。现在,假设雅各布给艾玛发送了一套明信片,并且假设艾玛真的收到了一些明信片。于是她就断定所有的明信片都寄到了,并且认为规则是真实有效的。也就是说,艾玛基于自己收到明信片这一事实就推断所有明信片都被寄到,然而她并没有那些雅各布寄出但未投递到的明信片信息。因此,艾玛无法在推断时把它们考虑进去。艾玛经历的就是“幸存者偏差”,即她只依据“幸存”的数据得出结论。需要指出的是,使用“学生到学生”邮票邮寄的明信片上都印有带圆圈的字母T,这表示“欠邮资”,邮资应该由接收方支付,包括小额罚金。然而,邮政公司常常要付出更多代价收取这些费用,因此一般不会这样做(Magalhaes,2010)。

另一个例子来自一项研究,这项研究发现平均死亡年龄最低的职业是“学生”。做学生不会造成你在年纪很小的时候死亡,只能说明你还年轻。这才是学生这个群体平均死亡年龄低的原因(Gelman与Nolan,2002)。

此外,一项研究发现,发生事故的司机中,只有1.5%报告说他们当时正在使用手机,而有10.9%的司机报告说是车中另一名乘客分散了他们的注意力。据此,我们能推断说,司机驾车时使用手机比与另一个乘客交谈更安全吗?(Uts,2003)为了回答这个问题,我们需要知道手机使用的盛行率。当时收集数据期间,相比于开车时使用手机,司机更有可能与车中的另一个人进行交谈。1.4 数据预处理

数据预处理的目标是,用最可行的方式为机器学习算法准备数据,因为并非所有算法都可以用于处理缺少数据、额外属性以及非标准值。1.4.1 数据清洗

数据清洗也叫数据整理、数据清理,处理过程如下:● 识别不准确、不完整、不相关、已损坏的数据,并在进一步处理之前移除;● 分析数据,提取感兴趣的信息,或者验证数据格式是否合法;● 将数据转换为常见的编码格式,比如utf-8、int32、时标或者标准范围;● 将数据转换为常见数据模式,比如如果收集的温度数据来自不同类型的传感器,那么可能需要将其变换为具有相同结构的数据。

接下来,看看更具体的数据预处理步骤。1.4.2 填充缺失值

一般来说,对于缺失值,机器学习算法工作得不是很好。但有极少数例外,比如决策树、朴素贝叶斯分类器,以及一些基于规则的学习器等。了解一个值缺失的原因至关重要,这些原因可能是多方面的,比如随机误差、系统误差、传感器噪声等。一旦找到缺失原因,就可以采用多种方法处理缺失值,常见处理方法如下。● 移除实例:如果有足够多的数据,并且其中只有几个非相关实例有一些缺失值,那么移除这些实例是安全的。● 移除属性:当大部分值缺失、值为常量,或者当前属性与另一个属性有强相关关系时,移除该属性是有意义的。● 指派为特殊值N/A:有时缺失值是由正当理由引起的,比如值超出指定范围、离散属性值未定义、无法获取或测量得到的值——这个值也可能是指示器(indicator)。比如,一个人从来不评价电影,那么他对这部电影的评分就不存在。● 填入属性平均值:如果拥有的实例数量有限,那么不能移除实例或属性。这种情况下,我们可以对缺失值进行估算,比如把属性的平均值或相似实例的平均值作为缺失值进行填充。● 依据其他属性值进行预测:如果属性有时间依赖关系,那么可以根据之前的已有值预测缺失值。

如上所述,出现缺失值的原因多种多样,因此了解值缺失或损坏的原因非常重要。1.4.3 剔除异常值

异常值是指数据中那些与其他数值相比有较大差异的数值,这些异常值对所有学习算法都有不同程度的影响。异常值可能是极端值,可以通过置信区域检测,并可借助阈值剔除。最好的方法是先对数据进行可视化,然后检查可视化图形,从中找出异常值。图1-2的可视化图形是个例子。请注意,数据可视化仅适用于低维数据。图1-2 可视化图形1.4.4 数据转换

数据转换技术将数据集转换为机器学习算法要求的格式,用作机器学习算法的输入。数据转换甚至可以帮助算法学得更快,获得更好的性能,比如标准化。假设数据服从高斯分布,采用如下方式做值变换:均值为0,标准差为1。

另一方面,归一化将属性值按比例缩放,使之落入一个小的特定区间,通常是[0, 1]。

许多机器学习工具箱自动对数据做归一化与标准化处理。

最后一个变换技术是离散化,用于将一个连续特征的范围切分为若干区间。为什么要这样做?因为有些算法,比如决策树、朴素贝叶斯算法,更擅长处理离散属性。最常用的选取区间(离散化)的方法如下。● 等宽离散化:该方法将连续变量的值域划分成k个具有相同宽度的区间。● 等频离散化:假设有N个实例,k个区间中的每一个都包含大约N/k个实例。● 最小熵(度量体系的混乱程度)离散化:该方法会递归地分割区间,直到区间分割引起的熵减大于熵增(Fayyad和Irani,1993)。

其中,前面两个方法需要手工指定区间数量,而最后一种方法则自动设置区间数量。但后者需要分类变量,这意味着它不能用于无监督机器学习任务。1.4.5 数据归约

数据归约用于处理大量属性与实例,属性数对应于数据集的维度数。具有较低预测能力的维度不仅对整个模型的贡献率非常小,还会带来许多危害。比如,一个拥有随机值的属性可能产生一些随机模式,这些随机模式会被机器学习算法识别。

为了解决这个问题,第一种处理方法是把这些属性剔除,换言之,只保留那些最看好的属性。这个过程称为特征选取或属性选取,具体可使用的方法有ReliefF、信息增益、基尼指数等,它们主要面向离散属性。

另一个处理方法是专注于连续属性,将数据集从原始维度转换到低维空间。例如,假设有一组三维空间中的点,我们可以将其映射到二维空间。这个过程中会丢失一些信息,但如果第三个维度是不相关的,则不会丢失很多信息,数据结构与相关性几乎都能完美保留。具体可用方法如下:● 奇异值分解(SVD)● 主成分分析(PCA)● 神经网络自动编码器(Neural nets auto encoders)

数据归约中的第二个问题是数据包含太多实例。这么多个实例可能是重复的,或者来自一个非常频繁的数据流。解决这个问题的方法是从中选用实例子集,选择时要保证所选数据的分布与原数据的分布相似,更重要的是观测的过程类似。减少实例数量的技术包括随机数据采样、数据分层法等。准备好数据后,接下来对数据进行分析与建模。1.5 无监督学习

无监督学习是指,通过数据分析从没有标签的数据中发现隐藏的结构。由于数据不带有标签,所以我们无法通过误差测量对学过的模型做评价。即便如此,无监督学习仍然是个极其强大的工具。你是否曾经好奇过,亚马逊是如何预测你喜欢什么书的?在你还未做出选择时,Netflix如何知道你想看什么?这些问题的答案都可以在无监督学习中找到。下面给出一个类似的例子。1.5.1 查找相似项目

许多问题都可以归结为查找元素相似集,比如购买了类似商品的顾客、包含相似内容的网页、含有相似对象的图像、访问过类似网站的用户等。

如果两个项目相距非常近,就可以将其视为是类似的。主要问题是如何表示每个项目,以及如何定义项目之间的距离。距离测量主要有两类:一类是欧氏距离(Euclidean distance),另一类是非欧距离(no-Euclidean distance)。1. 欧氏距离

n维欧氏空间中,两个元素之间的距离基于元素在这个空间中的

位置,常称为“p-范数距离”(p-norm distance)。常用的两个距

离度量是L2与L1范数距离。

L2范数也叫欧氏距离,它是最常用的距离度量,用于度量二维

空间中的两个元素相距多远。它是两个元素在每个维度上差的平

方和的平方根,计算公式如下:

L1范数又称曼哈顿距离(Manhattan Distance)、城市街区距离(City Block Distance)、出租车范数(Taxicab Norm),它是两

个元素在每个维度上差的绝对值之和,计算公式如下:2. 非欧距离

非欧距离基于元素的属性,而非它们的空间位置。其中较为著名

的有杰卡德距离(Jaccard Distance)、余弦距离(Cosine

Distance)、编辑距离(Edit Distance)、汉明距离(Hamming

Distance)。

杰卡德距离计算两个集合间的距离。首先,计算两个集合的杰卡

德相似系数(Jaccard Similarity),它被定义为“两个集合交集

的元素个数除以并集的元素个数”,公式如下:

杰卡德距离被定义为“1减去杰卡德相似系数”,公式如下:

余弦距离也称为余弦相似度(Cosine Similarity)。两个向量的余

弦距离关注的是它们的方向,而非大小。因此,如果两个向量方

向一致,那么它们的余弦相似度为1,而两个垂直向量的余弦相

似度为0。假设有两个多维点,所对应的向量分别从原点(0, 0,

0, ..., 0)指向它们所在的位置。两个向量之间形成一个夹角,它

们的余弦距离就是向量的标准点积,如下:

余弦距离通常用于高维特征空间,比如文本挖掘。一个文本文档

代表一个实例,特征对应于不同单词,它们的值对应于单词在文

档中出现的次数。通过计算余弦相似度,我们能够了解两个文档

内容的相似程度。

编辑距离用于比较两个字符串。两个字符串a(=aaa...a)与n123

b(=bbb...b)之间的距离是指,从字符串a转成字符串b所需n123

的最少编辑操作数,允许的编辑操作包括插入一个字符、删除一

个字符。比如,有两个字符串a=abcd和b=abbd,将字符串a转成

b时,必须先删除字符串b中的第三个字母b,然后在删除位置插

入字母c。整个过程中没有比这更少的操作数了,所以字符串a到

b的编辑距离就是d(a, b)=2。

汉明距离用于比较两个大小相同的向量,计算它们不同的维数。

换言之,该距离指的是从一个向量变换为另一个向量所需的替换

数。

许多距离可以用于度量各种属性,比如相关性度量两个元素之间

的线性关系,马氏距离(Mahalanobis Distance)度量一个点与

其他点所服从的分布之间的距离,SimRank基于图形理论衡量元

素呈现结构的相似程度,等等。正如你想的那样,为你的问题选

择并设计合适的相似性度量后,就完成了一大半工作。A.A.

Goshtasby所著的Image Registration: Principles, Tools and

Methods一书的第2章中,关于相似性度量评估的讲解令人印象

深刻,可以参考学习。3. 维数灾难

维数灾难是指我们拥有大量特征——通常有成千上百个——

时,这些特征会产生一个带有稀疏数据的极大空间,以致距离异

常。比如在高维空间中,几乎所有点对彼此之间都是等距的。其

实,几乎所有点对的距离都接近平均距离。维数灾难的另一个表

现是,任意两个向量几乎都是垂直的,这意味着所有夹角都接近

90°。实际上,这让任何距离度量都失去了意义。

使用某种减少特征数量的数据归约技术或许可以解决维数灾难问

题。比如,可以运行ReliefF等特征选择算法或PCA等特征提取/

缩减算法减少特征数量。1.5.2 聚类

聚类技术根据某种距离度量,将类似的实例归入相应的簇。主要思想是将类似(相互靠得很近)的实例放入同一个簇,同时让不相似(彼此离得很远)的点位于不同的簇。图1-3展现了簇的样子。

聚类算法有两个最基本的方法。第一个是分层(hierarchical)或凝聚(agglomerative)方法,先将每个点作为它自己的簇,然后不断把最相似的簇合并在一起。合并达到预先指定的簇数时,或者待合并的簇覆盖一大片区域时,就停止合并操作。

另一个方法基于点分配(Point Assignment)。首先估计(比如随机)初始的簇中心(即簇质心),然后将每个点分配到离它最近的簇,直到分配完所有点。最有名的算法是K均值聚类算法。

K均值聚类算法中,把那些相互间尽可能远的点选为初始的簇中心,或者(分层)聚集数据样本并选取离每个簇(共k个簇)中心最近的点作为初始的簇中心。图1-3 簇1.6 监督学习

许多令人惊叹的技术背后隐藏着一个关键概念——监督学习,这些技术包括声音识别、垃圾邮件过滤、图像中的面部识别、侦测信用卡欺诈等。更正式地讲,给定一组学习样本D,用特征X 进行描述,监督学习的目标是找到一个函数对目标变量Y 进行预测。函数f 描述特征X 与类Y 之间的联系,称为模型:

监督学习算法的通用结构由如下决策定义(Hand等,2001):● 定义任务;● 确定机器学习算法,它会产生特定归纳偏置,即先验假设,这是针对目标概念做出的;● 确定得分函数与代价函数,比如信息增益、均方根误差等;● 确定最优/搜索方法优化得分函数;● 找到一个函数,用以描述X 与Y 之间的关系。

上面许多决定已经由任务的类型与我们拥有的数据集确定了。接下来将详细学习分类与回归方法,以及相应得分函数的有关内容。1.6.1 分类

分类可以处理离散类,其目标是对目标变量中的互斥值之一进行预测。一个应用例子是做信用评估,最终预测结果是判断目标人物的信用是否可靠。最流行的算法有决策树、朴素贝叶斯分类器、支持向量机、神经网络以及集成算法(Ensemble Method)。1. 决策树学习

决策树学习过程中会创建一个分类树,树的每一个节点对应一个

属性,边对应属性一个可能的值(或区间),节点由此而生,每

个叶子对应一个类标签。决策树可以可视化并以明确的方式表示

预测模型,这让它成为一个很透明(白箱)的分类器。比较有名

的算法有ID3与C4.5,此外还有许多可选实现与改进算法(比如

Weka中的J48)。2. 概率分类器

给定一组属性值,概率分类器(Probabilistic Classifiers)可以对

一组类的分布进行预测,而不预测一个确切的类。这可以作为确

定性程度来使用,即分类器对自己的预测有多大把握。最基本的

分类器是朴素贝叶斯分类器,它也是最理想的分类器——当且

仅当属性是条件独立的。但不幸的是,这在实际情况中极其少见。

其实有一个称为概率图模型的庞大分支,包括成百上千的算法,

比如贝叶斯网络、动态贝叶斯网络、隐马尔可夫模型、条件随机

场(不仅可以处理两个属性间的特定关系,还可以处理现时依赖

性)。关于这个主题,Karkera写了一本很棒的入门书Building

Probabilistic Graphical Models with Python,Koller与Friedman出

版了一本详尽的理论“圣经”——《概率图模型:原理与技

术》。3. 核方法

通过对模型应用核技巧(kernel trick),用核函数(kernel

function)替代模型的特征(预测器),可以将任意一个线性模型

转换为非线性模型。换言之,核技巧隐式地将数据集变换成更高

维度。核技巧充分利用了“分离更高维的实例通常更容易”这一

事实。可以使用核技巧的算法包括核感知器、支持向量机(SVM)、高斯过程、PCA、典型相关分析、岭回归、谱聚类、

线性自适应过滤器等。4. 人工神经网络

人工神经网络是受生物神经网络结构的启发而提出的,可以用于

机器学习,也可以进行模式识别。人工神经网络通常解决回归与

分类问题,包含各种算法以及各种问题类型的变种。比较流行的

分类方法有感知器、受限玻尔兹曼机、深度信念网络(Deep

Belief Network)。5. 集成学习

集成方法由一系列不同的弱模型组成,以此获得更好的预测能

力。先单独训练各个模型,然后采用某种方式将其预测组合起来,

以产生更全面的预测。因此,集成体包含针对数据的多种建模方

式,希望能够产生更好的结果。集成学习是机器学习算法中非常

强大的工具,也很流行,包括Boosting方法、Bagging方法、

AdaBoost、随机森林。这些方法的主要不同在于它们组合的学

习器的类型以及选用组合方式。6. 分类评估

我们的分类器工作效果很好吗?这个分类器比另一个要好吗?在

分类中,我们计算分对与分错的次数。假设有两个可用的分类标

签——yes与no,有4种可能的结果,如表1-3所示。● 真正-命中:这表示一个yes实例被正确地预测为yes。● 真负-正确否定:这表示一个no实例被正确地预测为no。● 假正-误警:这表示一个no实例被预测为yes。● 假负-未命中:这表示一个yes实例被预测为no。

表1-3 两个分类标签的可能结果预测为正?YesNoYesTP-真正FN-假正真正吗?NoFP-假正TN-真负

对分类器的性能进行度量的两个最基本度量值是分类错误与分类

精度,如下:

分类错误=

 

分类精度=

这两个度量值的主要问题是,它们不能处理不平衡类。对一笔信

用卡交易是否为欺诈进行分类就是不平衡类问题的一个例子:正

常交易占99.99%,欺诈仅占极小数。对于每笔交易,分类器将

其判断为正常交易,这种准确率可达99.99%,但我们主要感兴

趣的是那些极少出现的几个分类。

(1) 准确率与召回率

这个解决方案用到了两个不包含TN(正确否定)的度量值,它

们定义如下。● 准确率:被分类器判定为正的所有样本实例(TP+FP)中,被正确判断为正(TP)的正例样本所占比重。准确率=● 召回率:在总正例样本(TP+FN)中,被正确判定为正(TP)的正例所占比重。召回率=常见的做法是,把两个度量值组合起来,形成F 值(F-measure)作为加权平均值;计算分数的同时考虑准确率和召回率,分数的最好值为1,最差值为0,计算公式如下:F 值=

(2) Roc曲线

大多数分类算法都会返回一个分类置信度,记作f(X),它反过来

计算预测。沿用前面信用卡欺诈的例子,规则可能如下:

阈值决定错误率与真正率。我们可以把所有可能的阈值结果绘制

成ROC曲线(受试者工作特征曲线),如图1-4所示。图1-4 阈值的ROC曲线

图中短点虚线表示的是随机预测器,长点虚线表示的是完美预测

器。为了判断分类器A是否优于分类器C,我们对曲线以下的区

域进行比较。

大多数工具箱都提供上面提到的所有度量指标,且开箱即用。1.6.2 回归

回归方法处理连续的目标变量,这与使用离散目标变量的分类方法不同。例如,预测未来几天的室外温度时,我们会使用回归方法,而分类方法只能预测未来几天是否下雨。一般来说,回归过程评估的是各种特征之间的联系,即特征变化是如何改变目标变量的。1. 线性回归

最基本的回归模型假定特征与目标变量之间有线性依赖关系。这

个模型经常使用最小二乘法进行拟合,它是使误差的平方最小的

模型。许多情况下,线性回归不能对复杂关系进行建模。比如,

图1-5显示了4组不同的点,它们有相同的线性回归曲线。其中左

上模型描述了数据的总体趋势,可以认为模型是合适的;左下模

型对数据点的拟合更好,但有一个离群点(你应该小心检查它);

右上与右下的线性模型完全偏离了下层的数据结构,不能将其视

为合适的模型。图1-5 线性回归模型2. 回归评估

回归中,我们从输入X 预测数值Y,这些预测通常是错误的、不

准确的。我们要问的主要问题是:这些预测值与实际值相差多少?

换言之,我们要测量预测值与实际值之间的距离。

(1) 均方误差

均方误差(mean squared error)是预测值与实际值差的平方和

的平均值,计算公式如下:

均方误差对异常值非常敏感。比如,99个准确率100%的预测加

上1个准确率为90%的预测,得分和100个准确率为99%的预测一

样。而且,均方误差对平均值也敏感。因此,人们更多使用相对

平方误差(relative squared error)将预测器的MSE与均值预测

器——总是用于预测平均值——的MSE进行比较。

(2) 平均绝对误差

平均绝对误差(mean absolute error)是预测值与实际值差的绝

对值之和的平均值,计算公式如下:

MAS对异常值不太敏感,但它对平均值与规模是敏感的。

(3) 相关系数

相关系数以两变量与各自平均值的离差为基础,通过两个离差相

乘反映两变量之间相关程度。若相关系数为负值,则表示弱相关;

若为正值,则表示强相关;若为0,则表示不相关。实际值X与

预测值Y之间的相关系数定义如下:

相关系数对平均值与规模完全不敏感,对异常值不太敏感。它能

获取相对排序(relative ordering),对文档关联性与基因表达等

任务进行分级排列时很有用。1.7 泛化与评估

模型创建好之后,我们如何知道它针对新数据正常工作?这个模型有什么好?为了回答这些问题,首先学习模型泛化(model generalization),然后了解如何对模型在新数据上的性能进行评估。欠拟合与过拟合

对预测器训练得到的模型可能太复杂或者太简单。低复杂度模型(最左边模型)可能像预测最频繁或平均类值一样简单,而高复杂度模型(最右边模型)能够表示训练实例。模型太刚性(如图1-6左侧模型)就不能获得复杂模式,而模型太柔性(如图中右侧模型)就会把训练数据中的噪声也一起融合进去。我们面临的主要挑战在于选择合适的学习方法及其参数,只有这样,经过学习得到的模型才能在新数据上有良好的表现(见图1-6中间模型)。图1-6 不同类型的模型

图1-7反映了训练集中的错误是如何随着模型复杂度减少的。简单刚性模型对数据的拟合度不够,导致大量错误。随着模型复杂度的增加,它可以更好地描述训练数据的结构,错误必然会减少。如果模型太复杂,极有可能对训练数据拟合过度,预测错误随之增加。图1-7 训练集中的错误随着模型复杂度的增加而减少

根据任务复杂度与数据可用性,我们可以把分类器的结构调整得更简单或者更复杂。大部分学习算法支持用户做如下调整。● 回归:多项式的次数● 朴素贝叶斯:属性数目● 决策树:树节点的数目、修剪置信度● k最近邻算法:邻居数目,基于距离的邻居权重● SVM:核类型,代价参数● 神经网络:神经元与隐藏层的数目

通过调整,我们希望把泛化误差(Generalization error)最小化,即让分类器在未来数据上有良好的表现。遗憾的是,我们无法计算真正的泛化误差,但可以做估计。然而,如果模型在训练数据上表现良好,但在测试数据上表现较差,说明这个模型极有可能过拟合。1. 训练集与测试集

为了估算泛化误差,我们将拥有的数据划分成两部分:训练数据

与测试数据。根据一般经验,划分数据时,训练数据与测试数据

的比例应该是70:30。首先使用训练数据对预测器进行训练,然

后使用预测器对测试数据进行预测,最后计算误差(预测值与真

实值之差)。这样就可以对真实的泛化误差进行评估了。

评估基于如下两个假设:首先,假设测试集是来自数据集的无偏

样本集;其次,假设新数据将根据训练与测试样本进行分布重组。

第一种假设可以通过交叉验证与层化处理(Stratification)的方

法得到实现。此外,虽然这种情况很少见,但如果真的没有足够

多的数据用作单独的测试集,那么学习算法就会运行得很不理想

——因为它们接收不到足够多的数据。这种情形下,可以使用

交叉验证。2. 交叉验证

交叉验证将数据集划分成k个子集,它们大小差不多,比如图1-8

显示的5个子集。首先,将2~5子集用于学习,将1子集用于训练。

然后重复这个过程5次,每次多拿出一个集合用于测试,并计算

5次重复的平均误差。图1-8 交叉验证

借助这种方法,可以将所有数据用于学习与测试,但要避免使用

相同数据训练与测试模型。3. 留一法交叉验证

留一法交叉验证是交叉验证的一个极端例子。留一法交叉验证中,

折(fold)的数目等同于实例的数目。先留出一个实例,其余实

例全部用来学习,然后用留出的实例测试模型。针对所有实例重

复上述过程,这样每个实例只有一次用来做验证。我们拥有的学

习样本有限时——比如少于50个——建议使用该方法。4. 层化处理

层化处理方法用于选取样本子集,选择时,每一层(fold)都大

致包含相同比例的类值。如果一个类是连续的,那么这些分层都

会被选择,这样平均响应值在所有层差不多都一样。层化处理可

以和交叉验证、单独训练集或测试集一起使用。1.8 小结

本章复习了机器学习的基础知识,重温了机器学习的应用流程,还阐述了机器学习的主要任务、方法与算法。下一章将介绍有哪些可用的Java机器学习库,以及它们可以用来做什么任务。

 第2章面向机器学习的Java库与平台

自己动手实现机器学习算法可能是最好的学习方法,但如果你站在巨人肩上,充分利用现有开源库,就能更快地推进自己的项目。

本章将学习Java语言中与机器学习相关的各种库与平台,了解每个库的功能,以及可以用它们解决的问题。

本章将学习如下内容。● 实现机器学习应用时需要具备的Java环境● Weka:一个通用的机器学习平台● Java机器学习库:一系列机器学习算法● Apache Mahout:一个可伸缩的机器学习平台● Apache Spark:一个分布式机器学习库● Deeplearning4j:一个深度学习库● MALLET:一个文本挖掘库

此外,我们还将讨论如何使用这些库与其他组件为单机与大数据应用创建完整的机器学习应用栈。2.1 Java环境

新机器学习算法常常先出现在大学的实验室中,通常组合了几种语言,比如shell脚本、Python、R、MATLAB Java、Scala、C++,用于证明一个新概念,并对属性做理论分析。一个算法可能要经过漫长的重构之路,才能进入一个带有标准输入/输出与用户界面的库。Python、R、MATLAB相当流行,它们主要用来编写脚本、做研究与实验。另一方面,Java是事实上的企业级语言,这归因于它支持静态类型,拥有健壮的IDE支持,以及良好的可维护性、不错的线程模型、高性能并发数据结构库。此外,还有许多可用的Java机器学习库,用户可以很方便地将其应用于现有的Java应用程序,充分利用机器学习的强大能力。2.2 机器学习库

基于Java的开源机器学习项目超过70个,你可以在MLOSS.org网站中看到这些项目的列表。除此之外,可能还有很多未列出的项目存在于各大学的服务器、GitHub或BitBucket上。我们将学习几个主要的库与平台,了解它们能够解决哪类问题、支持哪些算法,以及使用哪种数据。2.2.1 Weka

Weka是Waikato Environment for Knowledge Analysis(怀卡托智能分析环境)的缩写,它是由新西兰怀卡托大学开发,可能是最著名的Java机器学习库。Weka是一个通用库,能够完成各种机器学习任务,比如分类、回归、聚类,其特色是拥有丰富的图形用户界面、命令行界面与Java API。更多内容请参考http://www.cs.waikato.ac.nz/ml/weka/。

写作本书之时,Weka总共包含267种算法:数据预处理(82)、特征选择(33)、分类与回归(133)、聚类(12)、关联规则挖掘(7)。图形界面适用于数据探索,而Java API允许开发新的机器学习方案,并将相关算法应用到你的应用程序。图2-1 Weka

Weka在GNU通用公共许可协议下发行,这意味着你可以复制、发行与修改。但要在源文件中跟踪变化,并且遵守GNU GPL协议。你甚至可以商业方式发行,但必须开放源代码或者获得商业许可证。

Weka除了支持几种常见的文件格式之外,还有自己默认使用的专有数据格式——ARFF,这种数据格式使用属性数据对(attribute-data pairs)描述数据。ARFF文件主要包含两部分,第一部分是头部定义,指定所有属性(即特征)和对应的类型,比如分类型(nominal)、数值型(numeric)、日期型(date)、字符串型(string);第二部分是包含数据的数据区,其中每一行对应一个实例。头部定义中的最后一个属性被隐式地看作目标变量,缺失数据用问号Bob表示。回想一下第1章举过的例子,采用ARFF文件格式书写实例,

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载