機器學習庫(MLlib)指南(Spark 2.4.5)

MLlib是Spark的機器學習(ML)庫。它的目標是使機器學習的實際應用變得容易和可擴展。在較高層次上,它提供了以下工具:

  • ML算法:常見的學習算法,如分類、迴歸、聚類和協作過濾
  • 特徵化:特徵提取、轉換、降維和篩選
  • 工作流(Pipelines):構建、評估和調整ML工作流的工具
  • 持久性:保存和加載算法、模型和工作流
  • 實用程序:線性代數、統計學、數據處理等。

注:基於DataFrame的API是主API

基於MLlib RDDAPI當前處於維護模式。

從Spark 2.0開始,Spark.mllib包中基於RDD (http://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds) 的API已經進入維護模式。Spark的主要機器學習API現在是Spark.ml包中基於DataFrame  (http://spark.apache.org/docs/latest/sql-programming-guide.html) 的API。

這意味着什麼?

  • MLlib仍然支持spark.MLlib中基於RDD的API,並修復了錯誤。
  • MLlib不會向基於RDD的API添加新特性。
  • 在Spark 2.x版本中,MLlib將向基於DataFrame 的API添加特性,與基於RDD的API的特性達到對等。
  • 在達到特性對等(初步估計是在Spark 2.3,當前最新的已經是2.4.5)之後,將不推薦使用基於RDD的API。
  • 基於RDD的API將在Spark 3.0中被刪除。

爲什麼MLlib要切換到基於DataFrame API

  • DataFrame 提供了比rdd更友好的API。DataFrame的許多優點包括Spark數據源、SQL/DataFrame查詢、Tungsten and Catalyst優化以及跨語言的統一api。
  • 基於DataFrame的MLlib API提供了跨ML算法和跨多種語言的統一API。
  • DataFrame更適合實用的ML工作流,特別是特性轉換。詳細信息請參見工作流指南(http://spark.apache.org/docs/latest/ml-pipeline.html)。

什麼是“Spark ML”

  • “Spark ML”不是一個官方名稱,偶爾用於表示MLlib這個基於DataFrame 的API。這主要是因爲基於DataFrame的API使用了org.apache.spark.ml 這個Scala包名,另外,最初我們用 “Spark ML Pipelines”這個術語只是爲了強調工作流(Pipelines)的概念。

MLlib被棄用了嗎?

  • 沒有,MLlib包括基於RDD的API和基於DataFrame的API。基於RDD的API現在處於維護模式。但無論是API還是MLlib都沒有被棄用。

依賴關係

MLlib使用線性代數庫Breeze(http://www.scalanlp.org/),它依賴於netlib-java(https://github.com/fommil/netlib-java)來優化數值處理。如果本地庫在運行時不可用,您將看到一條警告消息,並且會用純JVM的實現來替代。

由於運行時專有二進制文件的許可問題,默認情況下我們未使用netlib-java的本地代理。如果需要將netlib-java/Breeze配置爲使用系統優化的二進制文件,請將com.github.fommil.netlib:all:1.1.2(或使用-Pnetlib-lgpl來構建Spark)作爲工程(project)的依賴項,並引入netlib-java的文檔作爲平臺的附加安裝說明。

最流行的本地基本線性代數子程序(Basic Linear Algebra Subprograms,BLAS),如Intel MKL、OpenBLAS,可以在一個操作中使用多個線程,這可能與Spark的執行模型相沖突。

將這些BLAS的實現配置爲單線程在計算中使用,將很有可能提高性能(請參閱SPARK-21305(https://issues.apache.org/jira/browse/SPARK-21305))。通常,將其與每個Spark任務配置的核心數相匹配纔是最佳的,默認情況下爲1,通常保留爲1。

想了解如何配置這些BLAS實現使用的線程數,請參閱以下參考資料: Intel MKL and OpenBLAS

要在Python中使用MLlib,您需要NumPy 1.4或更高版本(http://www.numpy.org/)。

Spark 2.3的亮點

以下列表重點介紹了Spark 2.3中添加到MLlib的一些新優化和功能:

  • 增加了讀入圖像爲DataFrame 的內置支持(SPARK-21866)。
  • 增加了OneHotEncoderEstimator,建議用它代替現有的onehotecoder轉換器(transformer)。這個新的估計器支持多列轉換。
  • QuantileDiscretizer和Bucketizer(SPARK-22397和SPARK-20542)也增加了多列支持
  • 增加了新的FeatureHasher轉換器(SPARK-13969)。
  • 在使用TrainValidationSplit或CrossValidator執行交叉驗證時,增加了並行評估多個模型的支持(SPARK-19357)。
  • 改進了對Python中自定義工作流組件的支持(參見SPARK-21633和SPARK-21542)。
  • 增加了向量列描述性摘要統計的DataFrame 函數(SPARK-19634)。
  • 具有Huber損失函數的魯棒(Robust)線性迴歸(SPARK-3181)。

 

 

遷移指南

MLlib正在積極開發中。標記爲Experimental/DeveloperApi的api在未來的版本中可能會發生變化,下面的遷移指南將解釋版本之間的所有變化。

從2.2到2.3

重大變化

  • 對logistic迴歸模型摘要的類和特徵層次結構進行了修改,使之更清晰,更好地適應多類摘要的添加。對於用戶代碼來說,這是一個重大的變化,它將LogisticRegressionTrainingSummary強制轉換爲BinaryLogisticRegressionTrainingSummary。用戶應該改爲使用model.binarySummary方法。更多細節見SPARK-17139(注意這是一個實驗性的API)。這不會影響Python的summary方法,該方法仍然適用於多類和二分類的情況。

棄用和其他變化

棄用

  • OneHotEncoder已被棄用,將在3.0中刪除。它已經被新的OneHotEncoderEstimator所取代(見SPARK-13030)。注:在3.0中,OneHotEncoderEstimator將重命名爲OneHotEncoder(但OneHotEncoderEstimator會保留爲別名)。

其他變化

  • SPARK-21027: OneVsRest中使用的默認並行度現在設置爲1(即串行)。在2.2和更早版本中,並行級別設置爲默認的Scala線程池大小。
  • SPARK-22156: 當numIterations設置爲大於1時,Word2Vec的學習率更新不正確。這將導致2.3和早期版本的訓練結果不同。
  • SPARK-21681:修正了多項式logistic迴歸中的一個邊界bug,當某些特徵的方差爲零時,該錯誤會導致係數不正確。
  • SPARK-16957: 樹算法現在使用中間點分割值。這可能會改變模型訓練的結果。
  • SPARK-14657:修正了RFormula在沒有截獲的情況下生成的特徵與R中的輸出不一致的問題。這可能會改變這個場景中模型訓練的結果。

以前的Spark版本

以前的遷移指南存檔在此頁上(http://spark.apache.org/docs/latest/ml-migration-guides.html)。

注:想要進一步瞭解系統本地優化的好處和背景,您可以觀看Sam Halliday的, 關於“Scala中高性能線性代數”的ScalaX演講(http://fommil.github.io/scalax14/#/)。

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