Spark的MLlib和ML庫的區別

機器學習庫(MLlib)指南

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

  • ML算法:通用學習算法,如分類,迴歸,聚類和協同過濾git

  • 特徵提取,特徵提取,轉換,降維和選擇github

  • 管道:用於構建,評估和調整ML管道的工具算法

  • 持久性:保存和加載算法,模型和管道sql

  • 實用程序:線性代數,統計,數據處理等apache

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

MLlib基於RDD的API如今處於維護模式。機器學習

從Spark 2.0開始,包中的基於RDD的API spark.mllib已進入維護模式。Spark的主要機器學習API如今是包中的基於DataFrame的API spark.ml工具

有什麼影響?學習

  • MLlib將仍然支持基於RDD的API spark.mllib並修復錯誤。優化

  • MLlib不會將新功能添加到基於RDD的API。

  • 在Spark 2.x版本中,MLlib將向基於DataFrame的API添加功能,以便與基於RDD的API達成功能對等。

  • 達到功能對等(大體估計爲Spark 2.2)後,基於RDD的API將被棄用。

  • 基於RDD的API預計將在Spark 3.0中被刪除。

     

 

爲何MLlib切換到基於DataFrame的API?

  • DataFrames提供比RDD更友好的API。DataFrame的許多優勢包括Spark數據源,SQL / DataFrame查詢,Tungsten和Catalyst優化以及跨語言的統一API。

  • MLlib的基於DataFrame的API提供跨ML算法和跨多種語言的統一API。

  • 數據框便於實際的ML管線,特別是功能轉換。

     

 

什麼是「Spark ML」?

  • 「Spark ML」不是一個正式的名字,偶爾用於指代基於MLlib DataFrame的API。這主要是因爲org.apache.spark.ml基於DataFrame的API所使用的Scala包名以及咱們最初用來強調管道概念的「Spark ML Pipelines」術語。

     

 

MLlib是否被棄用?

  • 編號MLlib包括基於RDD的API和基於DataFrame的API。基於RDD的API如今處於維護模式。

依賴

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

因爲運行時專有二進制文件的受權問題,netlib-java默認狀況下,咱們不包含本地代理。要配置netlib-java/ Breeze以使用系統優化的二進制文件,請包括 com.github.fommil.netlib:all:1.1.2(或者構建Spark -Pnetlib-lgpl)做爲項目的依賴項,並閱讀netlib-java文檔以獲取平臺的其餘安裝說明。

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

 

推薦閱讀:

1,Spark的Ml pipeline

2,乾貨:基於Spark Mllib的SparkNLP庫。

3,phoenix二級索引

4,Kafka源碼系列之topic建立分區分配及leader選舉

http://blog.csdn.net/rlnLo2pNEfx9c/article/details/78692975

 

 

以上就是ml和mllib的主要異同點。下面是ml和mllib邏輯迴歸的例子,能夠對比看一下, 雖然都是模型訓練和預測,可是畫風很不同。

sparse_data = [
    LabeledPoint(0.0, SparseVector(2, {0: 0.0})),
    LabeledPoint(1.0, SparseVector(2, {1: 1.0})),
    LabeledPoint(0.0, SparseVector(2, {0: 1.0})),
    LabeledPoint(1.0, SparseVector(2, {1: 2.0}))
    ]
     lrm = LogisticRegressionWithSGD.train(sc.parallelize(sparse_data), iterations=10)
     lrm.predict(array([0.0, 1.0]))

     lrm.predict(array([1.0, 0.0]))

     lrm.predict(SparseVector(2, {1: 1.0}))

     lrm.predict(SparseVector(2, {0: 1.0}))

     import os, tempfile
     path = tempfile.mkdtemp()
     lrm.save(sc, path)
     sameModel = LogisticRegressionModel.load(sc, path)
     sameModel.predict(array([0.0, 1.0]))

     sameModel.predict(SparseVector(2, {0: 1.0}))

     from shutil import rmtree
     try:
   rmtree(path)
except:
   pass
     multi_class_data = [
    LabeledPoint(0.0, [0.0, 1.0, 0.0]),
    LabeledPoint(1.0, [1.0, 0.0, 0.0]),
    LabeledPoint(2.0, [0.0, 0.0, 1.0])
    ]
     data = sc.parallelize(multi_class_data)
     mcm = LogisticRegressionWithLBFGS.train(data, iterations=10, numClasses=3)
     mcm.predict([0.0, 0.5, 0.0])

     mcm.predict([0.8, 0.0, 0.0])

     mcm.predict([0.0, 0.0, 0.3])

  

ml中的邏輯迴歸的例子

from pyspark.sql import Row
 from pyspark.ml.linalg import Vectors
 bdf = sc.parallelize([
        Row(label=1.0, weight=2.0, features=Vectors.dense(1.0)),
        Row(label=0.0, weight=2.0, features=Vectors.sparse(1, [], []))]).toDF()
 blor = LogisticRegression(maxIter=5, regParam=0.01, weightCol="weight")
 blorModel = blor.fit(bdf)
 blorModel.coefficients
DenseVector([5.5   ])
 blorModel.intercept
-2.68   
 mdf = sc.parallelize([
        Row(label=1.0, weight=2.0, features=Vectors.dense(1.0)),
        Row(label=0.0, weight=2.0, features=Vectors.sparse(1, [], [])),
        Row(label=2.0, weight=2.0, features=Vectors.dense(3.0))]).toDF()
 mlor = LogisticRegression(maxIter=5, regParam=0.01, weightCol="weight",
        family="multinomial")
 mlorModel = mlor.fit(mdf)
 print(mlorModel.coefficientMatrix)
DenseMatrix([[-2.3   ],
             [ 0.2   ],
             [ 2.1    ]])
 mlorModel.interceptVector
DenseVector([2.0   , 0.8   , -2.8   ])
 test0 = sc.parallelize([Row(features=Vectors.dense(-1.0))]).toDF()
 result = blorModel.transform(test0).head()
 result.prediction
0.0
 result.probability
DenseVector([0.99   , 0.00   ])
 result.rawPrediction
DenseVector([8.22   , -8.22   ])
 test1 = sc.parallelize([Row(features=Vectors.sparse(1, [0], [1.0]))]).toDF()
 blorModel.transform(test1).head().prediction
1.0
 blor.setParams("vector")
Traceback (most recent call last):
       
TypeError: Method setParams forces keyword arguments.
 lr_path = temp_path + "/lr"
 blor.save(lr_path)
 lr2 = LogisticRegression.load(lr_path)
 lr2.getMaxIter()
 model_path = temp_path + "/lr_model"
 blorModel.save(model_path)
 model2 = LogisticRegressionModel.load(model_path)
 blorModel.coefficients[0] == model2.coefficients[0]
True
 blorModel.intercept == model2.intercept
True
相關文章
相關標籤/搜索