如何在 Spark 機器學習中應用 scikit-learn?

最近在寫spark下的機器學習程序,用RDD編程模型。spark自帶的機器學習演算法API局限太多。想請問各路大俠,能不能再spark的編程模型下引用scikit-learn?


和以上幾個觀點不同,我認為在PySpark下引用scikit-learn可能的,但不能直接簡單粗暴地移植,而是要相應地對各自環境下的數據結構做一些轉換。

我們知道scikit-learn運算中最核心的數據結構存儲主要是numpy ndarray,而Spark運算中最核心的存儲是RDD,說白了就是一個基於有向無環圖的MapReduce,圖的目的就是減少Map和Reduce之間傳遞的數據,所以非常適合反覆迭代的機器學習場景。PySpark可以提供很好用的API來計算map、reduce、join、filter等函數式運算,但沒法處理numpy ndarray這種local存儲。

所以就是要想辦法將(distributed的RDD)披上羊(local的ndarray)的皮(變成ndarrayRDD),混入羊群(scikit-learn)就能吃上肉了。簡單地說,就是用RDD的鍵值對(key-value pairs)來表示多維數組的不同部分,並從中記錄著變換後的子數組的形狀及其計算時發生的各種變化。比如說吧,我們設定一個數組可以用其axes的子集作為鍵,因此一個標出橫軸和縱軸(axis=(0,1))的五維數組就可以表示成key-value pairs,其中keys是二元組,values是三維數組,這就算做成了一個ndarrayRDD。然後ndarrayRDD不斷地轉置、變形,從而實現不斷並行化的過程。這當中我們可以用Python中的map、filter、reduce等函數式運算,再加上Spark中的cache、unpersist等方法控制RDD的緩存,也就沒浪費Spark的快速特點,同時也發揮了Python和scikit-learn的優勢。

我就這樣大致這麼一說,更具體的理解還要有賴於直接閱讀源碼。是的,其實這方面的嘗試早就有人做了,而且有的開發得已經相當不錯了呢。

GitHub - bolt-project/bolt: Unified interface for local and distributed ndarrays

推薦!這是我最早看到的關於多維數組的單機和分散式之間的轉換方法,其設計思路的關鍵在於一個叫swap的方法,也就是我上面提到的ndarrayRDD的key-value pairs不斷變換,把value axes挪到key axes,value axes可以分開挪到key axes等等,split就越來越多,自然就越來越並行化。

GitHub - thunder-project/thunder: scalable analysis of images and time series

thunder是一個可以處理以圖像為主的海量數據的包,其中用到分散式的部分就是引用了上面所說的bolt.spark。

GitHub - lensacom/sparkit-learn: PySpark + Scikit-learn = Sparkit-learn

這個splearn是我覺得目前很有前途的一個包,因為它提供了三種分散式的數據結構:arrayRDD、sparseRDD、dictRDD,同時也相應地改寫了scikit-learn,以適用於變換過的RDD。

GitHub - databricks/spark-sklearn: Scikit-learn integration package for Spark

最後說一下databricks親自開發的這個Spark-sklearn。開發得還不夠充分,功能還非常有限,只能是在數據集in memory的前提下,用網格搜尋對參數做交叉驗證(也就是用到scikit-learn裡面的GridSearchCV)的時候實現並行,而不能像MLlib那樣對每個學習演算法實現並行;當內存架不住很大的數據集的時候,還得上Spark MLlib。o(︶︿︶)o


家裡的不規則自留地就別指望用生產隊的康麥因收割了


頂多是提供和scikit一樣的API,但是內部實現是完全不一樣的,底層的數據結構就不同,上層的演算法邏輯也不同,還怎麼移植?


有那麼爽就好了


沒有用過scikit這個包,不過很同意你所說的spark api限制多這個結論。很多我們習慣使用的參數或者用法在spark里都不好使了。但是我對於spark mllib的理解是他的演算法是basic的,但是其中的散列化和網路吞吐量的考慮是亮點,很棒的亮點。如果有時間和精力,完全可以去把基礎演算法改進至你想要的模式。上次scikit照理說應該在pyspark下引進去,但是能否實現分散式效率得看scikit實現方法了。淺見,希望有用


瀉藥!簡單的回答是:不能。

spark的核心是RDD,是一個DAG版的map reduce,機器學習演算法的單機和並行化版本的實現是完全不同的,sklearn作為單機的演算法庫是不能簡單的移植到spark上的

2016.2.10 updated:

在github上發現了一個項目GitHub - databricks/spark-sklearn: Scikit-learn integration package for Spark,目的是為了無縫的把sklearn和spark集成,不過現在看上去功能還比較簡單


推薦閱讀:

Hadoop、spark、SaaS、PaaS、IaaS、雲計算概念區分?
如何用形象的比喻描述大數據的技術生態?Hadoop、Hive、Spark 之間是什麼關係?
內存有限的情況下 Spark 如何處理 T 級別的數據?

TAG:Python | 機器學習 | 大數據 | Spark |