為機(jī)器學(xué)習(xí)模型注入持久性
大小:0.6 MB 人氣: 2017-10-10 需要積分:1
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
標(biāo)簽:機(jī)器學(xué)習(xí)模型(2552)
簡介研究機(jī)器學(xué)習(xí)用例:
數(shù)據(jù)科學(xué)家建立了一個(gè)ML模型,并交給了一個(gè)工程團(tuán)隊(duì)在生產(chǎn)環(huán)境部署。數(shù)據(jù)工程師將使用Python的模型訓(xùn)練工作流和Java模型服務(wù)工作流整合。數(shù)據(jù)科學(xué)家專門設(shè)立崗位來訓(xùn)練后期需要被保存和評(píng)估的ML模型。
在所有的這些例子中,如果有了模型的持久性,那么保存和加載模型的問題將變得更容易解決。在即將到來的2.0版本中,通過基于DataFrame的API,Spark機(jī)器學(xué)習(xí)庫MLlib將實(shí)現(xiàn)幾乎完整的ML持久性支持。本文將提前透露有關(guān)代碼示例,以及MLlib API持久性的一些細(xì)節(jié)。
ML持久性的關(guān)鍵特性包括:
Spark支持所有語言的API:Scala、Java、Python和R基于DataFram的API幾乎支持所有的ML算法支持單一模型和完整的Pipelines,不管是訓(xùn)練或者未訓(xùn)練的使用可互換的格式來實(shí)現(xiàn)分布式存儲(chǔ)
感謝所有為MLlib帶來巨大發(fā)展的社區(qū)貢獻(xiàn)者們!在JIRAs中可以看到為Scala,Java, Python和R做出貢獻(xiàn)的完整人員名單。
了解API
在Apache Spark 2.0里,對(duì)于MLlib來說基于DataFrame的API在關(guān)于Spark的ML中占據(jù)了首要位置。該API模仿被人們所熟知的Spark Data Source API,提供保存和加載模型的功能。
下面將采用流行的MNIST數(shù)據(jù)集進(jìn)行手寫體數(shù)字識(shí)別,并在幾種語言上演示保存和加載模型的功能(LeCun等著,1998;可從LIBSVM數(shù)據(jù)頁面獲?。?。這個(gè)數(shù)據(jù)集包含了手寫數(shù)字0-9,以及地面實(shí)況標(biāo)簽。這里有些例子:
我們的最終目的是為了拍攝新的手寫數(shù)字圖像并進(jìn)行數(shù)字識(shí)別。在下面的筆記中就完整地演示了數(shù)據(jù)載入,以及模型訓(xùn)練、保存和加載的代碼。
保存和加載單一模型
首先將展示如何保存和加載單一模型以促進(jìn)語言共享,例子中首先會(huì)通過Python來訓(xùn)練一個(gè)Random Forest Classifier并保存下來,然后再利用Scala加載相同的模型。
training = sqlContext.read.。. # data: features, labelrf = RandomForestClassifier(numTrees=20)model = rf.fit(training)
為了簡化,這里將保存模型稱為save方法,把加載模型稱為load方法:
model.save(“myModelPath”) sameModel = RandomForestClassificationModel.load(“myModelPath”)
我們還可以將同樣的模型(已保存在Python的)加載到一個(gè)Scala或者Java應(yīng)用程序中:
// Loadthe model inScala val sameModel = RandomForestClassificationModel.load(“myModelPath”)
這個(gè)方法既可以用于小型的本地模型例如K-Means模型(為了集群),也可以用于大型的分布式模型例如ALS模型(為了推薦)。因?yàn)榧虞d的模型具有相同的參數(shù)設(shè)置和數(shù)據(jù),所以即使加載的是一個(gè)完全不同的Spark部署,它也會(huì)給出相同的預(yù)測(cè)。
保存和加載完整Pipelines
到目前為止只演示了單一ML模型的保存和加載,但在實(shí)際過程中,ML的工作流其實(shí)包含著許多階段,從特征的提取和轉(zhuǎn)換到模型的訓(xùn)練和調(diào)優(yōu)都在其中。MLlib還提供了Pipelines來幫助用戶更好地構(gòu)建這些工作流。
同時(shí),MLlib還允許用戶保存和加載整個(gè)Pipelines。下面通過一個(gè)Pipeline案例看一下它是采用了哪些步驟實(shí)現(xiàn)的:
特征提?。菏褂肂inarizer將圖像轉(zhuǎn)換成黑白色模型訓(xùn)練:使用Random Forest Classifier拍攝圖像和預(yù)測(cè)數(shù)字0–9調(diào)優(yōu):使用交叉驗(yàn)證(Cross-Validation)來優(yōu)化森林中樹的深度
下面是建立Pipeline的一個(gè)片段:
// Construct the Pipeline: Binarizer + Random Forest val pipeline = new Pipeline().setStages(Array(binarizer, rf)) // Wrap the Pipeline inCrossValidator to do model tuning. val cv = new CrossValidator().setEstimator(pipeline) 。..
在管道訓(xùn)練之前,我們會(huì)演示將整個(gè)工作流保存下來的過程(訓(xùn)練前)。而且這個(gè)工作流可以在另一個(gè)數(shù)據(jù)集上,或者是在另一個(gè)Spark集群上等地方加載運(yùn)行。
cv.save(“myCVPath”) val sameCV = CrossValidator.load(“myCVPath”)
最后,我們就可以進(jìn)行Pipeline訓(xùn)練,再將其保存和加載。這不僅可以節(jié)省特征提取的步驟,還可以省去使用Cross-Validation調(diào)整Random Forest模型以及從模型調(diào)優(yōu)中提取數(shù)據(jù)的過程。
val cvModel = cv.fit(training) cvModel.save(“myCVModelPath”) val sameCVModel = CrossValidatorModel.load(“myCVModelPath”)
了解細(xì)節(jié)
Python調(diào)優(yōu)
很遺憾,Python調(diào)優(yōu)將缺席Spark 2.0版本。就目前情況來看,Python還不支持保存和加載用于優(yōu)化hyperparameters模型的CrossValidator和TrainValidationSplit;這個(gè)問題也正是Spark 2.1版本需要解決的。但是,它仍然有可能被用來保存Python中的CrossValidator和TrainValidationSplit結(jié)果。例如,使用Cross-Validation來調(diào)整Random Forest并將調(diào)整過程中發(fā)現(xiàn)的最好模型保存起來。
# Define the workflowrf = RandomForestClassifier() cv = CrossValidator(estimator=rf, 。..) # Fit the model, running Cross-ValidationcvModel = cv.fit(trainingData) # Extract the results, i.e., the best Random Forest modelbestModel = cvModel.bestModel # Save the RandomForest modelbestModel.save(“rfModelPath”)
可交換的存儲(chǔ)格式
在內(nèi)部,我們可以把模型的元數(shù)據(jù)和參數(shù)保存為JSON,把數(shù)據(jù)保存為Parquet。這些存儲(chǔ)格式是可交換的,還可以使用其他庫讀取。Parquet不僅可以存儲(chǔ)小的模型(例如Naive Bayes for classification),還可以存儲(chǔ)大型的分布式模型(例如ALS for recommendation)。任何被Dataset/DataFrame支持的URI 都可以保存和加載存儲(chǔ)路徑,包括S3路徑、本地存儲(chǔ)等等。
語言的跨平臺(tái)兼容性
利用Scala、Java和Python可以很容易地保存和加載模型,但是R卻有兩個(gè)局限性。一方面,R并不是支持所有的MLlib模型,其他語言所訓(xùn)練的模型也不是都可以被加載到R。另一方面,目前的R模型格式需要存儲(chǔ)一些配合R使用的數(shù)據(jù),這樣給其他語言加載R所訓(xùn)練和存儲(chǔ)的模型增加了困難。相信更好的跨語言支持R會(huì)在不久的將來被補(bǔ)足。
結(jié)論
隨著2.0版本的即將發(fā)布,DataFrame-based MLlib API將幾乎完全覆蓋持久化的模型和Pipelines。對(duì)于團(tuán)隊(duì)間共享模型、多語言ML工作流創(chuàng)建以及將模型用于生產(chǎn)這些,持久性發(fā)揮著至關(guān)重要的作用。這個(gè)特性也將會(huì)推動(dòng)MLlib API(DataFrame-based)最終轉(zhuǎn)變?yōu)锳pache Spark機(jī)器學(xué)習(xí)的重要API。
接下來呢?
未來的話,更高優(yōu)先級(jí)的項(xiàng)目將會(huì)包括完整的持久性覆蓋、Python模型優(yōu)化算法以及R和其他語言API之間的兼容性改進(jìn)。
?
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
為機(jī)器學(xué)習(xí)模型注入持久性下載
相關(guān)電子資料下載
- 機(jī)器學(xué)習(xí)模型可解釋性的結(jié)果分析 111
- 如何用機(jī)器學(xué)習(xí)模型打擊虛擬貨幣犯罪? 148
- 想在STM32 MCU上部署機(jī)器學(xué)習(xí)模型?這份入門教程,讓你一學(xué)就會(huì)~ 114
- 機(jī)器學(xué)習(xí)模型評(píng)估指標(biāo) 144
- 機(jī)器學(xué)習(xí)模型類型分類 657
- 谷歌使用機(jī)器學(xué)習(xí)模型來預(yù)測(cè)哪條路線最省油或最節(jié)能 316
- 如何有效地監(jiān)控生產(chǎn)中的機(jī)器學(xué)習(xí)模型 126
- 機(jī)器學(xué)習(xí)模型的集成方法總結(jié):Bagging, Boosting, Stacking, Voting, Blending 287
- Imagination 聯(lián)合百度飛槳?jiǎng)?chuàng)建 Model Zoo開源機(jī)器學(xué)習(xí)模型庫 132
- 支持 ChatGPT 的機(jī)器學(xué)習(xí)模型的概況 334