您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

為機(jī)器學(xué)習(xí)模型注入持久性

大小:0.6 MB 人氣: 2017-10-10 需要積分:1
簡介
  研究機(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)簽。這里有些例子:
  為機(jī)器學(xué)習(xí)模型注入持久性
  我們的最終目的是為了拍攝新的手寫數(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%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?