数据分析与决策技术丛书
R语言数据挖掘
Learning Data Mining with R
[哈萨克斯坦]贝特·麦克哈贝尔(Bater Makhabel) 著
李洪成 许金炜 段力辉 译
图书在版编目(CIP)数据
R语言数据挖掘 / (哈)贝特·麦克哈贝尔(Bater Makhabel)著;李洪成,许金炜,段力辉译. —北京:机械工业出版社,2016.9
(数据分析与决策技术丛书)
书名原文:Learning Data Mining with R
ISBN 978-7-111-54769-3
I. R… II. ①贝… ②李… ③许… ④段… III. ①程序语言-程序设计 ②数据采集 IV. ①TP312 ②TP274
中国版本图书馆CIP数据核字(2016)第212252号
本书版权登记号:图字:01-2015-2379
Bater Makhabel:Learning Data Mining with R(ISBN: 978-1-78398-210-3).
Copyright ? 2015 Packt Publishing. First published in the English language under the title “Learning Data Mining with R”.
All rights reserved.
Chinese simplified language edition published by China Machine Press.
Copyright ? 2016 by China Machine Press.
本书中文简体字版由Packt Publishing授权机械工业出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。
R语言数据挖掘
出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037)
责任编辑:盛思源 责任校对:殷 虹
印 刷: 版 次:2016年11月第1版第1次印刷
开 本:186mm×240mm 1/16 印 张:13.75
书 号:ISBN 978-7-111-54769-3 定 价:49.00元
凡购本书,如有缺页、倒页、脱页,由本社发行部调换
客服热线:(010)88379426 88361066 投稿热线:(010)88379604
购书热线:(010)68326294 88379649 68995259 读者信箱:hzit@hzbook.com
版权所有 ? 侵权必究
封底无防伪标均为盗版
本书法律顾问:北京大成律师事务所 韩光/邹晓东
The Translator’s Words?译 者 序
随着互联网中文档的快速积累,在网络中获取一些有用的信息变得愈发困难。本书收集了数据挖掘的一些最常用算法,首先对这些算法进行简单描述,然后给出了这些算法的常见应用背景,以方便数据挖掘用户学习和参考。对于关联规则、分类、聚类分析、异常值检测、数据流挖掘、时间序列、图形挖掘、网络分析、文本挖掘和网络分析等流行的数据挖掘算法,给出了较为详尽的介绍,并且给出了这些算法的伪代码和R语言实现。
本书提供了应用最流行的数据挖掘算法解决预测模型问题的可行策略,读者可以从中更好地理解主流的预测模型,也可以学习数据挖掘的实际经验。
本书第1章介绍数据挖掘、机器学习和数据预处理的基本概念;第2章介绍频繁模式挖掘、关联规则和相关性;第3章和第4章分别介绍分类和高级分类技术;第5章和第6章分别介绍聚类分析算法和高级聚类分析算法;第7章讨论异常值检测;第8章介绍流数据、时间序列数据及序列数据挖掘;第9章讨论图挖掘和网络分析;第10章介绍文本和网络数据挖掘。
读者可以从书中给出的伪代码出发,构建适合自己需要的算法;或者直接应用随书提供的R语言实现的算法。本书适合对数据挖掘感兴趣的各类人士,不管你是数据挖掘算法的研究人员,还是数据挖掘工程师,本书都可以提供相应的帮助。
本书的翻译得到了广西高校数据分析与计算重点实验室的资助。在本书的翻译过程中,得到了王春华编辑的大力支持和帮助。本书责任编辑盛思源老师具有丰富的经验,为本书的出版付出了大量的劳动,这里对她们的支持和帮助表示衷心的感谢。
由于时间和水平所限,难免会有不当之处,希望同行和读者多加指正。
译者
作者简介 About the Author
Bater Makhabel(LinkedIn: BATERMJ和GitHub: BATERMJ)为系统构架师,生活在中国北京、上海和乌鲁木齐等地。他于1995至2002年之间在清华大学学习,并获得计算机科学和技术的学士和博士学位。他在机器学习、数据挖掘、自然语言处理(NLP)、分布系统、嵌入系统、网络、移动平台、算法、应用数学和统计领域有丰富的经验。他服务过的客户包括CA Technologies、META4ALL和EDA(DFR的一家子公司)。同时,他也拥有在中国创办公司的经历。
Bater的生活开创性地在计算机科学和人文科学之间取得了平衡。在过去的12年中,他在应用多种先进计算机技术于文化创作方面获得了经验,其中一项是人机界面,通过哈萨克语与计算机系统进行交互。他一直和他工作领域中的其他作家有合作,但是本书是他的第一部正式作品。
About the Reviewers 审校者简介
Jason H.D. Cho在伊利诺伊大学香槟分校获得计算机硕士学位,现在在攻读博士。他对应用自然语言处理和大数据解决医学信息问题特别感兴趣。尤其是,他希望能在社交媒体上找到病人关心的健康需求。他曾带领一个学员小组在美国一项主要的保健竞赛(CIMIT)中跻身前10名。Jason也为自然语言处理和大数据研究领域的文章进行审稿。
Gururaghav Gopal现在在Paterson证券公司工作,其职位是量化分析员、开发人员、交易员和分析师。以前,他是一个和电商行业相关的数据科学咨询师。他曾经在印度韦洛尔的韦洛尔理工大学教授大学生和研究生模式识别课程。他曾经在一些研究机构做过研究助理,包括IFMR和NAL。
Gururaghav获得了电子工程的学士学位、计算机科学和工程的硕士学位,并在IFMR辅修金融工程和风险管理方面的课程。之后,他便在金融相关领域工作。他获得过多个奖项并以他的名字发表过多篇文章。他对编程、教学和咨询感兴趣。在闲暇时间,他会听
音乐。
Vibhav Kamath获得了位于孟买的印度理工学院工业工程和运筹学的硕士学位,并具有位于浦那的工学院的电子工程学士学位。大四期间,他对算法和数学模型产生了兴趣,从此便进入分析领域。Vibhav现在在班加罗尔的一家IT服务公司工作,其工作的一部分内容是应用R编程语言基于优化和线性回归技术来开发统计和数学模型。他曾经审阅过Packt出版社出版的两本R语言图书:R Graphs Cookbook, Second Edition和Social Media Mining with R,他曾经应用SAS、SQL和Excel/VBA做过数据可视化,为一家银行开发过仪表盘程序。
过去,Vibhav从事过离散时间仿真和语言处理(均基于MATLAB)等方面的学术工作。他涉猎过机器人领域,建立了一个浏览魔方的机器人Micromouse。除了分析和编程之外,Vibhav喜欢阅读小说类读物。空闲时,他打乒乓球、板球和网球,实在无聊时就玩田字格游戏(数独和数谜)。可以通过邮件vibhav.kamath@hotmail.com或者领英in.linkedin.com/in/vibhavkamath与他联系。
Hasan Kurban于2012年在布卢明顿的印度大学获得计算机硕士学位,现在在该校的信息与计算机学院攻读博士学位,专业为计算机科学同时辅修统计学。他的研究方向为数据挖掘、机器学习和统计学。
Preface 前 言
世界各地的统计学家和分析师正面临着处理许多复杂统计分析项目的迫切问题。由于人们对数据分析领域的兴趣日益增加,所以R语言提供了一个免费且开源的环境,非常适合学习和有效地利用现实世界中的预测建模方案。随着R语言社区的不断发展及其大量程序包的不断增加,它具备了解决众多实际问题的强大功能。
R编程语言诞生已经有数十年了,它已经变得非常知名,不但被社区的科学家而且被更广泛的开发者社区所熟知。它已经成长为一个强大的工具,可以帮助开发者在执行数据相关任务时生成有效且一致的源代码。由于R语言开发团队和独立贡献者已经创建了良好的文档,所以使用R语言编程并不困难。
进而,你可以使用来自R语言官方网站的程序包。如果你想不断提高自己的专业水平,那么你可能需要阅读在过去几年中已经出版的书籍。你应该始终铭记:创建高水平、安全且国际兼容的代码比初始创建的第一个应用程序更加复杂。
本书的目的是帮助你处理在复杂的统计项目中遇到的一系列可能比较困难的问题。本书的主题包括:学习在运行R语言程序时,如何使用R代码段处理数据,挖掘频繁模式、关联规则和相关规则。本书还为那些具有R语言基础的读者提供了成功创建和自定义最常用数据挖掘算法的技能和知识。这将有助于克服困难,并确保在运用R语言公开可用的丰富程序包开发数据挖掘算法时,R编程语言能够得到最有效的使用。
本书的每一章是独立存在的,因此你可以自由地跳转到任何一章,学习你觉得自己需要对某个特定的话题进行更加深入了解的章节。如果你觉得自己遗漏了一些重要的知识,你可以回顾前面的章节。本书的组织方式有助于逐步拓展你的知识框架。
你需要了解如何编写不同的预测模型、流数据和时间序列数据的代码,同时你还会接触到基于MapReduce算法(一种编程模型)的解决方案。学完本书,你将会为自己所具备的能力(知道哪种数据挖掘算法应用于哪种情况)而感到自信。
我喜欢使用R编程语言进行多用途数据挖掘任务的开发与研究,我非常高兴能与大家分享我的热情和专业知识,帮助大家更有效地使用R语言,更舒适地使用数据挖掘算法的发展成果与应用。
本书主要内容
第1章阐述数据挖掘的概要知识,数据挖掘与机器学习、统计学的关系,介绍数据挖掘基本术语,如数据定义和预处理等。
第2章包含使用R语言编程时,学习挖掘频繁模式、关联规则和相关规则所需的高级且有趣的算法。
第3章帮助你学习使用R语言编写经典分类算法,涵盖了应用于不同类型数据集的多种分类算法。
第4章讲述更多的分类算法,如贝叶斯信念网络、支持向量机(SVM)和k近邻算法。
第5章讲述如何使用流行与经典的算法进行聚类,如k均值、CLARA和谱算法。
第6章介绍与当前行业热点话题相关的高级聚类算法的实现,如EM、CLIQUE和DBSCAN等。
第7章介绍如何应用经典和流行算法来检测现实世界案例中的异常值。
第8章运用最流行、最经典以及一流的算法来讲解流数据、时间序列和序列数据挖掘这3个热点话题。
第9章介绍图挖掘和社交挖掘算法的概要及其他有趣的话题。
第10章介绍应用领域中最流行算法的有趣应用。
附录包含算法和数据结构的列表以便帮助你学习数据挖掘。
学习本书的准备知识
任何一台装有Windows、Linux或者Mac OS系统的个人计算机都可以运行本书给出的代码示例。本书所使用的软件都是开源的,可以从http://www.r-project.org/上免费获取。
读者对象
本书适合对R语言和统计学具有基本知识的数据科学家、定量分析师和软件工程师。本书假定读者只熟悉非常基本的R语言知识,如主要的数据类型、简单的函数和如何来回移动数据。不需要先前熟悉数据挖掘软件包。但是,你应该对数据挖掘的概念和过程有基本的认知。
即使你对于数据挖掘完全是一个新人,你也能够同时掌握基本和高级的数据挖掘算法的实现。你将学习如何从各种数据挖掘算法中选择合适的算法,将这些算法应用于现实世界可用的大多数数据集中的某些特定数据集中。
约定
本书中,你将发现多种文字印刷格式,它们用于对不同类型的信息进行区分。下面是关于这些格式的一些例子以及它们的含义。
文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter ID如下所示:“我们可以通过使用include指令来包含其他的上下文。”
新的术语和重要词用粗体标示。例如,在屏幕上、菜单中或者对话框中看到的词将这样出现在文本中:“单击Next按钮进入下一个界面。”
警告或者重要的说明将会出现在这样的图标后面。
提示或技巧将会出现在这样的图标后面。
读者反馈
读者的反馈始终是受欢迎的。让我们知道你如何看待本书——你喜欢哪些内容或者你可能不喜欢哪些内容。读者的反馈对于我们制定使读者真正获得最大效用的主题是十分重要的。
可以通过发送电子邮件至邮箱feedback@packtpub.com,并在电子邮件的主题中提及书名来给我们提供意见。
如果你对于某个主题有专长,或者你有兴趣编写一本书或协助完成一本书,可以到网站www.packtpub.com/authors看一看我们的撰稿指南。
客户支持
既然你现在自豪地拥有了一本Packt书,那么我们可以做很多事来帮助你充分利用你购买的书籍。
下载示例代码
你可以从你在http://www.packtpub.com网站的账户上下载所有你已经购买的Packt书的示例代码。如果你在其他地方购买本书,你可以访问http://www.packtpub.com/support网站并注册,我们将通过电子邮件直接给你发送文件。你也可以在网站https://github.com/batermj/learning-data-mining-with-r找到本书的代码文件。
勘误表
虽然我们已经尽力确保书中内容的准确性,但错误难免会发生。如果你在我们的某一本书中发现错误(可能是文本或者代码中的错误)并向我们报告错误,我们将不胜感激。由此,你可以使其他读者免于困惑并帮助我们改进该书的后续版本。如果你发现任何错误,请通过访问http://www.packtpub.com/submit-errata网站,选择相应图书,单击errata submission form(勘误提交表单)的链接,并输入错误的详细信息以便报告给我们。一旦你的错误得到验证,你的提交将被接受并上传到我们的网站,或者添加到现有的勘误表中,列于该标题下的勘误表部分。任何现有的勘误表均可从http://www.packtpub.com/support网站上选择你所需要的标题进行查看。
盗版行为
因特网上版权材料的盗版行为是所有媒介一直存在的问题。在Packt,我们非常重视对版权和许可证的保护。如果你在网络上遇到任何形式非法复制我们著作的行为,请立刻向我们提供位置地址或者网站名称以便我们能够寻找补救方法。
我们的联系方式是copyright@packtpub.com,请一并附上关于涉嫌盗版材料的链接。
我们非常感谢你对我们的作者以及我们为你带来有价值内容的能力的保护。
问题
如果你对本书有任何方面的问题,可以联系我们(questions@packtpub.com),我们将竭尽所能帮助你解决。
Acknowledgements?致 谢
感谢我的妻子Zurypa Dawletkan和儿子Bakhtiyar。他们支持我利用多个周末和夜晚使得本书得以出版。
我也要感谢Luke Presland,给予我机会来撰写这本书。十分感谢Rebecca Pedley和Govindan K,你们对本书的贡献是巨大的。感谢Jalasha D’costa和其他技术编辑及团队为该书出版付出的努力,使得本书看起来还不错。同时,感谢组稿编辑和技术审校者。
我也要谢谢我的兄弟Bolat Makhabel博士(LinkedIn: BOLATMJ),他给我提供了本书英文版封面的照片,他具有医学背景。照片中的植物名为Echinops(植物学的拉丁名字),哈萨克语称为Lahsa,在中国称为蓝刺头。这种植物用于传统的哈萨克医药,也是我兄弟研究的一部分。
尽管我的专业知识来源于不断的实践,但它也来源于我的母校(清华大学)和戴梅萼教授、赵雁南教授、王家钦教授、Ju Yuma教授以及其他众多老师为我打下的坚实基础。他们的精神鼓励我在计算机科学和技术领域继续努力。我要感谢我的岳父母Dawletkan Kobegen和Burux Takay,感谢他们照顾我的儿子。
最后,我要对我的姐姐Aynur Makhabel和姐夫Akimjan Xaymardan表达我最大的敬意。
目 录 Contents
译者序
作者简介
审校者简介
前言
致谢
第1章 预备知识 1
1.1 大数据 2
1.2 数据源 3
1.3 数据挖掘 4
1.3.1 特征提取 4
1.3.2 总结 4
1.3.3 数据挖掘过程 5
1.4 社交网络挖掘 7
1.5 文本挖掘 9
1.5.1 信息检索和文本挖掘 10
1.5.2 文本挖掘预测 10
1.6 网络数据挖掘 10
1.7 为什么选择R 12
1.8 统计学 12
1.8.1 统计学与数据挖掘 13
1.8.2 统计学与机器学习 13
1.8.3 统计学与R语言 13
1.8.4 数据挖掘中统计学的局限性 13
1.9 机器学习 13
1.9.1 机器学习方法 14
1.9.2 机器学习架构 14
1.10 数据属性与描述 15
1.10.1 数值属性 16
1.10.2 分类属性 16
1.10.3 数据描述 16
1.10.4 数据测量 17
1.11 数据清洗 18
1.11.1 缺失值 18
1.11.2 垃圾数据、噪声数据或异常值 19
1.12 数据集成 19
1.13 数据降维 20
1.13.1 特征值和特征向量 20
1.13.2 主成分分析 20
1.13.3 奇异值分解 20
1.13.4 CUR分解 21
1.14 数据变换与离散化 21
1.14.1 数据变换 21
1.14.2 标准化数据的变换方法 22
1.14.3 数据离散化 22
1.15 结果可视化 23
1.16 练习 24
1.17 总结 24
第2章 频繁模式、关联规则和相关规则挖掘 25
2.1 关联规则和关联模式概述 26
2.1.1 模式和模式发现 26
2.1.2 关系或规则发现 29
2.2 购物篮分析 30
2.2.1 购物篮模型 31
2.2.2 Apriori算法 31
2.2.3 Eclat算法 35
2.2.4 FP-growth算法 37
2.2.5 基于最大频繁项集的GenMax算法 41
2.2.6 基于频繁闭项集的Charm算法 43
2.2.7 关联规则生成算法 44
2.3 混合关联规则挖掘 46
2.3.1 多层次和多维度关联规则挖掘 46
2.3.2 基于约束的频繁模式挖掘 47
2.4 序列数据集挖掘 48
2.4.1 序列数据集 48
2.4.2 GSP算法 48
2.5 R语言实现 50
2.5.1 SPADE算法 51
2.5.2 从序列模式中生成规则 52
2.6 高性能算法 52
2.7 练习 53
2.8 总结 53
第3章 分类 54
3.1 分类 55
3.2 通用决策树归纳法 56
3.2.1 属性选择度量 58
3.2.2 决策树剪枝 59
3.2.3 决策树生成的一般算法 59
3.2.4 R语言实现 61
3.3 使用ID3算法对高额度信用卡用户分类 61
3.3.1 ID3算法 62
3.3.2 R语言实现 64
3.3.3 网络攻击检测 64
3.3.4 高额度信用卡用户分类 66
3.4 使用C4.5算法进行网络垃圾页面检测 66
3.4.1 C4.5算法 67
3.4.2 R语言实现 68
3.4.3 基于MapReduce的并行版本 69
3.4.4 网络垃圾页面检测 70
3.5 使用CART算法判断网络关键资源页面 72
3.5.1 CART算法 73
3.5.2 R语言实现 74
3.5.3 网络关键资源页面判断 74
3.6 木马程序流量识别方法和贝叶斯分类 75
3.6.1 估计 75
3.6.2 贝叶斯分类 76
3.6.3 R语言实现 77
3.6.4 木马流量识别方法 77
3.7 垃圾邮件识别和朴素贝叶斯分类 79
3.7.1 朴素贝叶斯分类 79
3.7.2 R语言实现 80
3.7.3 垃圾邮件识别 80
3.8 基于规则的计算机游戏玩家类型分类和基于规则的分类 81
3.8.1 从决策树变换为决策规则 82
3.8.2 基于规则的分类 82
3.8.3 序列覆盖算法 83
3.8.4 RIPPER算法 83
3.8.5 计算机游戏玩家类型的基于规则的分类 85
3.9 练习 86
3.10 总结 86
第4章 高级分类算法 87
4.1 集成方法 87
4.1.1 Bagging算法 88
4.1.2 Boosting和AdaBoost算法 89
4.1.3 随机森林算法 91
4.1.4 R语言实现 91
4.1.5 基于MapReduce的并行版本 92
4.2 生物学特征和贝叶斯信念网络 92
4.2.1 贝叶斯信念网络算法 93
4.2.2 R语言实现 94
4.2.3 生物学特征 94
4.3 蛋白质分类和k近邻算法 94
4.3.1 kNN算法 95
4.3.2 R语言实现 95
4.4 文档检索和支持向量机 95
4.4.1 支持向量机算法 97
4.4.2 R语言实现 99
4.4.3 基于MapReduce的并行版本 99
4.4.4 文档检索 100
4.5 基于频繁模式的分类 100
4.5.1 关联分类 100
4.5.2 基于判别频繁模式的分类 101
4.5.3 R语言实现 101
4.5.4 基于序列频繁项集的文本分类 102
4.6 基于反向传播算法的分类 102
4.6.1 BP算法 104
4.6.2 R语言实现 105
4.6.3 基于MapReduce的并行版本 105
4.7 练习 106
4.8 总结 107
第5章 聚类分析 108
5.1 搜索引擎和k均值算法 110
5.1.1 k均值聚类算法 111
5.1.2 核k均值聚类算法 112
5.1.3 k模式聚类算法 112
5.1.4 R语言实现 113
5.1.5 基于MapReduce的并行版本 113
5.1.6 搜索引擎和网页聚类 114
5.2 自动提取文档文本和k中心点算法 116
5.2.1 PAM算法 117
5.2.2 R语言实现 117
5.2.3 自动提取和总结文档文本 117
5.3 CLARA算法及实现 118
5.3.1 CLARA算法 119
5.3.2 R语言实现 119
5.4 CLARANS算法及实现 119
5.4.1 CLARANS算法 120
5.4.2 R语言实现 120
5.5 无监督的图像分类和仿射传播聚类 120
5.5.1 仿射传播聚类 121
5.5.2 R语言实现 122
5.5.3 无监督图像分类 122
5.5.4 谱聚类算法 123
5.5.5 R语言实现 123
5.6 新闻分类和层次聚类 123
5.6.1 凝聚层次聚类 123
5.6.2 BIRCH算法 124
5.6.3 变色龙算法 125
5.6.4 贝叶斯层次聚类算法 126
5.6.5 概率层次聚类算法 126
5.6.6 R语言实现 127
5.6.7 新闻分类 127
5.7 练习 127
5.8 总结 128
第6章 高级聚类分析 129
6.1 电子商务客户分类分析和DBSCAN算法 129
6.1.1 DBSCAN算法 130
6.1.2 电子商务客户分类分析 131
6.2 网页聚类和OPTICS算法 132
6.2.1 OPTICS算法 132
6.2.2 R语言实现 134
6.2.3 网页聚类 134
6.3 浏览器缓存中的访客分析和DENCLUE算法 134
6.3.1 DENCLUE算法 135
6.3.2 R语言实现 135
6.3.3 浏览器缓存中的访客分析 136
6.4 推荐系统和STING算法 137
6.4.1 STING算法 137
6.4.2 R语言实现 138
6.4.3 推荐系统 138
6.5 网络情感分析和CLIQUE算法 139
6.5.1 CLIQUE算法 139
6.5.2 R语言实现 140
6.5.3 网络情感分析 140
6.6 观点挖掘和WAVE聚类算法 140
6.6.1 WAVE聚类算法 141
6.6.2 R语言实现 141
6.6.3 观点挖掘 141
6.7 用户搜索意图和EM算法 142
6.7.1 EM算法 143
6.7.2 R语言实现 143
6.7.3 用户搜索意图 143
6.8 客户购买数据分析和高维数据聚类 144
6.8.1 MAFIA算法 144
6.8.2 SURFING算法 145
6.8.3 R语言实现 146
6.8.4 客户购买数据分析 146
6.9 SNS和图与网络数据聚类 146
6.9.1 SCAN算法 146
6.9.2 R语言实现 147
6.9.3 社交网络服务 147
6.10 练习 148
6.11 总结 148
第7章 异常值检测 150
7.1 信用卡欺诈检测和统计方法 151
7.1.1 基于似然的异常值检测算法 152
7.1.2 R语言实现 152
7.1.3 信用卡欺诈检测 153
7.2 活动监控——涉及手机的欺诈检测和基于邻近度的方法 153
7.2.1 NL算法 153
7.2.2 FindAllOutsM算法 153
7.2.3 FindAllOutsD算法 154
7.2.4 基于距离的算法 155
7.2.5 Dolphin算法 156
7.2.6 R语言实现 157
7.2.7 活动监控与手机欺诈检测 157
7.3 入侵检测和基于密度的方法 157
7.3.1 OPTICS-OF算法 159
7.3.2 高对比度子空间算法 159
7.3.3 R语言实现 160
7.3.4 入侵检测 160
7.4 入侵检测和基于聚类的方法 161
7.4.1 层次聚类检测异常值 161
7.4.2 基于k均值的算法 161
7.4.3 ODIN算法 162
7.4.4 R语言实现 162
7.5 监控网络服务器的性能和基于分类的方法 163
7.5.1 OCSVM算法 163
7.5.2 一类最近邻算法 164
7.5.3 R语言实现 164
7.5.4 监控网络服务器的性能 164
7.6 文本的新奇性检测、话题检测与上下文异常值挖掘 164
7.6.1 条件异常值检测算法 165
7.6.2 R语言实现 166
7.6.3 文本的新奇性检测与话题检测 166
7.7 空间数据中的集体异常值 167
7.7.1 路径异常值检测算法 167
7.7.2 R语言实现 167
7.7.3 集体异常值的特征 168
7.8 高维数据中的异常值检测 168
7.8.1 Brute-Force算法 168
7.8.2 HilOut算法 168
7.8.3 R语言实现 169
7.9 练习 169
7.10 总结 169
第8章 流数据、时间序列数据和序列数据挖掘 171
8.1 信用卡交易数据流和STREAM算法 171
8.1.1 STREAM算法 172
8.1.2 单通道法聚类算法 173
8.1.3 R语言实现 174
8.1.4 信用卡交易数据流 174
8.2 预测未来价格和时间序列分析 175
8.2.1 ARIMA算法 176
8.2.2 预测未来价格 176
8.3 股票市场数据和时间序列聚类与分类 176
8.3.1 hError算法 177
8.3.2 基于1NN分类器的时间序列分类 178
8.3.3 R语言实现 178
8.3.4 股票市场数据 178
8.4 网络点击流和挖掘符号序列 179
8.4.1 TECNO-STREAMS算法 179
8.4.2 R语言实现 181
8.4.3 网络点击流 181
8.5 挖掘事务数据库中的序列模式 181
8.5.1 PrefixSpan算法 182
8.5.2 R语言实现 182
8.6 练习 182
8.7 总结 182
第9章 图挖掘与网络分析 183
9.1 图挖掘 183
9.1.1 图 183
9.1.2 图挖掘算法 184
9.2 频繁子图模式挖掘 184
9.2.1 gPLS算法 184
9.2.2 GraphSig算法 184
9.2.3 gSpan算法 185
9.2.4 最右路径扩展和它们的支持 185
9.2.5 子图同构枚举算法 186
9.2.6 典型的检测算法 186
9.2.7 R语言实现 186
9.3 社交网络挖掘 186
9.3.1 社区检测和Shingling算法 187
9.3.2 节点分类和迭代分类算法 188
9.3.3 R语言实现 188
9.4 练习 188
9.5 总结 188
第10章 文本与网络数据挖掘 189
10.1 文本挖掘与TM包 190
10.2 文本总结 190
10.2.1 主题表示 191
10.2.2 多文档总结算法 192
10.2.3 最大边缘相关算法 193
10.2.4 R语言实现 193
10.3 问答系统 194
10.4 网页分类 194
10.5 对报刊文章和新闻主题分类 195
10.5.1 基于N-gram的文本分类算法 195
10.5.2 R语言实现 197
10.6 使用网络日志的网络使用挖掘 197
10.6.1 基于形式概念分析的关联规则挖掘算法 198
10.6.2 R语言实现 198
10.7 练习 198
10.8 总结 199
附录 算法和数据结构 200
第1章
预?备?知?识
本章中,你将学习基本的数据挖掘术语,比如数据定义、预处理等。
最重要的数据挖掘算法将通过R语言进行说明,以便帮助你快速掌握原理,包括但不局限于分类、聚类和异常值检测。在深入研究数据挖掘之前,我们来看一看将要介绍的主题:
数据挖掘
社交网络挖掘
文本挖掘
网络数据挖掘
为什么选择R
统计学
机器学习
数据属性与描述
数据测量
数据清洗
数据集成
数据降维
数据变换与离散化
结果可视化
在人类历史上,来自每个方面的数据结果都是广泛的,例如网站、由用户的电子邮件或姓名或账户构成的社交网络、搜索词、地图上的位置、公司、IP地址、书籍、电影、音乐和产品。
数据挖掘技术可应用于任何类型的旧数据或者新数据,每种数据类型都可以运用特定的技术(并不需要全部技术)得到最好的处理。也就是说,数据挖掘技术受到数据类型、数据集大小以及任务应用环境等条件的限制。每一种数据集都有自己适合的数据挖掘解决方案。
一旦旧的数据挖掘技术不能应用于新的数据类型或者如果新的数据类型不能转换成传统的数据类型,那么总是需要研究新的数据挖掘技术。应用于Twitter庞大资源集的流数据挖掘算法的演变是一个典型的例子,针对社交网络开发的图挖掘算法是另一个例子。
最流行且最基本的数据形式来自数据库、数据仓库、有序数据或者序列数据、图形数据以及文本数据等。换句话说,它们是联合数据、高维数据、纵向数据、流数据、网络数据、数值数据、分类数据或者文本数据。
1.1 大数据
大数据是数据量很大的数据,它不适合存储在单台机器中。也就是说,在研究大数据时,数据本身的大小成为了问题的一部分。除了容量(Volume),大数据的其他两个主要特征就是多样性(Variety)和速度(Velocity),这就是大数据著名的三个特征。速度指的是数据处理的速率或者数据处理有多快;多样性指的是各种数据源类型。大数据源集合产生的噪声更频繁并且影响挖掘的结果,这就需要高效的数据预处理算法。
因此,分布式文件系统用来作为对大量数据成功执行并行算法的工具,可以肯定的是,每过1秒,我们将得到更多的数据。数据分析和可视化技术是与海量数据相关的数据挖掘任务的主要部分。海量数据的特性吸引了许多与平台相关的新的数据挖掘技术,其中一个就是RHadoop。我们将在后面的内容中对它进行描述。
大数据中的一些重要数据类型如下所述:
第一种数据类型来自摄像机视频,它包含了用于加快犯罪调查分析、增强零售分析以及军事情报分析等更多的元数据。
第二种数据类型来自嵌入式的传感器,如医用传感器,用来监测病毒的任何潜在爆发。
第三种数据类型来自娱乐,由任何人通过社交媒体自由发布的信息。
第四种数据类型来自消费者图像,它们源自社交媒体,像这种图像的标注是很重要的。
下面的表说明了数据大小增长的历史。该表显示信息每两年翻一番多,改变着研究人员或者公司的管理方式,通过数据挖掘技术从数据中获取价值,揭示着新的数据挖掘研究。
年份 数据大小 说 明
N/A 1MB(Megabyte:兆字节)=220
人的大脑大约存储200MB的信息
N/A 1PB(Petabyte:拍字节)=250
这类似于由NASA对地球3年的观察数据的大小或者相当于美国国会图书馆书籍的70.8倍
1999 1EB 1EB(Exabyte:艾字节)=260
世界产生了1.5EB独特的信息
2007 281EB 世界产生了大约281EB独特的信息
2011 1.8ZB 1ZB(Zetabyte:泽字节)=270
这是人类在2011年收集的所有数据
近期 1YB(Yottabytes:尧字节)=280
可扩展性和效率
效率、可扩展性、性能、优化以及实时执行的能力对于几乎所有的算法都是很重要的问题,它对数据挖掘也是如此。数据挖掘算法始终有一些必要的衡量指标或者基准因素。
随着数据量的持续增长,保持数据挖掘算法的效率和可扩展性对于有效地从众多数据存储库或数据流中的海量数据集里提取信息是很有必要的。
从单台机器到广泛分布的数据存储、众多数据集的庞大规模以及数据挖掘方法计算的复杂性,这些都是驱动并行和分布式数据密集型挖掘算法发展的因素。
1.2 数据源
数据充当数据挖掘系统的输入,因此数据存储库是非常重要的。在企业环境中,数据库和日志文件是常见来源;在网络数据挖掘中,网页是数据的来源;连续地从各种传感器中提取数据也是典型的数据源。
这里有一些免费的在线数据源十分有助于学习数据挖掘:
频繁项集挖掘数据存储库(Frequent Itemset Mining Dataset Repository):一个带有数据集的存储库,用于找到频繁项集的方法(http://fimi.ua.ac.be/data/)。
UCI机器学习存储库(UCI Machine Learning Repository):一个数据集的集合,适用于分类任务(http://archive.ics.uci.edu/ml/)。
statlib的数据及其描述库(The Data and Story Library at statlib):DASL是一个在线库,它拥有说明基本统计方法用途的数据文件和故事。我们希望提供来自多主题的数据,这样统计学教师可以找到学生感兴趣的真实世界的例子。使用DASL强大的搜索引擎来查找感兴趣的故事和数据文件(http://lib.stat.cmu.edu/DASL/)。
词汇网(WordNet):一个英语词汇数据库(http://wordnet.princeton.edu)。
1.3 数据挖掘
数据挖掘就是在数据中发现一个模型,它也称为探索性数据分析,即从数据中发现有用的、有效的、意想不到的且可以理解的知识。有些目标与其他科学,如统计学、人工智能、机器学习和模式识别是相同的。在大多数情况下,数据挖掘通常被视为一个算法问题。聚类、分类、关联规则学习、异常检测、回归和总结都属于数据挖掘任务的一部分。
数据挖掘方法可以总结为两大类数据挖掘问题:特征提取和总结。
1.3.1 特征提取
这是为了提取数据最突出的特征并忽略其他的特征。下面是一些例子:
频繁项集(Frequent itemset):该模型对构成小项集篮子的数据有意义。(找出一堆项目中出现最为频繁、关系最为密切的一个子集。——译者注)
相似项(Similar item):有时你的数据看起来像数据集的集合,而目标是找到一对数据集,它们拥有较大比例的共同元素。这是数据挖掘的一个基本问题。
1.3.2 总结
目标是简明且近似地对数据集进行总结(或者说摘要),比如聚类,它是这样一个过程:检查数据的集合并根据某些度量将数据点分类到相应的类中。目标就是使相同类中的点彼此之间的距离较小,而不同类中的点彼此之间的距离较大。
1.3.3 数据挖掘过程
从不同的角度定义数据挖掘过程有两种比较流行的过程,其中更广泛采用的一种是CRISP-DM:
跨行业数据挖掘标准过程(Cross-Industry Standard Process for Data Mining,CRISP-DM)。
采样、探索、修正、建模、评估(Sample, Explore, Modify, Model, Assess,缩写为SEMMA),这是由美国SAS研究所制定的。
1.3.3.1 CRISP-DM
这个过程共分6个阶段,如下图所示。它不是一成不变的,但通常会有大量的回溯。
让我们详细地看一看每个阶段:
业务理解(business understanding):这项任务包括确定业务目标、评估当前形势、建立数据挖掘目标并制订计划。
数据理解(data understanding):这项任务评估数据需求,包括原始数据收集、数据描述、数据探索和数据质量的验证。
数据准备(data preparation):一旦获得数据,在上一步中确定数据源。然后需要对数据进行选择、清洗,并形成期望的形式和格式。
建模(modeling):可视化和聚类分析对于初步分析是有用的。可以应用像广义规则归纳(generalized rule induction)这样的工具开发初始关联规则。这是一个发现规则的数据挖掘技术,从条件因素与给定的决策或者结果之间的因果关系来对数据进行说明。也可以应用其他适用于数据的模型。
评估(evaluation):结果应该在第一阶段中的业务目标指定的环境下对模型结果进行评估。在大多数情况下,这会导致新需求的确定,转而返回到前一个阶段。
部署(deployment):可以使用数据挖掘来验证之前的假设或者知识。
1.3.3.2 SEMMA
下图是SEMMA过程的概览。
让我们详细地看一看这些过程:
采样(sample):在该步中,提取一个大数据集的一部分。
探索(explore):为了更好地理解数据集,在此步中搜索未预料的趋势和异常。
修正(modify):创建、选择和转换变量,以便专注于模型构建过程。
建模(model):搜索多种模型的组合,以便预测一个满意的结果。
评估(assess):根据实用性和可靠性对数据挖掘过程的结果进行评估。
1.4 社交网络挖掘
正如我们前面提到的,数据挖掘是从数据中发现一个模型,社交网络挖掘就是从表示社交网络的图形数据中发现模型。
社交网络挖掘是网络数据挖掘的一个应用,比较流行的应用有社会科学和文献计量学、PageRank和HITS算法、粗粒度图模型的不足、增强模型和技术、主题提取的评估以及网络的评估与建模。
社交网络
当涉及社交网络的讨论时,你会想到Facebook、Google+和LinkedIn等。社交网络的基本特征如下:
存在一个参与网络的实体集合。通常情况下,这些实体是人,但它们也完全可能是其他实体。
网络的实体之间至少存在一种关系。在Facebook上,这种关系被称为朋友,有时,这种关系要么存在要么不存在,两个人要么是朋友要么不是朋友。然而,在社交网络的其他例子中,关系有一个度。这个度可以是离散的,比如在Google+上,朋友、家人、相识或者不相识;这个度也可能是一个实际的数字,比如平均一天内两个人相互交谈所花费的时间。
社交网络有一个非随机性或者忠诚性的假设。这个条件最难形式化,但直观解释是关系趋于集中;也就是说,如果实体A与B和C都相关,那么B与C相关的概率就高于平均水平。
下面是社交网络的一些种类:
电话网络(telephone network):该网络的节点是电话号码,代表个体。
电子邮件网络(E-mail network):该网络的节点是电子邮件地址,也代表个体。
合作网络(collaboration network):该网络的节点代表发表了研究论文的个体,连接两个节点的边表示联合发表一篇或者多篇论文的两个个体。
社交网络以无向图建模。实体是节点,如果两个节点根据刻画网络的关系相互关联,那么就有一条边连接两个节点。如果相关联的关系有一个度,那么这个度就通过标记边来表示。
下载代码示例
你可以从http://www.packtpub.com的账户中下载所有你购买的Packt出版社出版的书籍的示例代码文件。如果你在其他地方购买了这本书,你可以访问http://www.packtpub.com/support网站并注册,我们将通过电子邮件直接给你发送文件。
这里有一个例子,它是用R语言的sna程序包中的科尔曼高中朋友数据(Coleman’s High School Friendship Data)进行分析。数据来源于对某个学年同一高中的73个男孩之间的友好关系的研究,所有被调查对象提供了两个时间点(春季和秋季)来报告其关系。数据集的名称是coleman,它是R语言中的数组类型。节点代表一个具体的学生,线代表两个学生之间的关系。
1.5 文本挖掘
文本挖掘基于文本数据,关注从大型自然语言文本中提取相关信息,并搜寻有意义的关系、语法关系以及提取实体或各项之间的语义关联。它也被定义为自动或半自动的文本处理。相关的算法包括文本聚类、文本分类、自然语言处理和网络挖掘。
文本挖掘的特征之一是数字与文本混合,或者用其他的观点来说,就是源数据集中包含了混合数据类型。文本通常是非结构化文件的集合,这将被预处理并变换成数值或者结构化的表示。在变换之后,大部分的数据挖掘算法都可以应用,并具有不错的效果。
文本挖掘的过程描述如下:
第一步准备文本语料库,包括报告、信函等。
第二步基于文本语料库建立一个半结构化的文本数据库。
第三步建立一个词语文档矩阵,包含词语的频率。
第四步进行进一步的分析,比如文本分析、语义分析、信息检索和信息总结。
1.5.1 信息检索和文本挖掘
信息检索帮助用户查找信息,经常与在线文档相关联,它着重于信息的获取、组织、存储、检索和分布。信息检索(Information Retrieval,IR)的任务是根据查询检索有关的文档。信息检索的基本技术是测量相似性。其基本步骤如下所述:
指定一个查询。下面是一些查询类型:
关键词查询(keyword query):由一个关键词列表表示,用来查找包含至少一个关键词的文档。
布尔查询(boolean query):由布尔运算符和关键词构建的查询。
短语查询(phrase query):由组成短语的一系列词语所构成的查询。
近邻查询(proximity query):短语查询的降级版本,它可以是关键词和短语的组合。
全文档查询(full document query):一个完整文档的查询,用于寻找类似于查询文档的其他文档。
自然语言问题(natural language questions):该查询有助于将用户的需求表示成一个自然语言问题。
搜索文档集。
返回相关文档的子集。
1.5.2 文本挖掘预测
预测文本的结果与预测数值数据挖掘一样耗力,并且有与数值分类相关联的相似问题。文本挖掘预测通常是一个分类问题。
文本预测需要先验知识,通过样本了解如何对新文档做出预测。一旦文本变换成数值数据,就可以应用预测方法。
1.6 网络数据挖掘
网络挖掘的目的是从网络超链接结构、网页和使用数据来发现有用的信息或知识。网络是作为数据挖掘应用输入的最大数据源之一。
网络数据挖掘基于信息检索、机器学习(Machine Learning,ML)、统计学、模式识别和数据挖掘。尽管很多数据挖掘方法可以应用于网络挖掘,但是由于异构的、半结构化的和非结构化的网络数据,所以网络挖掘不单纯是一个数据挖掘问题。
网络挖掘任务至少可以定义为3种类型:
网络结构挖掘(web structure mining):这有助于从超链接中寻找有关网址和页面的有用信息或者有价值的结构总结。
网络内容挖掘(web content mining):这有助于从网页内容中挖掘有用的信息。
网络用法挖掘(web usage mining):这有助于从网络日志中发现用户访问模式,以便检测入侵、欺诈和试图闯入的情况。
应用于网络数据挖掘的算法源自经典的数据挖掘算法。它们有很多相似之处,比如挖掘过程,但也存在差异。网络数据挖掘的特征使其不同于数据挖掘的原因如下:
数据是非结构化的。
网络信息不断变化和数据量不断增长。
任何数据类型都可以在网络上得到,如结构化和非结构化数据。
网络上存在异构信息,冗余页面也存在。
网络上链接着海量信息。
数据是噪声数据。
网络数据挖掘不同于一般数据挖掘是由于源数据集的巨大动态容量、极其多样化的数据格式等。与网络相关的最流行的数据挖掘任务如下:
信息提取(Information Extraction,IE):信息提取的任务包含以下步骤:词汇标记、句子分割、词性分配、命名实体识别、短语解析、句子解析、语义解释、话语解释、模板填充以及合并。
自然语言处理(Natural Language Processing,NLP):它研究人与人和人与机器互动的语言特征、语言能力和行为模型、用这样的模型实现过程的框架、过程/模型的迭代优化以及对结果系统的评估技术。与网络数据挖掘相关的经典自然语言处理任务包括标注、知识表示、本体论模型等。
问题回答(question answering):目标就是以自然语言形式从文本集中寻找问题的答案。它可以归类为槽填充、有限域以及具有更高难度的开放域。一个简单的例子就是基于预先定义的常见问题解答(FAQ)来回答客户的询问。
资源发现(resource discovery):比较流行的应用是优先收集重要的页面;使用链路拓扑结构、主题局部性和主题爬行进行相似性搜索;社区发现。
1.7 为什么选择R
R是一种高质量、跨平台、灵活且广泛使用的开源免费语言,可用于统计学、图形学、数学和数据科学。它由统计学家创建,并为统计学家服务。
R语言包含了5?000多种算法以及全球范围内具备专业知识的数百万用户,并得到了充满活力且富有才华的社区贡献者的支持。它不仅可以使用完善的统计技术,也允许使用试验性的统计技术。
R是一个用于统计计算与图形学的免费开源软件,其环境由R-projects维护,根据自由软件基金会(Free Software Foundation)的GNU通用公共授权(General Public License)的条款,R语言的源代码是可以获得的。由于存在各种平台,如Unix、Linux、Windows以及Mac OS,所以R语言也编译和开发了用于不同平台的版本。
R的缺点有哪些
R存在以下3个缺点:
一个缺点就是内存约束,因此它需要将整个数据集存储在内存(RAM)中以便实现高性能,这也称为内存分析。
类似于其他开源系统,任何人都可以创建和贡献经过严格测试或者未经过严格测试的程序包。换言之,贡献给R社区的程序包是容易出错的,需要更多的测试以确保代码的质量。
R语言似乎比某些其他商业语言慢。
幸运的是,存在可用于解决这些问题的程序包。有些方法可以归为并行解决方案,本质就是将程序的运行分散到多个CPU上,从而克服上面所列R语言的缺陷。有不少好的例子,比如RHadoop,但并不局限于RHadoop。你很快就会在下面的章节中看到更多关于这个话题的内容。你可以从综合R典藏网(Comprehensive R Archive Network,CRAN)下载SNOW添加包和Parallel添加包。
1.8 统计学
统计学研究数据收集、数据分析、数据解释或说明,以及数据表示。作为数据挖掘的基础,它们的关系将在下面章节中说明。
1.8.1 统计学与数据挖掘
第一次使用数据挖掘这个术语的人是统计学家。最初,数据挖掘是一个贬义词,指的是企图提取得不到数据支持的信息。在一定程度上,数据挖掘构建统计模型,这是一个基础分布,用于可视化数据。
数据挖掘与统计学有着内在的联系,数据挖掘的数学基础之一就是统计学,而且很多统计模型都应用于数据挖掘中。
统计模型可以用来总结数据集合,也可以用于验证数据挖掘结果。
1.8.2 统计学与机器学习
随着统计学和机器学习的发展,这两个学科成为一个统一体。统计检验被用来验证机器学习模型和评估机器学习算法,机器学习技术与标准统计技术可以有机结合。
1.8.3 统计学与R语言
R是一种统计编程语言,它提供大量基于统计知识的统计函数。许多R语言添加包的贡献者来自统计学领域,并在他们的研究中使用R语言。
1.8.4 数据挖掘中统计学的局限性
在数据挖掘技术的演变过程中,由于数据挖掘中统计的局限性,人们在试图提取并不真正存在于数据中的信息时可能会犯错误。
Bonferroni原则(Bonferroni’s Principle)是一个统计定理,也被称为Bonferroni校正(Bonferroni correction)。你可以假设你找到的大部分结果都是事实上不存在的,即算法返回的结果大大超过了所假设的范围。
1.9 机器学习
应用于机器学习算法的数据集称为训练集,它由一组成对的数据(x, y)构成,称为训练样本。成对的数据解释如下:
x:这是一个值向量,通常称为特征向量。每个值或者特征,要么是分类变量(这些值来自一组离散值,比如{S, M, L}),要么是数值型。
y:这是一个标签,表示x的分类或者回归值。
机器学习过程的目的就是发现一个函数y=f(x),它能最好地预测与每一个x值相关联的y值。原则上y的类型是任意的,但有一些常见的和重要的类型:
y:这是一个实数,机器学习问题称为回归。
y:这是一个布尔值,真或者假,通常分别写为+1和-1。在这种情况下,机器学习问题称为二元分类。
y:这是某些有限集合的成员。这个集合的成员可以认为是类,并且每个成员代表一类。此机器学习问题称为多级分类。
y:这是某些潜在无限集合的成员,例如,x的一个解析树,它被解析为一个句子。
到现在为止,在我们可以更直接地描述挖掘目标的情况下,还没有证明机器学习是成功的。机器学习和数据挖掘是两个不同的主题,尽管它们共享一些算法——特别是目标为提取信息时。在某些情况下,机器学习是有意义的,一个典型的情形就是当我们试图从数据集中寻找某些信息。
1.9.1 机器学习方法
算法的主要类型均列于下方,每个算法由函数f区分。
决策树(decision tree):这种形式的f呈树形,树的每个节点都有一个关于x的函数,用来确定必须搜索哪个子节点或者哪些子节点。
感知器(perceptron):这些是应用于向量x={x1, x2, …, xn}的分量的阈值函数。对每个i=1, 2, …, n,权重wi与第i个分量相关联,且有一个阈值wixi≥θ。如果阈值满足条件,输出为+1,否则为-1。
神经网络(neural net):这些是有感知器的非循环网络,某些感知器的输出用作其他感知器的输入。
基于实例的学习(instance-based learning):此方法使用整个训练集来表示函数f。
支持向量机(support-vector machine):该类的结果是一个分类器,它对未知数据更准确。分类的目标是寻找最优超平面,通过最大化两个类的最近点之间的间隔将它们分隔。
1.9.2 机器学习架构
这里,机器学习的数据方面指的是处理数据的方式以及使用数据构建模型的方式。
训练和测试(training and testing):假定所有数据都适用于训练,分离出一小部分可用的数据作为测试集,使用余下的数据建立一个合适的模型或者分类器。
批处理与在线学习(batch versus online learning):对于批处理方式,在其进程的开始,整个训练集都是可得到的;对于在线学习,其训练集以数据流的形式获得,且对它进行处理后不能被再次访问。
特征选择(feature selection):这有助于找出那些用作学习算法输入的特征。
创建训练集(creating a training set):通过手动创建标签信息,从而把数据变为训练集。
1.10 数据属性与描述
属性(attribute)是代表数据对象的某些特征、特性或者维度的字段。
在大多数情况下,数据可以用矩阵建模或者以矩阵形式表示,其中列表示数据属性,行表示数据集中的某些数据记录。对于其他情况,数据不能用矩阵表示,比如文本、时间序列、图像、音频以及视频等。数据可以通过适当的方法,如特征提取,变换成矩阵。
数据属性的类型来自它的语境、域或者语义,有数值、非数值、分类数据类型以及文本数据。有两种适用于数据属性与描述的视角,它们在数据挖掘与R语言中被广泛使用,如下所述:
基于代数或者几何视角的数据(data in algebraic or geometric view):整个数据集可以建模为一个矩阵。线性代数和抽象代数在这里起着很重要的作用。
基于概率视角的数据(data in probability view):将观测数据视为多维随机变量。每一个数值属性就是一个随机变量,维度就是数据的维度。不论数值是离散的还是连续的,这里都可以运用概率论。
为了帮助读者更自然地学习R语言,我们将采用几何、代数以及概率视角的数据。
这里有一个矩阵的例子。列数由m确定,m就是数据的维度;行数由n确定,n就是数据集的大小。
其中,xi表示第i行,表示一个m元组,如下所示:
Xj表示第j列,表示一个n元组,如下所示:
1.10.1 数值属性
因为数值数据是定量的且允许任意计算,所以它易于处理。数值数据与整数或者浮点数的性质是一样的。
来自有限集或者可数无限集的数值属性称为是离散的(discrete),例如一个人的年龄,它是从1150开始的整数值。来自任何实数值的其他属性称为是连续的(continuous)。主要有两种数值类型:
定距尺度(interval-scaled):这是以相同单位尺度测量的定量值,例如某些特定鱼类的重量,以国际度量标准,如克或者千克。
定比尺度(ratio-scaled):除了值之间的差值之外,该值可以通过值之间的比率进行计算。这是一个具有固定零点的数值属性,因此可以说一个值是另一个值的多少倍。
1.10.2 分类属性
分类属性的值来自一组符号构成的集域(集合),例如人类服装的大小被分类为{S, M, L}。分类属性可以划分为两种类型:
名义(nominal):该集合中的值是无序的且不是定量的,这里只有相等运算是有意义的。
定序(ordinal):与定类类型相反,这里的数据是有序的。这里除了相等运算外,也可以进行不相等运算。
1.10.3 数据描述
基本描述可以用来识别数据的特征,区分噪声或者异常值。两种基本的统计描述如下所示:
集中趋势的度量(measures of central tendency):它测量数据分布的中间或中心位置:均值、中位数、众数、值域中点等。
数据的离散程度的度量(measures of dispersion of the data):它包括全距、四分位数、四分位数间距等。
1.10.4 数据测量
数据测量用于聚类、异常值检测和分类。它指的是近似性、相似性和差异性的度量。两个元组或数据记录之间的相似值的取值范围是0~1的一个实数值,数值越大,元组之间的相似度就越高。差异性的原理相反,差异性值越大,两个元组就越不相似。
对于一个数据集,数据矩阵在n×m阶矩阵(n个元组和m个属性)中存储了n个数据元组:
相异度矩阵存储了数据集中的所有n个元组的近似度集合,通常为一个n×n阶的矩阵。在下面的矩阵中,d(i,?j)是两个元组之间的差异性。0表示彼此之间高度相似或者高度接近,同样,1表示完全不相同。数值越大,相异度就越高。
大多数时候,相异度和相似度是相关的概念。相似性度量通常可以使用一个函数来定义,可以用相异性的度量来构建相似性,反之亦然。
这里有一张表,它列出了不同类型属性值常用的度量方法。
属性值类型 相异度
定类属性 两个元组之间的相异度可由下式计算:d(i,?j)=(p-m)/p。其中,p表示数据的维度,m表示在相同状态下匹配的数目
定序属性 定类属性的处理与数值属性的处理类似,但在使用相应的方法之前,它首先需要进行变换
定距尺度 欧几里得(Euclidean)、曼哈顿(Manhattan)、闵可夫斯基(Minkowski)距离用于计算数据元组的相异度
1.11 数据清洗
数据清洗是数据质量的一部分,数据质量(Data Quality,DQ)的目标如下:
准确性(数据被正确记录)。
完整性(所有相关数据都被记录)。
唯一性(没有重复的数据记录)。
时效性(数据不过时)。
一致性(数据是一致的)。
数据清洗试图填补缺失值、发现异常值同时平滑噪声、修正数据中的不一致性。数据清洗通常是一个两步迭代的过程,由差异检测和数据变换构成。
在大多数情况下,数据挖掘的过程都包含如下两个步骤:
第一步对源数据集进行测试以便发现差异。
第二步是选择变换方法来修正数据(基于要修正属性的准确性以及新值与原始值的接近程度)。然后应用变换来修正差异。
1.11.1 缺失值
在从各类数据源获取数据的过程中,当某些字段为空或者包含空值时会存在许多情况。好的数据录入程序应该尽量避免或者最小化缺失值或错误的数目。缺失值与默认值是无法区分的。
如果某些字段存在缺失值,那么有一些解决方案——每种解决方案都有不同的考虑与缺陷,并且每种方案在特定情况下都是可用的。
忽略元组:由于忽略元组,除了那个缺失值以外,你也不能使用剩余的值。这种方法只适用于当元组包含的一些属性有缺失值或者每个属性缺失值的百分比变化不大时。
人工填补缺失值:对于大型数据集,该方法并不适用。
使用全局常量填补缺失值(use a global constant to fill the value):使用该常量填补缺失值可能会误导挖掘过程,并不十分安全。
使用属性集中趋势的度量来填补缺失值:集中趋势的度量可用于对称数据分布。
使用属性均值或者中位数:当给定元组时,对于属于同一类的所有样本使用属性均值或者中位数。
使用最可能的值来填补缺失值:缺失值可以用回归或者基于推理的工具,比如贝叶斯形式或者决策树归纳所确定的数据进行填补。
最流行的方法是最后一种方案,它基于当前值以及源于其他属性的值。
1.11.2 垃圾数据、噪声数据或异常值
正如在物理测试或者统计测试中,噪声是发生在获取测量数据的测试过程中的一个随机误差。对于数据收集的过程,不管你使用什么方法,噪声都不可避免地存在。
用于数据平滑的方法如下所述。随着数据挖掘研究的发展,新的方法也不断出现。
分箱:这是一个局部范围平滑的方法,在该方法中,使用近邻值计算特定箱子的终值。已排序的数据分布到多个箱子中,箱子中的每个值将被基于近邻值来计算出的值所取代。计算可以是箱子的中位数、箱子的边界,即箱子的边界数据。
回归:回归的目标是找到最佳曲线或者多维空间中某个类似于曲线的东西(函数)。因此,其他值可以用于预测目标属性或者变量的值。在其他方面,这是一种比较流行的平滑方法。
分类或者异常检测:分类器是发现噪声或者异常的另一种固有方法。在分类过程中,除了异常值外,大部分源数据将被分组到几个类中。
1.12 数据集成
数据集成将多个数据源中的数据合并,形成一个一致的数据存储。其常见的问题如下:
异构数据:这没有普遍的解决方案。
不同的定义(different definition):这是内在的,即相同的数据具有不同的定义,如不同的数据库模式。
时间一致性:这可以检查数据是否在相同的时间段收集。
旧数据:这指的是从旧系统留下的数据。
社会学因素:这限制了数据的收集。
处理上述问题也有一些方法:
实体识别问题:模式整合和目标匹配是棘手的,这称为实体识别问题。
冗余与相关性分析:有些冗余可以通关相关性分析来检测。给定两个属性,基于可用的数据,这样的分析可以测量一个属性影响另一个属性的强度。
元组重复:在元组级可以检测重复,从而可以检测属性之间的冗余。
数据值冲突的检测和分辨率:在不同的抽象级,属性可能不同,其中一个系统中的一个属性可能在不同的抽象级被记录。
1.13 数据降维
在分析复杂的多变量数据集时,降低维度往往是必要的,因为这样的数据集总是以高维形式呈现。因此,举例来说,从大量变量来建模的问题和基于定性数据多维分析的数据挖掘任务。同样,有很多方法可以用来对定性数据进行数据降维。
降低维度的目标就是通过两个或者多个比原先矩阵小很多的矩阵来取代大型矩阵,但原始矩阵可以被近似重构。通常是选取这些小矩阵的乘积来重构原始的矩阵,这一般会损失一些次要信息。
1.13.1 特征值和特征向量
一个矩阵的特征向量是指该矩阵(下述方程中的A)乘以该特征向量(下述方程中的v)的结果为一个常数乘以该特征向量。这个常数就是关于该特征向量的特征值。一个矩阵可能有好几个特征向量。
Av=λv
一个特征对就是特征向量及其特征值,也就是上式中的(v, λ)。
1.13.2 主成分分析
用于降维的主成分分析(Principal Component Analysis,PCA)技术将多维空间中的点集所构成的数据视为一个矩阵,其中行对应于点,列对应于维度。
该矩阵与其转置的乘积具有特征向量和特征值,其主特征向量可以看作空间中的方向,且沿着该方向,点排成最佳的直线。第二特征向量表示的方向使得源于主特征向量的偏差在该方向上是最大的。
主成分分析降维是通过最小化表示矩阵中给定列数的均方根误差来近似数据,用其少数的特征向量来表示矩阵中的点。
1.13.3 奇异值分解
一个矩阵的奇异值分解(Singular Value Decomposition,SVD)由以下3个矩阵构成:
U
Σ
V
U和V是列正交的,其列向量是正交的且它们的长度为1。Σ是一个对角矩阵,其对角线上的值称为奇异值。原始矩阵等于U、Σ和V的转置的乘积。
当连接原始矩阵的行和列的概念较少时,奇异值分解是有用的。
当矩阵U和V通常与原始矩阵一样大时,采用奇异值分解降维。为了使用较少列的U和V,删除U、V和Σ中与最小奇异值对应的列。这样根据修正后的U、Σ和V重构原始矩阵时就最小化了误差。
1.13.4 CUR分解
CUR分解旨在将一个稀疏矩阵分解成更小的稀疏矩阵,这些小矩阵的乘积近似于原始矩阵。
CUR从一个给定的稀疏矩阵中选择一组列构成矩阵C和一组行构成矩阵R,C和R的作用就相当于奇异值分解中的U和V?T。行与列是根据一个分布随机选择的,该分布取决于元素平方和的平方根。在矩阵C和R之间有一个方阵称为U,它是由所选择的行与列的交集的伪逆(pseudo-inverse)所构造出来的。
根据CUR解决方案,3个分量矩阵C、U和R将被检索。这3个矩阵的乘积将近似于原始矩阵M。在R社区中,有一个R添加包rCUR用于CUR矩阵分解。
1.14 数据变换与离散化
根据前面的内容,我们可以知道总有一些数据格式最适合特定的数据挖掘算法。数据变换是一种将原始数据变换成较好数据格式的方法,以便作为数据处理前特定数据挖掘算法的输入。
1.14.1 数据变换
数据变换程序将数据变换成可用于挖掘的恰当形式。它们如下所述:
平滑:使用分箱、回归和聚类去除数据中的噪声。
属性构造:根据给定的属性集,构造和添加新的属性。
聚合:在汇总或者聚合中,对数据执行操作。
标准化:这里,对属性数据进行缩放以便落入一个较小的范围。
离散化:数值属性的原始值被区间标签或者概念标签所取代。
对名义数据进行概念分层:这里,属性可以被推广到更高层次的概念中。
1.14.2 标准化数据的变换方法
为了避免依赖数据属性的测量单位的选择,数据需要标准化。这意味着将数据变换或者映射到一个较小的或者共同的范围内。在这个过程后,所有的属性获得相同的权重。有许多标准化的方法,我们看看其中的一些办法。
最小-最大标准化:该方法保留了原始数据值之间的关系,对原始数据进行线性变换。当一个属性的实际最大值和最小值可用时,该属性将被标准化。
z分数标准化:这里,属性值的标准化是基于属性的均值和标准差。当对一个属性进行标准化时,如果其实际最大值和最小值是未知的,则该方法仍然是有效的。
十进制标准化:该方法通过移动属性值的小数点将其标准化。
1.14.3 数据离散化
数据离散化通过值映射将数值数据变换成区间标签或者概念标签。离散化技术包括:
通过分箱将数据离散化:这是一个根据指定数目的、分段的、自上而下的无监督分割技术。
根据直方图分析将数据离散化:在该技术中,直方图将属性值分割在不相交的范围内,称为桶或者箱,同样为无监督的方法。
通过聚类分析将数据离散化:在该技术中,应用聚类算法离散化数值属性,它通过将该属性的值分割到不同的类或者组中。
通过决策树分析将数据离散化:这里,决策树采用自上而下的分割方法,它是一个有监督的方法。为了离散化数值属性,该方法选择具有最小熵的属性值作为分割点,并递归地划分所得的区间以实现分层离散化。
通过相关分析将数据离散化:该技术采用自下而上的方法,通过发现最佳近邻区间,然后递归地将它们合并成更大的区间,这是一个有监督的方法。
1.15 结果可视化
可视化是数据描述的图形表示,以便一目了然地揭示复杂的信息,包括所有类型的结构化信息表示。它包括图形、图表、图解、地图、故事板以及其他结构化的图示。
好的可视化结果使你有机会通过专家的眼光来查看数据。可视化结果很美,不仅因为它们的美学设计,而且因为它们有效地生成见解和新理解的优雅的细节层。
数据挖掘的每个结果都可以通过使用算法进行可视化说明。可视化在数据挖掘过程中起着重要的作用。
创建最佳的可视化有4个主要特征:
新颖的:可视化不能只作为一个信息渠道,而且还要提供一些新意,以新的风格呈现信息。
信息化的:对这些因素和数据本身的注意将形成一个有效的、成功的且漂亮的可视化结果。
有效的:好的可视化结果有明确的目标、清晰定义的信息或者用于表达信息的特殊视角。它必须尽可能简单明了,但不应该丢失必要的、相关的复杂性。这里无关的数据可以看作噪声。可视化应该反映它们所代表的数据的质量,揭示数据源中内在的和隐含的性质与关系,以便给最终使用者带来新的知识、见解和乐趣。
美感:图形必须为呈现信息的主要目标服务,不仅仅是坐标轴、布局、形状、线条和排版,而且还要恰当使用这些工具。
可视化与R语言
R语言提供了具有出版质量的图表和图形的制作。R语言中包含图形设备,还有一些设备不属于标准R语言安装的一部分,可以通过命令行使用R语言中的图形。
R语言图形设置的最重要特征就是在R中存在两种截然不同的图形系统。
传统的图形系统
网格图形系统
将对最合适的设施进行评估并将它们应用于本书列出的所有算法的每一个结果的可视化中。
R图形系统和添加包中的函数可以分为如下几种类型:
生成完整图形的高级函数
给现有图形添加进一步输出的低级函数
与图形输出交互运行的函数
可以以多种图形格式产生R的图形输出,比如PNG、JPEG、BMP、TIFF、SVG、PDF和PS。
为了加强你对本章知识的理解,这里有一些练习用于你检查相关的概念。
1.16 练习
现在,让我们来检测到目前为止我们所学习的知识:
数据挖掘和机器学习有什么区别?
什么是数据预处理?什么是数据质量?
在你的计算机上下载R并安装R。
比较数据挖掘和机器学习。
1.17 总结
本章讨论了以下主题:
数据挖掘和可用的数据源。
R语言的简要概述以及使用R语言的必要性。
统计学和机器学习,以及它们与数据挖掘关系的描述。
两个标准的行业数据挖掘过程。
数据属性类型和数据测量方法。
数据预处理的3个重要步骤。
数据挖掘算法的可扩展性和效率,以及数据可视化的方法与必要性。
社交网络挖掘、文本挖掘和网络数据挖掘。
关于RHadoop和Map Reduce的简短介绍。
在下面的章节中,我们将学习如何使用R语言来处理数据并实现不同的数据挖掘算法。
第2章
频繁模式、关联规则和相关规则挖掘
本章中,我们将首先学习如何用R语言挖掘频繁模式、关联规则及相关规则。然后,我们将使用基准数据评估所有这些方法以便确定频繁模式和规则的兴趣度。本章内容主要涵盖以下几个主题:
关联规则和关联模式概述
购物篮分析
混合关联规则挖掘
序列数据挖掘
高性能算法
关联规则挖掘算法可以从多种数据类型中发现频繁项集,包括数值数据和分类数据。根据不同的适用环境,关联规则挖掘算法会略有差异,但大多算法都基于同一个基础算法,即Apriori算法。另一个基础算法称为FP-Growth算法,与Apriori算法类似。大多数的与模式相关的挖掘算法都是来自这些基础算法。
将找到的频繁模式作为一个输入,许多算法用来发现关联规则或相关规则。每个算法仅仅是基础算法一个变体。
随着不同领域中的数据集大小和数据类型的增长,提出了一些新的算法,如多阶段算法、多重散列算法及有限扫描算法。
2.1 关联规则和关联模式概述
数据挖掘的一个最受欢迎的任务就是发现源数据集之间的关系,它从不同的数据源(如购物篮数据、图数据或流数据)中发现频繁模式。
为了充分理解关联规则分析的目的,本章中所有算法均用R语言编写,这些代码使用算法的标准R添加包(如arules添加包)进行说明。
2.1.1 模式和模式发现
在众多的领域应用中,频繁模式挖掘经常用于解决各种问题,比如大型购物中心的市场调查可以通过分析购物交易数据来完成。
频繁模式是经常出现在数据集中的模式。频繁模式挖掘的数据类型可以是项集、子序列或子结构。因此,频繁模式也可称为:
频繁项集
频繁子序列
频繁子结构
接下来的章节将详细介绍这3种频繁模式。
当从给定的数据集中发现重复出现的有意义的规则或关系时,这些新发现频繁模式将作为一个重要的平台。
为了提高挖掘数据集的效率,提出了不同的模式。本章列举了以下几种模式,后面将给出它们详细的定义。
封闭模式
最大模式
近似模式
紧凑模式
判别式频繁模式
2.1.1.1 频繁项集
频繁项集的概念来源于真实的购物篮分析。在诸如亚马逊等商店中,存在很多的订单或交易数据。当客户进行交易时,亚马逊的购物车中就会包含一些项。商店店主可以通过分析这些大量的购物事务数据,发现顾客经常购买的商品组合。据此,可以简单地定义零个或多个项的组合为项集。
我们把一项交易称为一个购物篮,任何购物篮都有组元素。将变量s设置为支持阈值,我们可以将它和一组元素在所有的购物篮中出现的次数做比较,如果这组元素在所有购物篮中出现的次数不低于s,我们就将这组元素称为一个频繁项集。
若一个项集包含有k个项,则该项集称为k项集,其中k是非零整数。项集X的支持计数记为support_count(X),表示给定数据集中包含项集X的计数。
给定一个预先定义的最小支持度阈值s,如果support_count(X)≥s,则称项集X为频繁项集。最小支持度阈值s是一个可以自定义的参数,可以根据领域专家或经验进行调整。
频繁项集也经常应用于许多领域,如下表所示。
项 篮子 说明
相关概念 词 文档
剽窃 文档 句子
生物标记物 生物标记物和疾病 病人的数据集
如果某个项集是频繁的,那么该项集的任何一个子集也一定是频繁的。这称为Apriori原理,它是Apriori算法的基础。Apriori原理的直接应用就是用来对大量的频繁项集进行剪枝。
影响频繁项集数目的一个重要因素是最小支持计数:最小支持计数越小,频繁项集的数目也越多。
为了优化频繁项集生成算法,人们提出一些其他概念:
闭项集:给定数据集S,如果Y∈S, X Y,则support_count (X) ≠ support_count (Y),那么X称作闭项集。换言之,如果X是频繁的,则X是频繁闭项集。
最大频繁项集:如果Y∈S, X Y,X是最大频繁项集,则Y是非频繁的。换言之,Y没有频繁超集。
约束频繁项集:若频繁项集X满足用户指定的约束,则X称为约束频繁项集。
近似频繁项集:若项集X只给出待挖掘数据近似的支持计数,则称为近似频繁项集。
top-k频繁项集:给定数据集S和用户指定的整数k,若X是前k个频繁项集,则X称为top-k频繁项集。
下面给出一个事务数据集的例子。所有项集仅包含集合D = {Ik |{k∈[1,7]}中的项。假定最小支持度计数为3。
tid(交易号) 项集或交易中的项列表
T001 I1, I2, I4, I7
T002 I2, I3, I6
T003 I1, I4, I6
T004 I1, I2, I5
T005 I2, I3, I4
T006 I2, I5, I6
T007 I2, I4, I7
T008 I1, I7
T009 I1, I2, I3
T010 I1, I2, I4
那么,可以得到频繁项集L1 = {Ik | k∈{1, 2, 4, 6, 7}}和L2 = {{I1, I2},{I1, I4},{I2, I4}}。
2.1.1.2 频繁子序列
频繁子序列是元素的一个有序列表,其中每个元素包含至少一个事件。一个例子是某网站页面访问序列,具体而言,它是某个用户访问不同网页的顺序。下面给出了频繁子序列的两个例子。
消费者数据:某些客户在购物商城连续的购物记录可作为序列,购买的每个商品作为事件项,用户一次购买的所有项作为元素或事务。
网页使用数据:访问WWW历史记录的用户可作为一个序列,每个UI/页面作为一个事件或项目,元素或事务定义为用户通过一次鼠标的单击访问的页面。
序列中包含的项数定义为序列的长度。长度为k的序列定义为k序列。序列的大小定义为序列中项集的数目。当满足1≤j1≤j2≤…≤jr-1≤jr≤v,且a1bj1, a2bj2, …, arbjr,则称序列s1=<a1a2…ar>为序列s2=<b1b…br>的子序列或s2为s1的超序列。
2.1.1.3 频繁子结构
在某些领域中,研究任务可借助图论来进行建模。因此,需要挖掘其中常见的子图(子树或子格)。例如:
网络挖掘:网页视为图的顶点,网页之间的链接视为图的边,用户的页面访问记录用来构造图。
网络计算:网络上具有计算能力的任何设备作为顶点,这些设备之间的相互连接作为边。由这些设备和设备之间的相互连接组成的整个网络视为图。
语义网络:XML元素视为顶点,元素之间的父/子关系视为边。所有的XML文件可视为图。
图G表示为:G = (V, E),其中V表示顶点的集合,E表示边的集合。当V′V且E′E,图G′= (V′, E′)称为G=(V, E)的子图。下图给出一个子图的例子。图中,左边是原始图及其包含的顶点和边,右边是删除多条边(或删除多个顶点)后的子图。
2.1.2 关系或规则发现
基于已发现的频繁模式,可以挖掘关联规则。根据关系的兴趣度的不同侧重点,可以进一步研究以下两种类型的关系:关联规则和相关规则。
2.1.2.1 关联规则
关联分析可以从海量数据集中发现有意义的关系,这种关系可以表示成关联规则的形式或频繁项集的形式。具体的关联分析算法将在后面一个章节中给出。
关联规则挖掘旨在发现给定数据集(事务数据集或其他序列-模式-类型数据集)中的结果规则集合。给定预先定义的最小支持度计数s和置信度c,给定已发现的规则X→Y support_count (X→Y)≥s且confidence (X→Y)≥c。
当X∩Y=(X、Y不相交),则X→Y是关联规则。规则的兴趣度通过支持度(support)和置信度(confidence)来测量。支持度表示数据集中规则出现的频率,而置信度测量在X出现的前提下,Y出现的可能性。
对于关联规则,衡量规则可用性的核心度量是规则的支持度和置信度。两者之间的关系是:
support_count(X)是数据集中包含X的项集数。
通常,在support_count(X)中,支持度和置信度的值表示为0~100的百分数。
给定最小支持度阈值s和最小置信度阈值c。如果support_count (X→Y) > s且confidence (X→Y)≥c,则关联规则X→Y称为强规则。
对于关联规则含义的解释应当慎重,尤其是当不能确定地判断规则是否意味着因果关系时。它只说明规则的前件和后件同时发生。以下是可能遇到不同种类的规则:
布尔关联规则:若规则包含项出现的关联关系,则称为布尔关联规则。
单维关联规则:若规则最多包含一个维度,则为单维关联规则。
多维关联规则:若规则至少涉及两个维度,则为多维关联规则。
相关关联规则:若关系或规则是通过统计相关进行测量的,满足给定的相关性规则,则称为相关关联规则。
定量关联规则:若规则中至少一个项或属性是定量的,则称为定量关联规则。
2.1.2.2 相关规则
在某些情况下,仅仅凭借支持度和置信度不足以过滤掉那些无意义的关联规则。此时,需要利用支持计数、置信度和相关性对关联规则进行筛选。
计算关联规则的相关性有很多方法,如卡方分析、全置信度分析、余弦分析等。对于k项集X={i1, i2 …, ik},X的全置信度值定义为:
2.2 购物篮分析
购物篮分析(Market basket analysis)是用来挖掘消费者已购买的或保存在购物车中物品组合规律的方法。这个概念适用于不同的应用,特别是商店运营。源数据集是一个巨大的数据记录,购物篮分析的目的发现源数据集中不同项之间的关联关系。
2.2.1 购物篮模型
购物篮模型是说明购物篮和其关联的商品之间的关系的模型。来自其他研究领域的许多任务与该模型有共同点。总言之,购物篮模型可作为研究的一个最典型的例子。
购物篮也称为事务数据集,它包含属于同一个项集的项集合。
Apriori算法是逐层挖掘项集的算法。与Apriori算法不同,Eclat算法是基于事务标识项集合交集的TID集合交集项集的挖掘算法,而FP-Growth算法是基于频繁模式树的算法。TID集合表示交易记录标识号的集合。
2.2.2 Apriori算法
作为常见的算法设计策略,Apriori算法挖掘关联规则可以分解为以下两个子问题:
频繁项集生成
关联规则生成
该分解策略大大降低了关联规则挖掘算法的搜索空间。
2.2.2.1 输入数据特征和数据结构
作为Apriori算法的输入,首先需要将原始输入项集进行二值化,也就是说,1代表项集中包含有某项,0代表不包含某项。默认假设下,项集的平均大小是比较小的。流行的处理方法是将输入数据集中的每个唯一的可用项映射为唯一的整数ID。
项集通常存储在数据库或文件中并需要多次扫描。为控制算法的效率,需要控制扫描的次数。在此过程中,当项集扫描其他项集时,需要对感兴趣的每个项集的表示形式计数并存储,以便算法后面使用。
在研究中,发现项集中有一个单调性特征。这说明每个频繁项集的子集也是频繁的。利用该性质,可以对Apriori算法过程中的频繁项集的搜索空间进行剪枝。该性质也可以用于压缩与频繁项集相关的信息。这个性质使频繁项集内的小频繁项集一目了然。例如,从频繁3项集中可以轻松地找出包含的3个频繁2项集。
当我们谈论k项集时,我们指的是包含k个项的项集。
购物篮模型表采用水平格式,它包含一个事务ID和多个项,它是Apriori算法的基本输入格式。相反,还有另一种格式称为垂直格式,它使用项ID和一系列事务ID的集合。垂直格式数据的挖掘算法留作练习。
2.2.2.2 Apriori算法
在Apriori算法频繁项集产生过程中,主要包含以下两种操作:连接和剪枝。
一个主要的假定是:任何项集中的项是按字母序排列的。
连接:给定频繁k-1项集Lk-1,为发现频繁k项集Lk,需要首先产生候选k项集(记为Ck)。
剪枝:候选项集Ck通常包含频繁项集LkCk,为减少计算开销。这里利用单调性质对Ck进行剪枝。
以下是频繁项集产生的伪代码:
2.2.2.3 R语言实现
这里给出Apriori频繁项生成集算法的R语言代码。记事务数据集为D,最小支持计数阈值为MIN_SUP,算法的输出为L,它是数据集D中的频繁项集。
Apriori函数的输出可以用R添加包arules来验证,该包可以实现包含Apriori算法和Eclat算法的模式挖掘和关联规则挖掘。Apriori算法的R代码如下:
为了检验上面的R代码,可以应用arules添加包对算法输出进行验证。
Arules添加包(Hahsler et al.,2011)提供了挖掘频繁项集、最大频繁项集、封闭频繁项集以及关联规则等功能。可用的算法包含Apriori算法和Eclat算法。此外,arulesSequence添加包(基于arules添加包)中还包含cSPADE算法。
给定项集:
首先,利用预先定义的排序算法将D中的项组织为有序列表,这里,简单地根据字母顺序将各项进行排序,可得到:
假定最小支持计数为5,输入数据如下表所示:
tid(事务id) 项集或事务中的项目列表
T001 I1, I2, I4, I7
T002 I2, I3, I6
T003 I1, I4, I6
T004 I1, I2, I5
T005 I2, I3, I4
T006 I2, I5, I6
T007 I2, I4, I7
T008 I1, I7
T009 I1, I2, I3
T010 I1, I2, I4
在对数据集D的第一次扫描中,可以得到每个候选1项集C1的支持计数。候选项集及其支持计数为:
项集 支持计数
{I1} 6
{I2} 8
{I3} 2
{I4} 5
{I5} 2
{I6} 3
{I7} 3
在将支持计数与最小支持计数比较后,可以得到频繁1项集L1:
项集 支持计数
{I1} 6
{I2} 8
{I4} 5
通过L1,产生候选项集C2,C2={{I1, I2}, {I1, I4}, {I2, I4}}。
项集 支持计数
{I1, I2} 4
{I1, I4} 3
{I2, I4} 4
将支持计数与最小支持数比较后,可以得到L2=?。然后,算法终止。
2.2.2.4 Apriori算法的变体
为提升Apriori算法的效率和可扩展性,人们提出了Apriori算法的一些变体。下面介绍几种比较代表性的Apriori改进算法。
2.2.3 Eclat算法
Apriori算法循环的次数与模式的最大长度是一样的。Eclat(Equivalence CLASS Transformation)算法是为了减少循环次数而设计的算法。在Eclat算法中,数据格式不再是<tid, item id set>(<事务编号,项ID集合>),而是<item id, tid set>(<项ID,事务编号集合>)。Eclat算法的数据输入格式是样本购物篮文件中的垂直格式,或者从事务数据集中发现频繁项集。在该算法中,还使用Apriori性质从k项集生成频繁k+1项集。
通过求集合的交集来生成候选项集。正如前文所述,垂直格式结构称为事务编号集合(tidset)。如果与某个项目I相关的所有事务编号都存储在一个垂直格式事务集合中,那么该项集就是特定项的事务编号集合。
通过求事务编号集合的交集来计算支持计数。给定两个tidset X和Y,X∩Y交集的支持计数是X∩Y的基数。伪代码是F←, P←{<i,t(i)>|i∈I, |t(i)|≥MIN_SUP}。
R语言实现
下面给出Eclat算法挖掘频繁模式的R语言代码。在调用该函数前,需要将f设为空,而p是频繁1项集。
这里给出一个例子的运行结果。其中,I={beer,chips,pizza,wine}。与之对应的水平和垂直格式的事务数据集如下表所示。
tid X
1 {beer, chips, wine}
2 {beer, chips}
3 {pizza, wine}
4 {chips, pizza}
x tidset
beer {1,2}
chips {1,2,4}
pizza {3,4}
wine {1,3}
该信息的二进制格式为:
tid beer chips pizza wine
1 1 1 0 1
2 1 1 0 0
3 0 0 1 1
4 0 1 1 0
在调用Eclat算法之前,设置最小支持度MIN_SUP=2, F={},则有:
算法运行过程如下图所示。经过两次迭代后,可以得到所有的频繁事物编号集合,{<beer,1 2>,<chips,1 2 4>,<pizza, 3 4>,<wine, 1 3>,<{beer, chips}, 1 2>}。
可以使用R添加包arules对Eclat函数的结果进行验证。
2.2.4 FP-growth算法
FP-growth算法是在大数据集中挖掘频繁项集的高效算法。FP-growth算法与Apriori算法的最大区别在于,该算法不需要生成候选项集,而是使用模式增长策略。频繁模式(FP)树是一种数据结构。
2.2.4.1 输入数据特征和数据结构
算法采用一种垂直和水平数据集混合的数据结构,所有的事务项集存储在树结构中。该算法使用的树结构称为频繁模式树。这里,给出了该结构生成的一个例子。其中,I={A,B,C,D,E,F},事务数据集D如下表所示。FP树的构建过程如下表所示。FP树中的每个节点表示一个项目以及从根节点到该节点的路径,即节点列表表示一个项集。这个项集以及项集的支持信息包含在每个节点中。
tid X
1 {A, B, C, D, E}
2 {A, B, C, E}
3 {A, D, E}
4 {B, E, D}
5 {B, E, C}
6 {E, C, D}
7 {E, D}
排序的项目顺序如下表所示。
项目 E D C B A
支持计数 7 5 4 4 3
根据这个新的降序顺序,对事务数据集进行重新记录,生成新的有序事务数据集,如下表所示:
tid X
1 {E, D, C, B, A}
2 {E, C, B, A}
3 {E, D, A}
4 {E, D, B}
5 {E, C, B}
6 {E, D, C}
7 {E, D}
随着将每个项集添加到FP树中,可生成最终的FP树,FP树的生成过程如下图所示。在频繁模式(FP)树生成过程中,同时计算各项的支持信息,即随着节点添加到频繁模式树的同时,到节点路径上的项目的支持计数也随之增加。
将最频繁项放置在树的顶部,这样可以使树尽可能紧凑。为了开始创建频繁模式树,首先按照支持计数降序的方式对项进行排序。其次,得到项的有序列表并删除不频繁项。然后,根据这个顺序对原始事务数据集中的每个项重新排序。
给定最小支持度MIN_SUP=3,根据这个逻辑可以对下面的项集进行处理。
下面是执行步骤4和步骤7后的结果,算法的过程非常简单和直接。
头表通常与频繁模式树结合在一起。头指针表的每个记录存储指向特定节点或项目的链接。
作为FP-growth算法的输入,频繁模式树用来发现频繁模式或频繁项集。这里的例子是以逆序或从叶子节点删除FP树的项目,因此,顺序是A, B, C, D, E。按照这种顺序,可以为每个项目创建投影频繁模式树。
2.2.4.2 FP-growth算法
这里是递归定义的伪代码,其输入值为:R←GenerateFPTree(D), P← , F←
2.2.4.3 R语言实现
FP-growth算法的主要部分的R语言实现代码如下所示。
2.2.5 基于最大频繁项集的GenMax算法
GenMax算法用来挖掘最大频繁项集(Maximal Frequent Itemset,MFI)。算法应用了最大性特性,即增加多步来检查最大频繁项集而不只是频繁项集。这部分基于Eclat算法的事物编号集合交集运算。差集用于快速频繁检验。它是两个对应项目的事物编号集合的差。
可以通过候选最大频繁项集的定义来确定它。假定最大频繁项集记为M,若X属于M,且X是新得到频繁项集Y的超集,则Y被丢弃;然而,若X是Y的子集,则将X从集合M中移除。
下面是调用GenMax算法前的伪代码,
M← ,且P←{<Xi, t(Xi)>|Xi∈D, support_count(Xi)≥MIN_SUP}
其中,D是输入事务数据集。
R语言实现
GenMax算法的主要部分的R语言代码如下所示:
2.2.6 基于频繁闭项集的Charm算法
在挖掘频繁闭项集过程中,需要对项集进行封闭检查。通过频繁闭项集,可以得到具有相同支持度的最大频繁模式。这样可以对冗余的频繁模式进行剪枝。Charm算法还利用垂直事物编号集合的交集运算来进行快速的封闭检查。
下面是调用Charm算法前的伪代码,
C← ,且P←{<Xi, t(Xi)>|Xi∈D, support_count(Xi)≥MIN_SUP}
其中,D是输入事务数据集。
R语言实现
Charm算法的主要部分的R语言实现代码如下:
2.2.7 关联规则生成算法
在根据Apriori算法生成频繁项集的过程中,计算并保存每个频繁项集的支持计数以便用于后面的关联规则挖掘过程,即关联规则挖掘。
为生成关联规则X→Y,l=X∪Y,l为某个频繁项集,需要以下两个步骤:
首先,得到l的所有非空子集。
然后,对于l的子集X,Y=l-X,规则X→Y为强关联规则,当且仅当confidence(X→Y)≥minimumconfidence。一个频繁项集的任何规则的支持计数不能小于最小支持计数。
关联规则生成算法的伪代码如下所示。
R语言实现
生成Apriori关联规则的算法的R语言代码如下所示:
为了验证上述R语言代码,可以使用Arules和Rattle添加包验证它的输出。
Arules(Hahsler et al., 2011)和Rattle添加包提供了对关联规则分析的支持。对于输出规则的可视化,可利用AruleViz。
2.3 混合关联规则挖掘
关联规则挖掘有两个有意义的应用:一是多层次和多维度关联规则挖掘;二是基于约束的关联规则挖掘。
2.3.1 多层次和多维度关联规则挖掘
对于给定的事务数据集,若数据集的某些维度存在概念层次关系,则需要对该数据集进行多层次关联规则挖掘。对事物数据集可用的任何关联规则挖掘算法都可以用于该任务。下表给出亚马逊商店的一个例子。
TID 购买的项
1 Dell Venue 7 16 GB Tablet, HP Pavilion 17-e140us 17.3-Inch Laptop...
2 Samsung Galaxy Tab 3 Lite, Razer Edge Pro 256GB Tablet…
2 Acer C720P-2666 Chromebook, Logitech Wireless Combo MK270 with Keyboard and Mouse...
2 Toshiba CB35-A3120 13.3-Inch Chromebook, Samsung Galaxy Tab 3 (7-Inch, White)...
下面是多层次模式挖掘的流程图。
基于概念层次,低层次概念可以投影到高层次概念,具有高层次概念的新数据集可以代替原始的低层次概念。
可以在每个概念层次计算支持计数。许多类Apriori算法在计算支持计数时稍微有些不同。下面是几种不同的方法:
对所有的层次使用统一的最小支持度阈值。
对较低的层次使用较小的支持度阈值。
基于组的最小支持度阈值。
有时,Apriori性质并不总成立。这里有一些例外。
多层次关联规则是从概念层次的多层次中挖掘出来的。
2.3.2 基于约束的频繁模式挖掘
基于约束的频繁模式挖掘是使用用户设定的约束对搜索空间进行剪枝的启发式算法。
常见的约束有(但不局限于)以下几种情况:
知识类型的约束(指定我们想要挖掘什么)
数据约束(对初始数据集的限制)
维度层次约束
兴趣度约束
规则约束
2.4 序列数据集挖掘
序列数据集挖掘的一个重要任务是序列模式挖掘。A-Priori-life算法被用来进行序列模式挖掘,这里使用的A-Priori-life算法,它是采用广度优先策略。然而,FP-growth算法,采用深度优先策略。出于不同的原因,算法有时还需要综合考虑一些约束。
从序列模式中,可以发现商店消费者的常见购买模式。在其他方面,特别是广告或市场营销,序列模式挖掘发挥重要作用。可以从网络日志挖掘、网页推荐系统、生物信息学分析、病历跟踪分析、灾害预防与安全管理等领域中预测个人消费者行为。
本章中的规则都是从序列模式中挖掘出来的,它们具有多种。其中一些类型序列模式如下所示:
序列规则:X→Y,其中XY。
标签序列规则(Label Sequential Rule,LSR):形如X→Y,其中Y是一个序列,X是将序列Y中的若干项用通配符替换后而产生的序列。
类序列规则(Class Sequential Rule,CSR):定义为X,若:
X→y,假设S为序列数据集,I是序列数据集S中所有项的集合,Y是类标签的集合,I∩Y=,X是一个序列且y∈Y。
2.4.1 序列数据集
序列数据集S定义为元组(sid, s)的集合,其中sid为序列ID,s为序列。
在序列数据集S中,序列X的支持度定义为S中包含X的元组数,即
supportS(X)={(sid, s)∨(sid, s)∈S←Xs}
这是序列模式的一个内在性质,它应用于相关的算法,如Apriori算法的Apriori性质。对于序列X及其子序列Y,support(X)≤support(Y)。
2.4.2 GSP算法
广义序列模式(Generalized Sequential Pattern,GSP)算法是一个类似Apriori的算法,但它应用于序列模式。该算法是逐层算法,采取宽度优先策略。它具有如下的特征:
GSP算法是Apriori算法的扩展。它利用Apriori性质(向下封闭),即,给定最小支持计数,若不接受某个序列,则其超序列也将丢弃。
需要对初始事务数据集进行多次扫描。
采用水平数据格式。
每次扫描中,通过将前一次扫描中发现的模式进行自连接来产生候选项集。
在第k次扫描中,仅当在第(k-1)次扫描中接受所有的(k-1)子模式,才接收该序列模式。
GSP算法为:
伪代码为:
2.5 R语言实现
算法主要部分的R语言实现为:
2.5.1 SPADE算法
使用等价类的序列模式发现(Sequential Pattern Discovery using Equivalent class,SPADE)算法是应用于序列模式的垂直序列挖掘算法,它采用深度优先策略。算法的特征是:
SPADE算法是Apriori算法的扩展。
算法采用Apriori性质。
需要对初始事务数据集进行多次扫描。
采用垂直数据格式。
算法采用简单的连接运算。
所有序列的发现都需要对数据进行3次扫描。
下面是调用SPADE算法之前的伪代码
F←, ∧k←0, P←{<s, L(s)s>∈∑, support_count(s)≥MIN_SUP}
R语言实现
算法主要部分的R语言代码实现是:
2.5.2 从序列模式中生成规则
序列规则、标签序列规则和类序列规则都可以从序列模式中生成,这些可以从前面的序列模式发现算法中得到。
2.6 高性能算法
伴随着数据集规模的增长,对高性能关联/模式挖掘算法的要求也随之增加。
随着Hadoop和其他类MapReduce平台的提出,满足这些需求成为可能。相关内容将于后续章节中进行介绍。根据数据集的大小,可以对某些算法进行调整以防止算法循环调用导致的栈空间不足问题,这也给我们将这些算法转化到MapReduce平台时带来了挑战。
2.7 练习
为加强对本章内容的掌握,这里给出一些有助于更好理解相关概念的实践问题。
编写R程序,寻找给定的样本购物篮事务文件中包含了多少唯一的项名。将每个项的名字映射为一个整数ID。找出所有的频繁闭项集。找出所有最大频繁项集和它们的支持计数。你自己将支持计数阈值设置为一个变量值。
用R语言编码,实现AprioriTid 算法。
2.8 总结
本章主要学习了以下内容:
购物篮分析。
作为关联规则挖掘的第一步,频繁项集是一个主要因素。除算法设计外,定义了闭项集、最大频繁项集。
作为关联规则挖掘的目标,通过支持计数、置信度等度量来挖掘关联规则。除支持计数外,使用相关公式挖掘相关规则。
频繁项集的单调性,即,若某个项集是频繁的,则其所有子集也是频繁的。
Apriori算法是挖掘频繁模式的第一个高效算法,其他诸多算法均为Apriori的变体。
序列中的序列模式。
下一章将介绍基本分类算法,包括ID3、C4.5和CART等算法,这部分内容也是数据挖掘的重要应用。