基于Spark的機(jī)器學(xué)習(xí)實(shí)踐 (二) - 初識(shí)MLlib

1 MLlib概述

1.1 MLlib 介紹

◆ 是基于Spark core的機(jī)器學(xué)習(xí)庫(kù),具有Spark的優(yōu)點(diǎn)

◆ 底層計(jì)算經(jīng)過(guò)優(yōu)化,比常規(guī)編碼效率往往要高

◆ 實(shí)現(xiàn)了多種機(jī)器學(xué)習(xí)算法,可以進(jìn)行模型訓(xùn)練及預(yù)測(cè)

1.2 Spark MLlib實(shí)現(xiàn)的算法

◆ 邏輯回歸 樸素貝葉斯 線性回歸 SVM 決策樹(shù) LDA 矩陣分解

1.3 Spark MLlib官方介紹

1.3.1 搜索官方文檔



1.3.2 閱讀文檔 - 機(jī)器學(xué)習(xí)庫(kù)(MLlib)指南

簡(jiǎn)介

MLlib是Spark的機(jī)器學(xué)習(xí)(ML)庫(kù)。 其目標(biāo)是使實(shí)用的機(jī)器學(xué)習(xí)可擴(kuò)展且簡(jiǎn)單。 從較高的層面來(lái)說(shuō),它提供了以下工具:

  • ML算法:常見(jiàn)的學(xué)習(xí)算法,如分類,回歸,聚類和協(xié)同過(guò)濾
  • 特征化:特征提取,轉(zhuǎn)換,降維和選擇
  • 管道:用于構(gòu)建,評(píng)估和調(diào)整ML管道的工具
  • 持久性:保存和加載算法,模型和管道
  • 實(shí)用程序:線性代數(shù),統(tǒng)計(jì),數(shù)據(jù)處理等。

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

基于MLlib RDD的API現(xiàn)在處于維護(hù)模式。

從Spark 2.0開(kāi)始,spark.mllib包中基于RDD的API已進(jìn)入維護(hù)模式。 Spark的主要機(jī)器學(xué)習(xí)API現(xiàn)在是spark.ml包中基于DataFrame的API

有什么影響?
  • MLlib仍將支持spark.mllib中基于RDD的API以及錯(cuò)誤修復(fù)
  • MLlib不會(huì)為基于RDD的API添加新功能
  • 在Spark 2.x版本中,MLlib將為基于DataFrames的API添加功能,以實(shí)現(xiàn)與基于RDD的API的功能奇偶校驗(yàn)。
  • 在達(dá)到功能奇偶校驗(yàn)(粗略估計(jì)Spark 2.3)之后,將棄用基于RDD的API。
  • 預(yù)計(jì)基于RDD的API將在Spark 3.0中刪除。
為什么MLlib會(huì)切換到基于DataFrame的API?
  • DataFrames提供比RDD更加用戶友好的API。 DataFrame的許多好處包括Spark數(shù)據(jù)源,SQL / DataFrame查詢,Tungsten和Catalyst優(yōu)化以及跨語(yǔ)言的統(tǒng)一API。
  • 基于DataFrame的MLlib API跨ML算法和多種語(yǔ)言提供統(tǒng)一的API。
  • DataFrames有助于實(shí)用的ML管道,特別是功能轉(zhuǎn)換。有關(guān)詳細(xì)信息,請(qǐng)參閱管道指南
什么是“Spark ML”?

“Spark ML”不是官方名稱,但偶爾用于指代基于MLlib DataFrame的API。這主要是由于基于DataFrame的API使用的org.apache.spark.ml Scala包名稱,以及我們最初用來(lái)強(qiáng)調(diào)管道概念的“Spark ML Pipelines”術(shù)語(yǔ)。

MLlib已被棄用嗎?

不,MLlib包括基于RDD的API和基于DataFrame的API。基于RDD的API現(xiàn)在處于維護(hù)模式。但是,API都不被棄用,也不是MLlib

依賴關(guān)系

MLlib使用線性代數(shù)包Breeze,它依賴于netlib-java進(jìn)行優(yōu)化的數(shù)值處理。如果本機(jī)庫(kù)1在運(yùn)行時(shí)不可用,您將看到一條警告消息,而將使用純JVM實(shí)現(xiàn)。

由于運(yùn)行時(shí)專有二進(jìn)制文件的許可問(wèn)題,我們默認(rèn)不包括netlib-java的本機(jī)代理。要配置netlib-java / Breeze以使用系統(tǒng)優(yōu)化的二進(jìn)制文件,請(qǐng)包含com.github.fommil.netlib:all:1.1.2(或使用-Pnetlib-lgpl構(gòu)建Spark)作為項(xiàng)目的依賴項(xiàng)并閱讀netlib-java文檔為您的平臺(tái)提供其他安裝說(shuō)明。

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

配置這些BLAS實(shí)現(xiàn)以使用單個(gè)線程進(jìn)行操作實(shí)際上可以提高性能(請(qǐng)參閱SPARK-21305)。通常最好將此與每個(gè)Spark任務(wù)配置使用的核心數(shù)相匹配,默認(rèn)情況下為1,通常保留為1。

請(qǐng)參考以下資源,了解如何配置這些BLAS實(shí)現(xiàn)使用的線程數(shù):Intel MKL和OpenBLAS。

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

2.3中的亮點(diǎn)

下面的列表重點(diǎn)介紹了Spark 2.3版本中添加到MLlib的一些新功能和增強(qiáng)功能:

  • 添加了內(nèi)置支持將圖像讀入DataFrame(SPARK-21866)。
  • 添加了OneHotEncoderEstimator,應(yīng)該使用它來(lái)代替現(xiàn)有的OneHotEncoder轉(zhuǎn)換器。 新的估算器支持轉(zhuǎn)換多個(gè)列。
  • QuantileDiscretizer和Bucketizer(SPARK-22397和SPARK-20542)也增加了多列支持
  • 添加了一個(gè)新的FeatureHasher變換器(SPARK-13969)。
  • 在使用TrainValidationSplit或CrossValidator(SPARK-19357)執(zhí)行交叉驗(yàn)證時(shí),添加了對(duì)并行評(píng)估多個(gè)模型的支持。
  • 改進(jìn)了對(duì)Python中自定義管道組件的支持(請(qǐng)參閱SPARK-21633和SPARK-21542)。
  • DataFrame函數(shù)用于矢量列的描述性摘要統(tǒng)計(jì)(SPARK-19634)。
  • Huber損失的穩(wěn)健線性回歸(SPARK-3181)。
打破變化

邏輯回歸模型摘要的類和特征層次結(jié)構(gòu)被更改為更清晰,更好地適應(yīng)了多類摘要的添加。對(duì)于將LogisticRegressionTrainingSummary強(qiáng)制轉(zhuǎn)換為BinaryLogisticRegressionTrainingSummary的用戶代碼,這是一個(gè)重大變化。用戶應(yīng)該使用model.binarySummary方法。有關(guān)更多詳細(xì)信息,請(qǐng)參閱SPARK-17139(請(qǐng)注意,這是一個(gè)實(shí)驗(yàn)API)。這不會(huì)影響Python摘要方法,它對(duì)于多項(xiàng)和二進(jìn)制情況仍然可以正常工作。

廢棄和行為變化
棄用
  • OneHotEncoder已被棄用,將在3.0中刪除。它已被新的OneHotEncoderEstimator所取代(參見(jiàn)SPARK-13??030)。請(qǐng)注意,OneHotEncoderEstimator將在3.0中重命名為OneHotEncoder(但OneHotEncoderEstimator將保留為別名)。
行為的變化
  • SPARK-21027:OneVsRest中使用的默認(rèn)并行度現(xiàn)在設(shè)置為1(即串行)。在2.2及更早版本中,并行度級(jí)別設(shè)置為Scala中的默認(rèn)線程池大小。
  • SPARK-22156:當(dāng)numIterations設(shè)置為大于1時(shí),Word2Vec的學(xué)習(xí)速率更新不正確。這將導(dǎo)致2.3和早期版本之間的訓(xùn)練結(jié)果不同。
  • SPARK-21681:修復(fù)了多項(xiàng)Logistic回歸中的邊緣案例錯(cuò)誤,當(dāng)某些特征的方差為零時(shí),導(dǎo)致系數(shù)不正確。
  • SPARK-16957:樹(shù)算法現(xiàn)在使用中點(diǎn)來(lái)分割值。這可能會(huì)改變模型訓(xùn)練的結(jié)果。
  • SPARK-14657:修復(fù)了RFormula在沒(méi)有截距的情況下生成的特征與R中的輸出不一致的問(wèn)題。這可能會(huì)改變此場(chǎng)景中模型訓(xùn)練的結(jié)果。

2 MLlib的數(shù)據(jù)結(jié)構(gòu)

2.1 本地向量(Local vector)

具有整數(shù)類型和基于0的索引和雙類型值

本地向量的基類是Vector,我們提供了兩個(gè)實(shí)現(xiàn):DenseVectorSparseVector

◆ 本地向量是存儲(chǔ)在本地節(jié)點(diǎn)上的,其基本數(shù)據(jù)類型是Vector.
其有兩個(gè)子集,分別是密集的與稀疏的

  • 密集向量由表示其條目值的雙數(shù)組支持
  • 而稀疏向量由兩個(gè)并行數(shù)組支持:索引和值

我們一般使用Vectors工廠類來(lái)生成
例如:

◆ Vectors.dense(1.0,2.0,3.0) 主要使用稠密的

◆ Vectors.sparse(3,(0,1),(1,2),(2,3)) 稀疏的了解即可

向量(1.00.03.0)可以密集格式表示為1.00.03.0,或以稀疏格式表示為(3,02,1.03.0),其中3是矢量的大小。

2.2 標(biāo)簽數(shù)據(jù)(Labeled point)

與標(biāo)簽/響應(yīng)相關(guān)聯(lián)的局部矢量,密集或稀疏
在MLlib中,用于監(jiān)督學(xué)習(xí)算法。 我們使用雙重存儲(chǔ)標(biāo)簽,所以我們可以在回歸和分類中使用標(biāo)記點(diǎn)
對(duì)于二進(jìn)制分類,標(biāo)簽應(yīng)為0(負(fù))或1(正)
對(duì)于多類分類,標(biāo)簽應(yīng)該是從零開(kāi)始的類索引:0,1,2,....

標(biāo)記點(diǎn)由事例類 LabeledPoint 表示

◆ 我們?cè)谇懊娼榻B過(guò)"監(jiān)督學(xué)習(xí)”, 知道監(jiān)督學(xué)習(xí)是(x,y)數(shù)據(jù)形式,其中這個(gè)y就是標(biāo)簽,X是特征向量
標(biāo)簽數(shù)據(jù)也是一樣,我們看一下這個(gè)代碼

LabeledPoint(1.0,Vectors.dense(1.0,2.0,3.0))

2.3 本地矩陣

本地矩陣具有整數(shù)類型的行和列索引和雙類型值,存儲(chǔ)在單個(gè)機(jī)器上。 MLlib支持密集矩陣,其入口值以列主序列存儲(chǔ)在單個(gè)雙陣列中,稀疏矩陣的非零入口值以列主要順序存儲(chǔ)在壓縮稀疏列(CSC)格式中

與向量相似,本地矩陣類型為Matrix , 分為稠密與稀疏兩種類型。同樣使
用工廠方法Matrices來(lái)生成。但是要注意,MLlib的矩陣是按列存儲(chǔ)的。
例如下面創(chuàng)建一個(gè)3x3的單位矩陣:

Matrices.dense(3,3,Array(1,0,0,0,1,0,0,0,1))

類似地,稀疏矩陣的創(chuàng)建方法

Matrices.sparse(3,3,Array(0,1,2,3),Array(0,1,2),Array(1,1,1))

2.4 分布式矩陣

◆ 把一個(gè)矩?cái)?shù)據(jù)分布式存儲(chǔ)到多個(gè)RDD中
將分布式矩陣進(jìn)行數(shù)據(jù)轉(zhuǎn)換需要全局的shuffle函數(shù)
最基本的分布式矩陣是RowMatrix.

分布式矩陣具有長(zhǎng)類型的行和列索引和雙類型值,分布式存儲(chǔ)在一個(gè)或多個(gè)RDD中。選擇正確的格式來(lái)存儲(chǔ)大型和分布式矩陣是非常重要的。將分布式矩陣轉(zhuǎn)換為不同的格式可能需要全局shuffle,這是相當(dāng)昂貴的。到目前為止已經(jīng)實(shí)現(xiàn)了四種類型的分布式矩陣。

基本類型稱為RowMatrix。 RowMatrix是沒(méi)有有意義的行索引的行向分布式矩陣,例如特征向量的集合。它由其行的RDD支持,其中每行是局部向量。我們假設(shè)RowMatrix的列數(shù)不是很大,因此單個(gè)本地向量可以合理地傳遞給驅(qū)動(dòng)程序,也可以使用單個(gè)節(jié)點(diǎn)進(jìn)行存儲(chǔ)/操作。 IndexedRowMatrix與RowMatrix類似,但具有行索引,可用于標(biāo)識(shí)行和執(zhí)行連接。 CoordinateMatrix是以坐標(biāo) list(COO) 格式存儲(chǔ)的分布式矩陣,由其條目的RDD支持。 BlockMatrix是由MatrixBlock的RDD支持的分布式矩陣,它是(Int,Int,Matrix)的元組。

2.5 分布式數(shù)據(jù)集

◆ RDD Dataset DataFrame都是Spark的分布式數(shù)據(jù)集的數(shù)據(jù)格式
三者在一定程度上可以互相轉(zhuǎn)化,有各自的適用范圍
其中RDD是最為基礎(chǔ)與簡(jiǎn)單的一種數(shù)據(jù)集形式

2.5.1 RDD

◆ RDD(Resilient Distributed Datasets),彈性分布式數(shù)據(jù)集,是Spark中結(jié)構(gòu)最簡(jiǎn)單,也是最常用的一類數(shù)據(jù)集形 式。
可以理解為把輸入數(shù)據(jù)進(jìn)行簡(jiǎn)單的封裝之后形成的對(duì)內(nèi)存數(shù)據(jù)的抽象。


2.5.2 Dataset

◆ 與RDD分行存儲(chǔ),沒(méi)有列的概念不同,Dataset 引入了列的概念,這一點(diǎn)類似于一個(gè)CSV文件結(jié)構(gòu)。類似于一個(gè)簡(jiǎn)單的2維表


2.5.3 DataFrame

DataFrame結(jié)構(gòu)與Dataset 是類似的,都引|入了列的概念
與Dataset不同的是,DataFrame中的毎一-行被再次封裝刃Row的対象。需要通過(guò)該対象的方法來(lái)獲取到具體的值.

3 MLlib與ml

3.1 Spark提供的機(jī)器學(xué)習(xí)算法

◆ 通用算法
分類,回歸,聚類等

◆ 特征工程類
降維,轉(zhuǎn)換,選擇,特征提取等

◆數(shù)學(xué)工具
概率統(tǒng)計(jì) ,矩陣運(yùn)算等

◆ pipeline 等

3.2 MLlib與ml的區(qū)別

MLlib采用RDD形式的數(shù)據(jù)結(jié)構(gòu),而ml使用DataFrame的結(jié)構(gòu).

◆ Spark官方希望 用ml逐步替換MLlib
◆ 教程中兩者兼顧

如無(wú)特殊指明,MLlib指代Spark的機(jī)器學(xué)習(xí)組件

4 MLlib的應(yīng)用場(chǎng)景

4.1 海量數(shù)據(jù)的分析與挖掘

◆ 例如對(duì)海量的房屋出租,出售信息進(jìn)行數(shù)據(jù)挖掘,預(yù)測(cè)房?jī)r(jià)價(jià)格,租金
◆ 典型數(shù)據(jù)集:波士頓房?jī)r(jià)數(shù)據(jù)集
◆ 主要用到傳統(tǒng)的數(shù)據(jù)挖掘算法,例如使用回歸算法

4.2 大數(shù)據(jù)機(jī)器學(xué)習(xí)系統(tǒng)

◆ 例如自然語(yǔ)言處理類的系統(tǒng),推薦系統(tǒng)等
◆ 推薦系統(tǒng),需要實(shí)時(shí)進(jìn)行數(shù)據(jù)的收集,統(tǒng)計(jì),任務(wù)調(diào)度,定期更新訓(xùn)練模型
◆ 核心實(shí)現(xiàn): Spark Streaming +MLlib

Spark機(jī)器學(xué)習(xí)實(shí)踐系列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容