Spark 中 ML 和 MLlib 的特点和区别

217 阅读4分钟

大数据学习过程中一个重要的环节就是spark,但是在spark中有很多的知识点,很多人都傻傻分不清楚,其中,最易搞混的就是ml与mllib的区别,所以我们不妨来详细的了解一下二者的区别。

1. Spark ML

1)定义:ark机器学习。

2)主要操作的对象:DataFrame。

DataFrame是Dataset的子集,也就是Dataset[Row]。DataSet是对RDD的封装,对SQL之类的操作做了很多优化。

 

2. Spark MlLib

1)定义:MLlib是Spark的机器学习(ML)库。其目标是使实用的机器学习具有可扩展性和容易性。在高水平上,它提供了以下工具:

  • ML算法:常用的学习算法,如分类,回归,聚类和协同过滤
  • 特征:特征提取,变换,维数降低和选择
  • 管道:构建,评估和调整ML管道的工具
  • 持久性:保存和加载算法,模型和流水线
  • 实用程序:线性代数,统计,数据处理等

2)主要操作的对象:RDD

从Spark 2.0开始,软件包中基于RDD的API spark.mllib已进入维护模式。只修改bug,不增加系新的功能。Spark的主要机器学习API现在是包中的基于DataFrame的API spark.ml。

 

3. ML 和 MLlib 的主要区别和联系

  1. 目前常用的机器学习功能 2 个库都能满足需求;
  2. Spark 官方推荐使用 ML, 因为在 Spark3.0 之后,将会废弃 MLlib,全面的基于 ML。因为 ML 操作的对象是 DataFrame,操作起来会比 RDD 方便很多。所以建议新接触 Spark 的同学可以直接使用 ML ;
  3. ML 主要操作的是 DataFrame,而 MLlib 操作的是 RDD,也就是说二者面向的数据集不一样。相比于 MLlib 在 RDD 提供的基础操作,ML 在 DataFrame 上的抽象级别更高,数据和操作耦合度更低;
  4. DataFrame 和 RDD 之间是什么关系?DataFrame 是 Dataset 的子集,也就是 Dataset[Row];而 DataSet 是对 RDD 的封装,对 SQL 之类的操作做了很多优化;
  5. 相比于 MLlib 在 RDD 提供的基础操作,ML 在 DataFrame 上的抽象级别更高,数据和操作耦合度更低;
  6. ML 中的操作可以使用 pipeline,跟 sklearn 一样,可以把很多操作 (算法 / 特征提取 / 特征转换) 以管道的形式串起来,然后让数据在这个管道中流动。大家可以脑补一下 Linux 管道在做任务组合时有多么方便;
  7. ML 中无论是什么模型,都提供了统一的算法操作接口,比如模型训练都是 fit;不像 MLlib 中不同模型会有各种各样的 train;
  8. MLlib 在 spark2.0 之后进入维护状态,这个状态通常只修复 BUG 不增加新功能;
  9. ML 中的随机森林支持更多的功能:包括重要度、预测概率输出等,而 MLlib 不支持。

 

二者的区别详细总结

1、编程过程

(1)构建机器学习算法的过程不一样:ML提倡使用pipelines,把数据想成水,水从管道的一段流入,从另一端流出。

(2)大体概念:

DataFrame => Pipeline => A newDataFrame

Pipeline: 是由若干个Transformers和Estimators连起来的数据处理过程

Transformer:入:DataFrame => 出: Data Frame

Estimator:入:DataFrame => 出:Transformer

2、算法接口

(1)spark.mllib中的算法接口是基于RDDs的;

(2)spark.ml中的算法接口是基于DataFrames的。

实际使用中推荐ml,建立在DataFrames基础上的ml中一系列算法更适合创建包含从数据清洗到特征工程再到模型训练等一系列工作的MLpipeline;

 比如用朴素贝叶斯举个例子:

在模型训练的时候是使用naiveBayes.fit(dataset: Dataset[]):NaiveBayesModel来训练模型的,返回值是一个naiveBayesModel,可以使用naiveBayesModel.transform(dataset: Dataset[]): DataFrame,进行模型的检验,然后再通过其他的方法来评估这个模型, 模型的使用可以参考上面方法,是使用transform来进行预测的,取预测值可以使用select来取值,使用select的时候可以使用“$”label””的形式来取值。类似与sql ,使用起来通俗易懂,且入门的门槛较低。

3、抽象程度

(1)MLlib主要是基于RDD的,抽象级别不够高;

(2)ML主要是把数据处理的流水线抽象出来,算法相当于流水线的一个组件,可以被其他算法随意的替换,这样就让算法和数据处理的其他流程分割开来,实现低耦合。

 4、技术角度

面向的数据集类型不一样

(1)ml的API是面向Dataset的;

(2)mllib是面对RDD的。

Dataset和RDD有什么不一样呢?

Dataset的底端是RDD。Dataset对RDD进行了更深一层的优化,比如说有sql语言类似的黑魔法,Dataset支持静态类型分析所以在compile time就能报错,各种combinators(map,foreach等)性能会更好。