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

來源:互聯網
上載者:User
最近在寫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瀉藥!簡單的回答是:不能。
spark的核心是RDD,是一個DAG版的map reduce,機器學習演算法的單機和並行化版本的實現是完全不同的,sklearn作為單機的演算法庫是不能簡單的移植到spark上的

2016.2.10 updated:
在github上發現了一個項目GitHub - databricks/spark-sklearn: Scikit-learn integration package for Spark,目的是為了無縫的把sklearn和spark整合,不過現在看上去功能還比較簡單家裡的不規則自留地就別指望用生產隊的康麥因收割了頂多是提供和scikit一樣的API,但是內部實現是完全不一樣的,底層的資料結構就不同,上層的演算法邏輯也不同,還怎麼移植?有那麼爽就好了沒有用過scikit這個包,不過很同意你所說的spark api限制多這個結論。很多我們習慣使用的參數或者用法在spark裡都不好使了。但是我對於spark mllib的理解是他的演算法是basic的,但是其中的散列化和網路輸送量的考慮是亮點,很棒的亮點。如果有時間和精力,完全可以去把基礎演算法改進至你想要的模式。上次scikit照理說應該在pyspark下引進去,但是能否實現分布式效率得看scikit實現方法了。淺見,希望有用
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.