天天看點

基于Spark的機器學習實踐 (二) - 初識MLlib(上)1 MLlib概述

1 MLlib概述

1.1 MLlib 介紹

◆ 是基于Spark core的機器學習庫,具有Spark的優點

◆ 底層計算經過優化,比正常編碼效率往往要高

◆ 實作了多種機器學習算法,可以進行模型訓練及預測

1.2 Spark MLlib實作的算法

◆ 邏輯回歸 樸素

貝葉斯

線性回歸 SVM 決策樹 LDA 矩陣分解

1.3 Spark MLlib官方介紹

1.3.1 搜尋官方文檔

基于Spark的機器學習實踐 (二) - 初識MLlib(上)1 MLlib概述
基于Spark的機器學習實踐 (二) - 初識MLlib(上)1 MLlib概述

1.3.2 閱讀文檔 - 機器學習庫(MLlib)指南

簡介

MLlib是Spark的機器學習(ML)庫。 其目标是使實用的機器學習可擴充且簡單。 從較高的層面來說,它提供了以下工具:

  • ML算法:常見的學習算法,如分類,回歸,聚類和協同過濾
  • 特征化:特征提取,轉換,降維和選擇
  • 管道:用于建構,評估和調整ML管道的工具
  • 持久性:儲存和加載算法,模型和管道
  • 實用程式:線性代數,統計,資料處理等。

公告:基于DataFrame的API是主要的API

基于MLlib RDD的API現在處于維護模式。

從Spark 2.0開始,

spark.mllib

包中基于RDD的API已進入維護模式。 Spark的主要機器學習API現在是

spark.ml

包中基于DataFrame的API

有什麼影響?
  • MLlib仍将支援

    spark.mllib中

    基于RDD的API以及錯誤修複
  • MLlib不會為基于RDD的API添加新功能
  • 在Spark 2.x版本中,MLlib将為基于DataFrames的API添加功能,以實作與基于RDD的API的功能奇偶校驗。
  • 在達到功能奇偶校驗(粗略估計Spark 2.3)之後,将棄用基于RDD的API。
  • 預計基于RDD的API将在Spark 3.0中删除。
為什麼MLlib會切換到基于DataFrame的API?
  • DataFrames提供比RDD更加使用者友好的API。 DataFrame的許多好處包括Spark資料源,SQL / DataFrame查詢,Tungsten和Catalyst優化以及跨語言的統一API。
  • 基于DataFrame的MLlib API跨ML算法和多種語言提供統一的API。
  • DataFrames有助于實用的ML管道,特别是功能轉換。有關詳細資訊,請參閱 管道指南
什麼是“Spark ML”?

“Spark ML”不是官方名稱,但偶爾用于指代基于MLlib DataFrame的API。這主要是由于基于DataFrame的API使用的

org.apache.spark.ml Scala

包名稱,以及我們最初用來強調管道概念的“Spark ML Pipelines”術語。

MLlib已被棄用嗎?

不,MLlib包括基于RDD的API和基于DataFrame的API。基于RDD的API現在處于維護模式。但是,API都不被棄用,也不是MLlib

依賴關系

MLlib使用線性代數包Breeze,它依賴于netlib-java進行優化的數值處理。如果本機庫1在運作時不可用,您将看到一條警告消息,而将使用純JVM實作。

由于運作時專有二進制檔案的許可問題,我們預設不包括netlib-java的本機代理。要配置netlib-java / Breeze以使用系統優化的二進制檔案,請包含com.github.fommil.netlib:all:1.1.2(或使用-Pnetlib-lgpl建構Spark)作為項目的依賴項并閱讀netlib-java文檔為您的平台提供其他安裝說明。

最受歡迎的原生BLAS,如英特爾MKL,OpenBLAS,可以在一次操作中使用多個線程,這可能與Spark的執行模型沖突。

配置這些BLAS實作以使用單個線程進行操作實際上可以提高性能(請參閱SPARK-21305)。通常最好将此與每個Spark任務配置使用的核心數相比對,預設情況下為1,通常保留為1。

請參考以下資源,了解如何配置這些BLAS實作使用的線程數:Intel MKL和OpenBLAS。

要在Python中使用MLlib,您将需要NumPy 1.4或更高版本。

2.3中的亮點

下面的清單重點介紹了Spark 2.3版本中添加到MLlib的一些新功能和增強功能:

  • 添加了内置支援将圖像讀入DataFrame(SPARK-21866)。
  • 添加了OneHotEncoderEstimator,應該使用它來代替現有的OneHotEncoder轉換器。 新的估算器支援轉換多個列。
  • QuantileDiscretizer和Bucketizer(SPARK-22397和SPARK-20542)也增加了多列支援
  • 添加了一個新的FeatureHasher變換器(SPARK-13969)。
  • 在使用TrainValidationSplit或CrossValidator(SPARK-19357)執行交叉驗證時,添加了對并行評估多個模型的支援。
  • 改進了對Python中自定義管道元件的支援(請參閱SPARK-21633和SPARK-21542)。
  • DataFrame函數用于矢量列的描述性摘要統計(SPARK-19634)。
  • Huber損失的穩健線性回歸(SPARK-3181)。
打破變化

邏輯回歸模型摘要的類和特征層次結構被更改為更清晰,更好地适應了多類摘要的添加。對于将LogisticRegressionTrainingSummary強制轉換為BinaryLogisticRegressionTrainingSummary的使用者代碼,這是一個重大變化。使用者應該使用model.binarySummary方法。有關更多詳細資訊,請參閱SPARK-17139(請注意,這是一個實驗API)。這不會影響Python摘要方法,它對于多項和二進制情況仍然可以正常工作。

廢棄和行為變化
棄用

OneHotEncoder已被棄用,将在3.0中删除。它已被新的OneHotEncoderEstimator所取代(參見SPARK-13030)。請注意,OneHotEncoderEstimator将在3.0中重命名為OneHotEncoder(但OneHotEncoderEstimator将保留為别名)。

行為的變化

  • SPARK-21027:OneVsRest中使用的預設并行度現在設定為1(即串行)。在2.2及更早版本中,并行度級别設定為Scala中的預設線程池大小。
  • SPARK-22156:當numIterations設定為大于1時,Word2Vec的學習速率更新不正确。這将導緻2.3和早期版本之間的訓練結果不同。
  • SPARK-21681:修複了多項Logistic回歸中的邊緣案例錯誤,當某些特征的方差為零時,導緻系數不正确。
  • SPARK-16957:樹算法現在使用中點來分割值。這可能會改變模型訓練的結果。
  • SPARK-14657:修複了RFormula在沒有截距的情況下生成的特征與R中的輸出不一緻的問題。這可能會改變此場景中模型訓練的結果。