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):DenseVector
和 SparseVector
◆ 本地向量是存儲(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