新書推薦:
《
知识社会史(下卷):从《百科全书》到“在线百科”
》
售價:HK$
99.7
《
我读巴芒:永恒的价值
》
售價:HK$
132.2
《
你漏财了:9种逆向思维算清人生这本账
》
售價:HK$
55.8
《
我们终将老去:认识生命的第二阶段(比利时的“理查德·道金斯”,一位行为生物学家的老年有用论
》
售價:HK$
91.8
《
谁是窃书之人 日本文坛新锐作家深绿野分著 无限流×悬疑×幻想小说
》
售價:HK$
55.8
《
一个经济杀手的自白 第3版
》
售價:HK$
110.9
《
8秒按压告别疼痛
》
售價:HK$
87.4
《
津巴多时间心理学:挣脱束缚、改写命运的6种时间观
》
售價:HK$
77.3
|
編輯推薦: |
MLlib是Apache Spark机器学习库。本书入门简单,实例丰富,详解协同过滤、线性回归、分类、决策树、保序回归、聚类、关联、数据降维、特征提取和转换等MLlib主要算法,用实例说明MLlib大数据机器学习算法的运用。
|
內容簡介: |
Spark作为新兴的、应用范围*为广泛的大数据处理开源框架引起了广泛的关注,它吸引了大量程序设计和开发人员进行相关内容的学习与开发,其中MLlib是Spark框架使用的核心。本书是一本细致介绍SparkMLlib程序设计的图书,入门简单,示例丰富。 本书分为13章,从Spark基础安装和配置开始,依次介绍MLlib程序设计基础、MLlib的数据对象构建、MLlib中RDD使用介绍,各种分类、聚类、回归等数据处理方法,*后还通过一个完整的实例,回顾了前面的学习内容,并通过代码实现了一个完整的分析过程。 本书理论内容由浅而深,采取实例和理论相结合的方式,讲解细致直观,适合Spark MLlib初学者、大数据分析和挖掘人员,也适合高校和培训学习相关专业的师生教学参考。
|
關於作者: |
王晓华,高校资深计算机专业讲师,主要研究方向为云计算、数据挖掘;曾主持和参与多项国家和省级科研课题,发表过多篇论文,有一项专利。
|
目錄:
|
目 录
第1章 星星之火 1
1.1 大数据时代 1
1.2 大数据分析时代 2
1.3 简单、优雅、有效这就是Spark 3
1.4 核心MLlib 4
1.5 星星之火,可以燎原 6
1.6 小结 6
第2章 Spark安装和开发环境配置 7
2.1 Windows单机模式Spark安装和配置 7
2.1.1 Windows 7安装Java 7
2.1.2 Windows 7安装Scala 10
2.1.3 Intellij IDEA下载和安装 13
2.1.4 Intellij IDEA中Scala插件的安装 14
2.1.5 HelloJava使用Intellij IDEA创建Java程序 18
2.1.6 HelloScala使用Intellij IDEA创建Scala程序 21
2.1.7 最后一脚Spark单机版安装 26
2.2 经典的WordCount 29
2.2.1 Spark实现WordCount 29
2.2.2 MapReduce实现WordCount 31
2.3 小结 34
第3章 RDD详解 35
3.1 RDD是什么 35
3.1.1 RDD名称的秘密 35
3.1.2 RDD特性 36
3.1.3 与其他分布式共享内存的区别 37
3.1.4 RDD缺陷 37
3.2 RDD工作原理 38
3.2.1 RDD工作原理图 38
3.2.2 RDD的相互依赖 38
3.3 RDD应用API详解 39
3.3.1 使用aggregate方法对给定的数据集进行方法设定 39
3.3.2 提前计算的cache方法 42
3.3.3 笛卡尔操作的cartesian方法 43
3.3.4 分片存储的coalesce方法 44
3.3.5 以value计算的countByValue方法 45
3.3.6 以key计算的countByKey方法 45
3.3.7 除去数据集中重复项的distinct方法 46
3.3.8 过滤数据的filter方法 47
3.3.9 以行为单位操作数据的flatMap方法 47
3.3.10 以单个数据为目标进行操作的map方法 48
3.3.11 分组数据的groupBy方法 48
3.3.12 生成键值对的keyBy方法 49
3.3.13 同时对两个数据进行处理的reduce方法 50
3.3.14 对数据进行重新排序的sortBy方法 51
3.3.15 合并压缩的zip方法 52
3.4 小结 53
第4章 MLlib基本概念 54
4.1 MLlib基本数据类型 54
4.1.1 多种数据类型 54
4.1.2 从本地向量集起步 55
4.1.3 向量标签的使用 56
4.1.4 本地矩阵的使用 58
4.1.5 分布式矩阵的使用 59
4.2 MLlib数理统计基本概念 62
4.2.1 基本统计量 62
4.2.2 统计量基本数据 63
4.2.3 距离计算 64
4.2.4 两组数据相关系数计算 65
4.2.5 分层抽样 67
4.2.6 假设检验 69
4.2.7 随机数 70
4.3 小结 71
第5章 协同过滤算法 72
5.1 协同过滤 72
5.1.1 协同过滤概述 72
5.1.2 基于用户的推荐 73
5.1.3 基于物品的推荐 74
5.1.4 协同过滤算法的不足 75
5.2 相似度度量 75
5.2.1 基于欧几里得距离的相似度计算 75
5.2.2 基于余弦角度的相似度计算 76
5.2.3 欧几里得相似度与余弦相似度的比较 77
5.2.4 第一个例子余弦相似度实战 77
5.3 MLlib中的交替最小二乘法(ALS算法) 80
5.3.1 最小二乘法(LS算法)详解 81
5.3.2 MLlib中交替最小二乘法(ALS算法)详解 82
5.3.3 ALS算法实战 83
5.4 小结 85
第6章 MLlib线性回归理论与实战 86
6.1 随机梯度下降算法详解 86
6.1.1 道士下山的故事 87
6.1.2 随机梯度下降算法的理论基础 88
6.1.3 随机梯度下降算法实战 88
6.2 MLlib回归的过拟合 89
6.2.1 过拟合产生的原因 90
6.2.2 lasso回归与岭回归 91
6.3 MLlib线性回归实战 91
6.3.1 MLlib线性回归基本准备 91
6.3.2 MLlib线性回归实战:商品价格与消费者收入之间的关系 94
6.3.3 对拟合曲线的验证 95
6.4 小结 97
第7章 MLlib分类实战 98
7.1 逻辑回归详解 98
7.1.1 逻辑回归不是回归算法 98
7.1.2 逻辑回归的数学基础 99
7.1.3 一元逻辑回归示例 100
7.1.4 多元逻辑回归示例 101
7.1.5 MLlib逻辑回归验证 103
7.1.6 MLlib逻辑回归实例:肾癌的转移判断 104
7.2 支持向量机详解 106
7.2.1 三角还是圆 106
7.2.2 支持向量机的数学基础 108
7.2.3 支持向量机使用示例 109
7.2.4 使用支持向量机分析肾癌转移 110
7.3 朴素贝叶斯详解 111
7.3.1 穿裤子的男生or女生 111
7.3.2 贝叶斯定理的数学基础和意义 112
7.3.3 朴素贝叶斯定理 113
7.3.4 MLlib朴素贝叶斯使用示例 114
7.3.5 MLlib朴素贝叶斯实战:僵尸粉的鉴定 115
7.4 小结 117
第8章 决策树与保序回归 118
8.1 决策树详解 118
8.1.1 水晶球的秘密 119
8.1.2 决策树的算法基础:信息熵 119
8.1.3 决策树的算法基础ID3算法 121
8.1.4 MLlib中决策树的构建 122
8.1.5 MLlib中决策树示例 123
8.1.6 随机雨林与梯度提升算法(GBT) 125
8.2 保序回归详解 127
8.2.1 何为保序回归 128
8.2.2 保序回归示例 128
8.3 小结 129
第9章 MLlib中聚类详解 130
9.1 聚类与分类 130
9.1.1 什么是分类 130
9.1.2 什么是聚类 131
9.2 MLlib中的Kmeans算法 131
9.2.1 什么是kmeans算法 131
9.2.2 MLlib中Kmeans算法示例 133
9.2.3 Kmeans算法中细节的讨论 134
9.3 高斯混合聚类 135
9.3.1 从高斯分布聚类起步 135
9.3.2 混合高斯聚类 137
9.3.3 MLlib高斯混合模型使用示例 137
9.4 快速迭代聚类 138
9.4.1 快速迭代聚类理论基础 138
9.4.2 快速迭代聚类示例 139
9.5 小结 140
第10章 MLlib中关联规则 141
10.1 Apriori频繁项集算法 141
10.1.1 啤酒与尿布 141
10.1.2 经典的Apriori算法 142
10.1.3 Apriori算法示例 144
10.2 FP-growth算法 145
10.2.1 Apriori算法的局限性 145
10.2.2 FP-growth算法 145
10.2.3 FP树示例 148
10.3 小结 149
第11章 数据降维 150
11.1 奇异值分解(SVD) 150
11.1.1 行矩阵(RowMatrix)详解 150
11.1.2 奇异值分解算法基础 151
11.1.3 MLlib中奇异值分解示例 152
11.2 主成分分析(PCA) 153
11.2.1 主成分分析(PCA)的定义 154
11.2.2 主成分分析(PCA)的数学基础 154
11.2.3 MLlib中主成分分析(PCA)示例 155
11.3 小结 156
第12章 特征提取和转换 157
12.1 TF-IDF 157
12.1.1 如何查找所要的新闻 157
12.1.2 TF-IDF算法的数学计算 158
12.1.3 MLlib中TF-IDF示例 159
12.2 词向量化工具 160
12.2.1 词向量化基础 160
12.2.2 词向量化使用示例 161
12.3 基于卡方检验的特征选择 162
12.3.1 吃货的苦恼 162
12.3.2 MLlib中基于卡方检验的特征选择示例 163
12.4 小结 164
第13章 MLlib实战演练鸢尾花分析 166
13.1 建模说明 166
13.1.1 数据的描述与分析目标 166
13.1.2 建模说明 168
13.2 数据预处理和分析 171
13.2.1 微观分析均值与方差的对比分析 171
13.2.2 宏观分析不同种类特性的长度计算 174
13.2.3 去除重复项相关系数的确定 176
13.3 长与宽之间的关系数据集的回归分析 180
13.3.1 使用线性回归分析长与宽之间的关系 180
13.3.2 使用逻辑回归分析长与宽之间的关系 183
13.4 使用分类和聚类对鸢尾花数据集进行处理 184
13.4.1 使用聚类分析对数据集进行聚类处理 184
13.4.2 使用分类分析对数据集进行分类处理 187
13.5 最终的判定决策树测试 188
13.5.1 决定数据集的归类决策树 188
13.5.2 决定数据集归类的分布式方法随机雨林 190
13.6 小结 191
|
內容試閱:
|
前 言
Spark在英文中是火花的意思,创作者希望它能够像火花一样点燃大数据时代的序幕。它,做到了。大数据时代是一个充满着机会和挑战的时代,就像一座未经开发的金山,任何人都有资格去获得其中的宝藏,仅仅需要的就是有一把得心应手的工具MLlib就是这个工具。本书目的本书的主要目的是介绍如何使用MLlib进行数据挖掘。MLlib是Spark中最核心的部分,它是Spark机器学习库,经过无数创造者卓越的工作,MLlib已经成为一个优雅的、可以运行在分布式集群上的数据挖掘工具。MLlib充分利用了现有数据挖掘的技术与手段,将隐藏在数据中不为人知,但又包含价值的信息从中提取出来,并通过相应的计算机程序,无须人工干预自动地在系统中进行计算,以发现其中的规律。通常来说,数据挖掘的难点和重点在于两个方面:分别是算法的学习和程序的设计。还有的是需要使用者有些相应的背景知识,例如统计学、人工智能、网络技术等。本书在写作上以工程实践为主,重点介绍其与数据挖掘密切相关的算法与概念,并且使用浅显易懂的语言将其中涉及的算法进行概括性描述,从而可以帮助使用者更好地了解和掌握数据挖掘的原理。作者在写作本书的时候有一个基本原则,这本书应该体现工程实践与理论之间的平衡。数据挖掘的目的是为了解决现实中的问题,并提供一个结果,而不是去理论比较哪个算法更高深,看起来更能吓唬人。本书对算法的基本理论和算法也做了描述,如果读者阅读起来觉得困难,建议找出相应的教材深入复习一下,相信大多数的读者都能理解相关的内容。本书内容本书主要介绍MLlib数据挖掘算法,编写的内容可以分成三部分:第一部分是MLlib最基本的介绍以及RDD的用法,包括第1~4章;第二部分是MLlib算法的应用介绍,包括第5~12章;第三部分通过一个经典的实例向读者演示了如何使用MLlib去进行数据挖掘工作,为第13章。各章节内容如下:第1章主要介绍了大数据时代带给社会与个人的影响,并由此产生的各种意义。介绍了大数据如何深入到每个人的生活之中。MLlib是大数据分析的利器,能够帮助使用者更好地完成数据分析。第2章介绍Spark的单机版安装方法和开发环境配置。MLlib是Spark数据处理框架的一个主要组件,因此其运行必须要有Spark的支持。第3章是对弹性数据集(RDD)进行了讲解,包括弹性数据集的基本组成原理和使用,以及弹性数据集在数据处理时产生的相互依赖关系,并对主要方法逐一进行示例演示。第4章介绍了MLlib在数据处理时所用到的基本数据类型。MLlib对数据进行处理时,需要将数据转变成相应的数据类型。第5章介绍了MLlib中协同过滤算法的基本原理和应用,并据此介绍了相似度计算和最小二乘法的原理和应用。第6~12章每章是一个MLlib分支部分,其将MLlib各个数据挖掘算法分别做了应用描述,介绍了其基本原理和学科背景,演示了使用方法和示例,对每个数据做了详细的分析。并且在一些较为重要的程序代码上,作者深入MLlib源码,研究了其构建方法和参数设计,从而帮助读者更深入地理解MLlib,也为将来读者编写自有的MLlib程序奠定了基础。第13章是本文的最后一章,通过经典的鸢尾花数据集向读者演示了一个数据挖掘的详细步骤。从数据的预处理开始,去除有相关性的重复数据,采用多种算法对数据进行分析计算,对数据进行分类回归,从而最终得到隐藏在数据中的结果,并为读者演示了数据挖掘的基本步骤与方法。本书特点? 本书尽量避免纯粹的理论知识介绍和高深技术研讨,完全从应用实践出发,用最简单的、典型的示例引申出核心知识,最后还指出了通往高精尖进一步深入学习的道路;? 本书全面介绍了MLlib涉及的数据挖掘的基本结构和上层程序设计,借此能够系统地看到MLlib的全貌,使读者在学习的过程中不至于迷失方向;? 本书在写作上浅显易懂,没有深奥的数学知识,采用了较为简洁的形式描述了应用的理论知识,让读者轻松愉悦地掌握相关内容;? 本书旨在引导读者进行更多技术上的创新,每章都会用示例描述的形式帮助读者更好地学习内容;? 本书代码遵循重构原理,避免代码污染,引导读者写出优秀的、简洁的、可维护的代码。读者与作者? 准备从事或者从事大数据挖掘、大数据分析的工作人员? Spark MLlib初学者? 高校和培训学校数据分析和处理相关专业的师生本书由王晓华主编,其他参与创作的作者还有李阳、张学军、陈士领、陈丽、殷龙、张鑫、赵海波、张兴瑜、毛聪、王琳、陈宇、生晖、张喆、王健,排名不分先后。示例代码下载本书示例代码可以从下面地址(注意数字和字母大小写)下载:http:pan.baidu.coms1hqtuutY如果下载有问题,请联系电子邮箱booksaga@163.com,邮件主题为MLlib代码。
编 者2017年1月
回归分析(regression analysis)是一种用来确定两种或两种以上变量间相互依赖的定量关系的统计分析方法,运用十分广泛。回归分析可以按以下要素分类:? 按照涉及的自变量的多少,分为回归和多重回归分析;? 按照自变量的多少,可分为一元回归分析和多元回归分析;? 按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。如果在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多重线性回归分析。回归分析是最常用的机器学习算法之一,可以说回归分析理论与实际研究的建立使得机器学习作为一门系统的计算机应用学科得以确认。MLlib中,线性回归是一种能够较为准确预测具体数据的回归方法,它通过给定的一系列训练数据,在预测算法的帮助下预测未知的数据。本章将向读者介绍线性回归的基本理论与MLlib中使用的预测算法,以及为了防止过度拟合而进行的正则化处理,这些不仅仅是回归算法的核心,也是MLlib的最核心部分。本章主要知识点:? 随机梯度下降算法详解? MLlib回归的过拟合? MLlib线性回归实战6.1 随机梯度下降算法详解机器学习中回归算法的种类有很多,例如神经网络回归算法、蚁群回归算法、支持向量机回归算法等,这些都可以在一定程度上达成回归拟合的目的。MLlib中使用的是较为经典的随机梯度下降算法,它充分利用了Spark框架的迭代计算特性,通过不停地判断和选择当前目标下的最优路径,从而能够在最短路径下达到最优的结果,继而提高大数据的计算效率。6.1.1 道士下山的故事在介绍随机梯度下降算法之前,给大家讲一个道士下山的故事。请读者看图6-1。图6-1 模拟随机梯度下降算法的演示图这是一个模拟随机梯度下降算法的演示图。为了便于理解,笔者将其比喻成道士想要出去游玩的一座山。设想道士有一天和道友一起到一座不太熟悉的山上去玩,在兴趣盎然中很快登上了山顶。但是天有不测,下起了雨。如果这时需要道士和其同来的道友以最快的速度下山,那该怎么办呢?如果想以最快的速度下山,那么最快的办法就是顺着坡度最陡峭的地方走下去。但是由于不熟悉路,道士在下山的过程中,每走过一段路程需要停下来观望,从而选择最陡峭的下山路线。这样一路走下来的话,可以在最短时间内走到山脚。这个最短的路线从图上可以近似的表示为:① ② ③ ④ ⑤ ⑥ ⑦每个数字代表每次停顿的地点,这样只需要在每个停顿的地点上选择最陡峭的下山路即可。这个就是一个道士下山的故事。随机梯度下降算法和这个类似,如果想要使用最迅捷的方法,那么最简单的办法就是在下降一个梯度的阶层后,寻找一个当前获得的最大坡度继续下降。这就是随机梯度算法的原理。6.1.2 随机梯度下降算法的理论基础从上一小节的例子可以看到,随机梯度下降算法就是不停地寻找某个节点中下降幅度最大的那个趋势进行迭代计算,直到将数据收缩到符合要求的范围为止。它可以用数学公式表达如下:在上一章介绍最小二乘法的时候,笔者通过最小二乘法说明了直接求解最优化变量的方法,也介绍了在求解过程中的前提条件是要求计算值与实际值的偏差的平方最小。但是在随机梯度下降算法中,对于系数需要通过不停地求解出当前位置下最优化的数据。这句话通过数学方式表达的话就是不停地对系数求偏导数。即公式如下:公式中会向着梯度下降的最快方向减少,从而推断出的最优解。因此可以说随机梯度下降算法最终被归结为通过迭代计算特征值从而求出最合适的值。求解的公式如下:公式中是下降系数,用较为通俗的话来说就是用以计算每次下降的幅度大小。系数越大则每次计算中差值越大,系数越小则差值越小,但是计算时间也相对延长。6.1.3 随机梯度下降算法实战随机梯度下降算法将梯度下降算法通过一个模型来表示的话,如图6-2所示:图6-2 随机梯度下降算法过程从图中可以看到,实现随机梯度下降算法的关键是拟合算法的实现。而本例的拟合算法实现较为简单,通过不停地修正数据值从而达到数据的最优值。具体实现代码如程序6-1所示:代码位置:SRCC06 SGD.scala程序6-1 随机梯度下降算法import scala.collection.mutable.HashMap
object SGD { val data = HashMap[Int,Int]创建数据集 def getData:HashMap[Int,Int] = { 生成数据集内容fori 12*i 写入公式y=2x}data 返回数据集 }
var :Double = 0第一步假设为0 var :Double = 0.1设置步进系数
def sgdx:Double,y:Double = {设置迭代公式 = - * *x - y 迭代公式 } def mainargs: Array[String] {val dataSource = getData获取数据集dataSource.foreachmyMap ={开始迭代 sgdmyMap._1,myMap._2 输入数据}println最终结果值为 显示结果 }}最终结果请读者自行验证完成。读者在重复运行本程序的时候,可以适当地增大数据量和步进系数。当增大数据量的时候可以看到,值会开始偏离一定的距离,请读者考虑为何会这样。6.2 MLlib回归的过拟合有计算就有误差,误差不可怕,我们需要的是采用何种方法消除误差。回归分析在计算过程中,由于特定分析数据和算法选择的原因,结果会对分析数据产生非常强烈的拟合效果;而对于测试数据,却表现得不理想,这种效果和原因称为过拟合。本节将分析过拟合产生的原因和效果,并给出一个处理手段供读者学习和掌握。6.2.1 过拟合产生的原因在上一节的最后,我们建议和鼓励读者对数据的量进行调整从而获得更多的拟合修正系数。相信读者也发现,随着数据量的增加,拟合的系数在达到一定值后会发生较大幅度的偏转。在上一节程序6-1的例子中,步进系数在0.1的程度下,数据量达到70以后就发生偏转。产生这样原因就是MLlib回归会产生过拟合现象。对于过拟合的例子请读者参看图6-3。图6-3 拟合与过拟合从图6-3所示A图和B图的对比来看,如果测试数据过于侧重某些具体的点,则会对整体的曲线形成构成很大的影响,从而影响到待测数据的测试精准度。这种对于测试数据过于接近而实际数据拟合程度不够的现象称为过拟合,而解决办法就是对数据进行处理,而处理过程称为回归的正则化。正则化使用较多的一般有两种方法,lasso回归(L1回归)和岭回归(L2回归)。其目的是通过对最小二乘估计加入处罚约束,使某些系数的估计为0。从6-3图中A图和B图回归曲线上看,A和B的差异较多地集中在回归系数的选取上。这里可以近似地将A假设为如下公式:而B公式可以近似的表示为:从A和B公式的比较来看,B公式更多的是增加了系数。因此解决办法就是通过对增加的系数进行消除从而使之消除过拟合。更加直观的理解就是,防止通过拟合算法最后计算出的回归公式比较大地响应和依赖某些特定的特征值,从而影响回归曲线的准确率。6.2.2 lasso回归与岭回归由前面对过拟合产生的原因分析来看,如果能够消除拟合公式中多余的拟合系数,那么产生的曲线可以较好地对数据进行拟合处理。因此可以认为对拟合公式过拟合的消除最直接的办法就是去除其多余的公式,那么通过数学公式表达如下:从公式可以看到,fB''是fB的变形形式,其通过增加一个新的系数公式J从而使原始数据公式获得了正则化表达。这里J又称为损失函数,它通过回归拟合曲线的范数L1和L2与一个步进数相乘得到。范数L1和范数L2是两种不同的系数惩罚项,首先来看L1范数。L1范数指的是回归公式中各个元素的绝对值之和,其又称为稀疏规则算子(Lasso regularization)。其一般公式如下:即可以通过这个公式计算使得fB''能够取得最小化。而L2范数指的是回归公式中各个元素的平方和,其又称为岭回归(Ridge Regression)可以用公式表示为:MLlib中SGD算法支持L1和L2正则化方法,而LBFGS只支持L2正则化,不支持L1正则化。L1范数和L2范数相比较而言,L1能够在步进系数在一定值的情况下将回归曲线的某些特定系数修正为0。而L1回归由于其平方的处理方法从而使得回归曲线获得较高的计算精度。6.3 MLlib线性回归实战6.3.1 MLlib线性回归基本准备在前面的章节中,我们为读者介绍了线性回归的一些基本知识,这些知识将伴随读者的整个机器学习和数据挖掘的工作生涯。本节将带领读者开始学习第一个回归算法,即线性回归。首先需要完成线性回归的数据准备工作。MLlib中,线性回归的基本数据是严格按照数据格式进行设置。例如,如果想求得公式y=2x1 3x2系数,那么需要在数据基础中设置2个x值,并且在其前部设置y值。数据整理规则如下:数据位置:DATAD06lpsa.data1,0 12,0 23,0 35,1 47,6 19,4 56,3 3这里逗号(,)前面的数值是根据不同的数据求出的结果值,而每个系数的x值依次地被排列在其后。这些就是数据的收集规则:Y = a b*X其次是对既定的MLlib回归算法中数据格式的要求,我们可以从回归算法的源码来分析,源码代码段如下:def train input: RDD[LabeledPoint], numIterations: Int, stepSize: Double: LinearRegressionModel = { traininput, numIterations, stepSize, 1.0}从上面代码段可以看到,整理的训练数据集需要输入一个LabeledPoint格式的数据,因此在读取来自数据集中的数据时,需要将其转化为既定的格式。本例子数据转化的格式如下:val parsedData = data.map { line = val parts = line.split'','' LabeledPointparts0.toDouble, Vectors.denseparts1.split'' ''.map_.toDouble}.cache从中可以看到,程序首先对读取的数据集进行分片处理,根据逗号将其分解为因变量与自变量,即线性回归中的y和x值。其后将其转换为LabeledPoint格式的数据,这里part(0)和part(1)分别代表数据分开的y和x值,并根据需要将x值转化成一个向量数组。其次是训练模型的数据要求。numIterations是整体模型的迭代次数,理论上迭代的次数越多则模型的拟合程度越高,但是随之而来的是迭代需要的时间越长。而stepSize是上面章节中随机梯度下降算法中的步进系数,代表每次迭代过程中模型的整体修正程度。最后一部分就是根据数据集训练的线性回归模型预测数据。MLlib中线性回归模型预测方法有2种,其代码如下:def predicttestData: RDD[Vector]: RDD[Double] = {
def predicttestData: Vector: Double = {表示分别要求输入一个向量或者一个RDD化后的向量作为数据变量,这里可以通过RDD内建的方法对数据进行处理。一个完整的线性回归程序如程序6-2所示。代码位置:SRCC06 LinearRegression.scala程序6-2 线性回归程序import org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}import org.apache.spark.{SparkConf, SparkContext}
object LinearRegression {val conf = new SparkConf创建环境变量.setMaster"local" 设置本地化处理.setAppName"LinearRegression " 设定名称val sc = new SparkContextconf创建环境变量实例
def mainargs: Array[String] {val data = sc.textFile"c:lpsa.data"获取数据集路径val parsedData = data.map { line =开始对数据集处理 val parts = line.split'','' 根据逗号进行分区 LabeledPointparts0.toDouble, Vectors.denseparts1.split'' ''.map_.toDouble}.cache转化数据格式建立模型val model = LinearRegressionWithSGD.trainparsedData, 100,0.1val prediction= model.predictparsedData.map_.features 检验测试集数据prediction.foreachobj = printlnobj打印原测试集数据使用模型后得出的结果 printlnmodel.predictVectors.dense0,1提供新的待测数据 }
}这里顺带提示一下,读者在最后一步看到的Vectors.dense0,1代码是人为的创建一个MLLib数据向量输入到已构成的数据模型中。请读者自行输入数据和计算回归结果。6.3.2 MLlib线性回归实战:商品价格与消费者收入之间的关系本小节我们做一个MLlib线性回归的实例。某种商品的需求量(y,吨)、价格(x1,元千克)和消费者收入(x2,元)观测值如表6-1所示。表6-1 消费和需求对应表yx1x2yx1x2
100 5 1000 65 7 40075 7 600 90 5 130080 6 1200 100 4 110070 6 500 110 3 130050 8 30 60 9 300要求:建立需求函数: ;从要求可以看到,我们需要建立一个需求回归公式,首先需要对数据进行处理,而数据的处理可以如图6-4所示。数据位置:DATAD06lr.txt图6-4 数据示例从图6-4可以看到,|分割了y值与x值,而不同的x之间通过,进行分割。具体程序如程序6-3所示。代码位置:SRCC06 LinearRegression2.scala程序6-3 线性回归实战import org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}import org.apache.spark.{SparkConf, SparkContext}
object LinearRegression {val conf = new SparkConf创建环境变量.setMaster"local" 设置本地化处理.setAppName"LinearRegression2 " 设定名称val sc = new SparkContextconf 创建环境变量实例
def mainargs: Array[String] { val data = sc.textFile"c:lr.txt" 获取数据集路径 val parsedData = data.map { line = 开始对数据集处理 val parts = line.split''|''根据逗号进行分区 LabeledPointparts0.toDouble, Vectors.denseparts1.split'',''.map_.toDouble}.cache 转化数据格式建立模型val model = LinearRegressionWithSGD.trainparsedData, 200,0.1 val prediction = model.predictparsedData.map_.features检验测试集数据prediction.foreachobj = printlnobj打印原测试集数据使用模型后得出的结果 printlnmodel.predictVectors.dense0,1 提供新的待测数据 }
}结果请读者自行验证完成。6.3.3 对拟合曲线的验证上一节中,笔者通过数据拟合出了每个元素对应系数,根据系数的确定可以定义出回归曲线公式。而至于根据系数拟合出的公式是否符合真实的数据表现则需要另外一个检验标准。均方误差(Mean Squared Error,MSE)是衡量平均误差的一种较方便的方法,可以评价数据的变化程度。均方根误差是均方误差的算术平方根。标准误差定义为各测量值误差的平方和的平均值的平方根。设n个测量值的误差为1、2n,则这组测量值的标准误差计算公式如下:数理统计中均方误差是指参数估计值与参数真值之差平方的期望值,记为MSE。MSE是衡量平均误差的一种较方便的方法,MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。与此相对应的,还有均方根误差RMSE、平均绝对百分误差等。因此,为了衡量数据预测结果与真实结果之间的差异,可以使用MSE来计算相关的预测误差。代码如下:val valuesAndPreds = parsedData.map { point = { val prediction = model.predictpoint.features point.label, prediction }}
val MSE = valuesAndPreds.map{ casev, p = math.powv - p, 2}.mean我们可以将这些代码添加到已有的程序代码中计算回归曲线的MSE,具体程序如程序6-4所示。代码位置:SRCC06 LinearRegression3.scala程序6-4 计算回归曲线的MSEimport org.apache.spark.mllib.linalg.Vectorsimport org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}import org.apache.spark.{SparkConf, SparkContext}
object LinearRegression {val conf = new SparkConf 创建环境变量.setMaster"local" 设置本地化处理.setAppName"LinearRegression3 " 设定名称val sc = new SparkContextconf 创建环境变量实例
def mainargs: Array[String] { val data = sc.textFile"c:lr.txt" 获取数据集路径 val parsedData = data.map { line = 开始对数据集处理 val parts = line.split''|''根据逗号进行分区 LabeledPointparts0.toDouble, Vectors.denseparts1.split'',''.map_.toDouble}.cache转化数据格式val model = LinearRegressionWithSGD.trainparsedData, 2,0.1 建立模型val valuesAndPreds = parsedData.map { point = {获取真实值与预测值 val prediction = model.predictpoint.features 对系数进行预测 point.label, prediction 按格式存储 }}
val MSE = valuesAndPreds.map{ casev, p = math.powv - p, 2}.mean 计算MSEprintlnMSE }
}
打印结果:3.7725016644625MLlib中的线性回归比较适合做一元线性回归而非多元线性回归,当回归系数较多时,算法产生过拟合的现象较为严重。6.4 小结本章带领读者初步学习和掌握了MLlib计算框架中最核心的部分,即梯度下降算法,这个算法将贯穿本书的始终。实际上机器学习的大多数算法都是在使用迭代的情况下最大限度地逼近近似值,这也是学习算法的基础。对于线性回归过程中产生的系数过拟合现象,本章介绍了常用的解决方法,即系数的正则化。一般情况下正则化有两种:分别是L1和L2,其原理都是在回归拟合公式后,添加相应的拟合系数来消除产生过拟合的数据。这种做法也是机器学习中常用的过拟合处理手段。最后本章对一个数据实例进行计算处理,这里建议读者更多的是对一元回归重新做一次分析计算,看看结果如何。下一章将带领读者进入MLlib的第三个部分,数据的分类。
|
|