跳轉到主要內容
工程的博客

在PySpark開發定製的機器學習算法

分享這篇文章

開發定製的機器學習在PySpark-the (ML)算法Python APIApache星火可以是具有挑戰性的和艱苦的。在這篇文章中,我們描述我們的工作來改善PySpark api來簡化開發的自定義算法。關鍵的改進減少了持久性數百行樣板代碼(保存和加載模型)一行代碼。這些變化將在未來Apache火花釋放

背景:PySpark開發者api

近年來,Python已經成為最受歡迎的語言數據科學家在世界範圍內,有超過一百萬名開發者造成成千上萬的開源毫升項目。盡管Python的極為廣泛,開發人員api的Apache火花MLlib保持Scala-dominated,算法實現首先在Scala中,然後通過包裝器在Python中可用。因此,數據科學家很難用Python開發ML算法無需編寫Scala代碼。

這篇文章介紹了幾種改進PySpark,促進第三方開發定製的ML算法和ML使用Python包。引入MLlib的主要算法api之後,我們討論當前挑戰PySpark之上構建定製的ML算法。然後我們描述我們關鍵改進PySpark等簡化定製。

MLlib算法api

PySpark之前討論的具體變化,它有助於理解ML算法的主要api火花。算法主要有兩種類型:變形金剛和估計

變形金剛是算法,並修改它通過一個輸入數據集變換()函數來生成一個輸出數據集。例如,Binarizer讀取一個輸入列的特征值從一個數據集,它輸出數據集的新列0/1功能基於閾值的原始功能。

估計是ML算法訓練數據集,使用符合()訓練一個毫升模型函數,輸出模型。該模型本身就是一個變壓器;為模型,調用變換()將“變換”預測的數據集通過添加一個新列。受歡迎的估計是邏輯回歸的例子隨機森林

用戶經常將多個變壓器和估計數據分析工作流。毫升管道為鏈接算法提供一個API,每個算法的輸出提供給以下算法。為更多的細節在這些類型的算法,看看磚文檔

下麵,我們將展示一個簡單的管道變形金剛2特性(記號賦予器,HashingTF)和1估計(LogisticRegression)MLlib指南管道

障礙:毫升持久性

假設數據科學家希望延長PySpark包括自己的定製變壓器或估計。首先,數據科學家寫的類擴展了變壓器或估計量,然後實現相應的變換()符合()方法在Python中。在簡單的情況下,實現簡單。例如,許多變壓器特性可以通過使用一個簡單的實現用戶定義函數添加一個新列輸入DataFrame。

然而,一個關鍵功能MLlib毫升持久性。持久性允許用戶保存模型和管道穩定存儲、加載和重用後或傳遞到另一個團隊。API很簡單;下麵的代碼片段使用符合模型CrossValidator參數調優,節省安裝模式,然後加載:

val cvModel = cv.fit(培訓)cvModel.save (“myCVModelPath”)val sameCVModel = CrossValidatorModel.load (“myCVModelPath”)

毫升持久化保存模型和管道為JSON元數據+拚花模型數據,和它可以用來傳輸模型和管道跨火花集群,部署,和團隊。對持久性信息,看到我們博客網絡研討會

添加支持毫升持久性一直需要一個Scala實現。到目前為止,最簡單的方法來實現持久化實現算法要求數據科學家在Scala和編寫Python包裝器。在Scala中實現該算法需要知道兩種語言,理解Java-Python通信接口,兩種語言寫重複的api。

解決方案:Python持久性mixin

支持Python-only ML算法的實現,我們實現了一個持久性框架在PySpark API類似於一個在Scala API。這個框架,實現一個自定義時變壓器或估計在Python中,不再需要在Scala實現底層的算法。相反,可以使用mixin類與一個定製的變壓器或估計量,使持久性。

對於簡單的算法,所有的參數都是JSON-serializable(簡單類型字符串,浮動),該算法類可以擴展類DefaultParamsReadableDefaultParamsWritable(火星- 21542;代碼在Github上啟用自動持久性。(如果你不熟悉Params ML管道、標準化的方法來指定算法選項或屬性。引用的參數部分MLlib引導更多信息。)持久性的默認實現將允許自定義算法在PySpark被保存和加載。

這些mixin顯著減少開發工作需要創建自定義的ML算法PySpark之上。持久化功能,用於需要許多額外的代碼就可以完成在一個單一的線在許多情況下。

下麵的代碼片段演示了Scala代碼長度的持久化一個算法實現和一個Python包裝器:

和這個代碼片段演示了使用這些mixin的Python-only實現持久性:

MyShiftTransformer(UnaryTransformer、DefaultParamsReadable DefaultParamsWritable):

添加混合DefaultParamsReadableDefaultParamsWritableMyShiftTransformer類可以讓我們消除大量的代碼。

對於複雜的算法和參數或數據不JSON-serializable(複雜類型DataFrame),開發人員可以編寫自定義save ()load ()在Python中方法。以前,即使save ()load ()實現自定義Python實現毫升管道內不能得救。我們的修複(火星- 17025)糾正這個問題,允許平滑集成定製與MLlib Python算法。

期待

這些改進,開發人員將很快能夠編寫自定義機器學習算法在Python中,在管道中使用它們,並保存和加載不碰Scala。我們相信這將開啟許多開發人員和開發Python-centric鼓勵進一步努力火花包機器學習。

免費試著磚
看到所有工程的博客的帖子
Baidu
map