基于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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筐带,隨后出現(xiàn)的幾起案子今穿,更是在濱河造成了極大的恐慌,老刑警劉巖伦籍,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓝晒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡帖鸦,警方通過(guò)查閱死者的電腦和手機(jī)芝薇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)作儿,“玉大人洛二,你說(shuō)我怎么就攤上這事」ッ蹋” “怎么了晾嘶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娶吞。 經(jīng)常有香客問(wèn)我垒迂,道長(zhǎng),這世上最難降的妖魔是什么妒蛇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任机断,我火速辦了婚禮楷拳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吏奸。我一直安慰自己欢揖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布苦丁。 她就那樣靜靜地躺著浸颓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旺拉。 梳的紋絲不亂的頭發(fā)上产上,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蛾狗,去河邊找鬼晋涣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沉桌,可吹牛的內(nèi)容都是我干的谢鹊。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼留凭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼佃扼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蔼夜,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兼耀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后求冷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瘤运,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年匠题,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拯坟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡韭山,死狀恐怖郁季,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钱磅,我是刑警寧澤巩踏,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站续搀,受9級(jí)特大地震影響塞琼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禁舷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一彪杉、第九天 我趴在偏房一處隱蔽的房頂上張望毅往。 院中可真熱鬧,春花似錦派近、人聲如沸攀唯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侯嘀。三九已至,卻和暖如春谱轨,著一層夾襖步出監(jiān)牢的瞬間戒幔,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工土童, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诗茎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓献汗,卻偏偏與公主長(zhǎng)得像敢订,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罢吃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容