Spark 中 ML 和 MLlib 的特點和區別

大數據學習過程中一個重要的環節就是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等)性能會更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章