vlambda博客
学习文章列表

「大数据」(八十五)Spark之MLlib体验

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[85]篇文章,欢迎阅读和收藏】

1 基本概念

MLlib 是 Spark 的机器学习( Machine Learning )库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模。MLlib 由一些通用的学习算法和工具组成,包括分类、回归、聚类、协同过滤、降维等,同时还包括底层的优化原语和高层的管道 API 。具体来说,其主要包括以下几方面的内容:

1. 算法工具:常用的学习算法,如分类、回归、聚类和协同过滤;

2. 特征化工具:特征提取、转化、降维,和选择工具;

3. 管道 (Pipeline) :用于构建、评估和调整机器学习管道的工具 ;

4. 持久性:保存和加载算法,模型和管道 ;

5. 实用工具:线性代数,统计,数据处理等工具。

Spark 机器学习库从 1.2 版本以后被分为两个包:

l spark.mllib 包含基于 RDD 的原始算法 API 。Spark MLlib 历史比较长,在 1.0 以前的版本即已经包含了,提供的算法实现都是基于原始的 RDD 。

l spark.ml 则提供了基于 DataFrames 高层次的 API ,可以用来构建机器学习工作流( PipeLine )。ML Pipeline 弥补了原始 MLlib 库的不足,向用户提供了一个基于 DataFrame 的机器学习工作流式 API 套件。

使用 ML Pipeline API 可以很方便的把数据处理,特征转换,正则化,以及多个机器学习算法联合起来,构建一个单一完整的机器学习流水线。这种方式提供了更灵活的方法,更符合机器学习过程的特点,也更容易从其他语言迁移。Spark 官方推荐使用 spark.ml 。开发者需要注意的是,从 Spark2.0 开始,基于 RDD 的 API 进入维护模式(即不增加任何新的特性),并预期于 3.0 版本的时候被移除出 MLLib 。因此,将以 ml 包为主进行介绍。

Spark 在机器学习方面的发展非常快,目前已经支持了主流的统计和机器学习算法。纵观所有基于分布式架构的开源机器学习库, MLlib 可以算是计算效率最高的。MLlib 目前支持 4 种常见的机器学习问题 : 分类、回归、聚类和协同过滤。下表列出了目前 MLlib 支持的主要的机器学习算法:


2 术语解释

1. Spark :最初由美国加州伯克利大学( UCBerkeley )的 AMP ( Algorithms, Machines and People )实验室于 2009 年开发,是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。

2. RDD :是 Resillient Distributed Dataset (弹性分布式数据集)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。

3. GBT :Gradient Boosted Trees ,或称为梯度提升决策树。GBT 算法是由 Friedman 于 1999 年首次完整的提出,该算法可以实现回归、分类和排序。GBT 的优点是特征属性无需进行归一化处理,预测速度快,可以应用不同的损失函数等。

3 MLlib 数据类型、统计工具和算法

3.1 MLlib 基本数据类型

MLLib 提供了一序列基本数据类型以支持底层的机器学习算法。主要的数据类型包括:本地向量、标注点( Labeled Point )、本地矩阵等。本地向量与本地矩阵作为公共接口提供简单数据模型,底层的线性代数操作由 Breeze 库和 jblas 库提供。标注点类型用来表示监督学习( Supervised Learning )中的一个训练样本。

1 、 本地向量 ( Local Vector )

本地向量 存储在单机上,其拥有整型、从 0 开始的索引值以及浮点型的元素值。MLlib 提供了两种类型的本地向量,稠密向量 DenseVector 和稀疏向量 SparseVector 。稠密向量使用一个双精度浮点型数组来表示其中每一维元素,而稀疏向量则是基于一个整型索引数组和一个双精度浮点型的值数组。例如,向量 (1.0, 0.0, 3.0) 的稠密向量表示形式是 [1.0,0.0,3.0] ,而稀疏向量形式则是 (3, [0,2], [1.0, 3.0]) ,其中, 3 是向量的长度, [0,2] 是向量中非 0 维度的索引值,表示位置为 0 、 2 的两个元素为非零值,而 [1.0, 3.0] 则是按索引排列的数组元素值。

2 、 标注点 ( Labeled Point )

标注点 LabeledPoint 是一种带有标签( Label/Response )的本地向量,它可以是稠密或者是稀疏的。在 MLlib 中,标注点在监督学习算法中被使用。由于标签是用双精度浮点型来存储的,故标注点类型在回归( Regression )和分类( Classification )问题上均可使用。例如,对于二分类问题,则正样本的标签为 1 ,负样本的标签为 0 ,而对于多类别的分类问题来说,标签则应是一个以 0 开始的索引序列 :0, 1, 2 ...

在实际的机器学习问题中,稀疏向量数据是非常常见的, MLlib 提供了读取 LIBSVM 格式数据的支持,该格式被广泛用于 LIBSVM 、 LIBLINEAR 等机器学习库。在该格式下,每一个带标注的样本点由以下格式表示:

label index1:value1 index2:value2 index3:value3 ...

其中 label 是该样本点的标签值,一系列 index:value 对则代表了该样本向量中所有非零元素的索引和元素值。这里需要特别注意的是, index 是以 1 开始并递增的。

3 、 本地矩阵 ( Local Matrix )

本地矩阵 具有整型的行、列索引值和双精度浮点型的元素值,它存储在单机上。MLlib 支持稠密矩阵 DenseMatrix 和稀疏矩阵 Sparse Matrix 两种本地矩阵,稠密矩阵将所有元素的值存储在一个列优先( Column-major )的双精度型数组中,而稀疏矩阵则将非零元素以列优先的 CSC ( Compressed Sparse Column )模式进行存储。

3.2 MLlib 基本统计工具

给定一个数据集,数据分析师一般会先观察一下数据集的基本情况,称之为汇总统计或者概要性统计。一般的概要性统计用于概括一系列观测值,包括位置或集中趋势(比如算术平均值、中位数、众数和四分位均值),展型(比如四分位间距、绝对偏差和绝对距离偏差、各阶矩等),统计离差,分布的形状,依赖性等。除此之外, spark.mllib 库也提供了一些其他的基本的统计分析工具,包括相关性、分层抽样、假设检验,随机数生成等。