目前機器學習可以說是百花齊放階段,不過如果要學習或者研究機器學習,進而用到生產環境,對平臺,開發語言,機器學習庫的選擇就要費一番腦筋了。這裡就我自己的機器學習經驗做一個建議,僅供參考。
首先,對於平臺選擇的第一個問題是,你是要用於生產環境,也就是具體的產品中,還是僅僅是做研究學習用?
1. 生產環境中機器學習平臺的搭建
如果平臺是要用於生產環境的話,接著有一個問題,就是對產品需要分析的資料量的估計,如果資料量很大,那麼需要選擇一個大資料平臺。否則的話只需要一個單機版的平臺就可以了。
1.1 生產環境中機器學習大資料平臺的搭建
生產環境裡面大資料平臺,目前最主流的就是Spark平臺,加上輔助的分散式資料處理容器,比如YARN,或者Mesos.如果需要實時的收集線上資料,那麼就加上Kafka。簡言之,一個通用的大資料處理平臺就是整合Spark + YARN(Mesos) + Kafka. 我現在做的產品專案都是基於Spark + YARN+ Kafka的,目前來看,這個平臺選擇基本上是主流的方向。
當然,有人會說,這麼多開源軟體,一起整合起來好麻煩,大坑肯定不少,有沒有一個通用的平臺,可以包括類似Spark + YARN+ Kafka的大資料平臺功能呢?目前據我所知,做的比較好的有CDAP(http://cdap.io)。它對Spark, YARN, Kafka還有一些主流的開源資料處理軟體進行了整合,開發者只需要在它上面封裝的一層API上做二次開發就可以了。這應該是一個不錯的點子,不過目前還沒有看到商用的成功案例,所以我們在構架選型的時候就沒有考慮CDAP。
因此,圍繞Spark + YARN+ Kafka的大資料平臺還是首選。由於Spark MLlib的機器學習演算法並不豐富好用,因此如果你的產品中需要一些MLlib中沒有的演算法,就需要自己去找開源實現了。
1.2 生產環境中機器學習單機資料平臺的搭建
生產環境裡面如果資料量不大,大資料平臺就顯得有點over design了,此時我們有更多的選擇。首選,仍然是Spark平臺,不過我們不需要分散式的容器YARN和分散式資料分發的路由Kafka了。為什麼首選還是Spark呢?因為我們要考慮擴充套件,現在資料量不大,不代表以後資料量不大。這也是我參與的一些小型資料分析專案也是選擇Spark的原因。當然我覺得還有一些原因是Spark同時支援了Python, Java, Scala和R。這降低了很多程式設計師的參與門檻。我參與的Spark專案中,開發語言主要是Java和Scala。Python沒有選擇是因為一些速度的原因和系統其它部分都是用Java寫的。
第二個選擇是以scikit-learn為主的一系列python工具,包括 numpy, scipy, pandas, MatplotLib等等。特點是類庫豐富,尤其是scikit-learn的機器學習庫,可以說是十八般武器,樣樣都有。另外就是由於可以互動式的編寫程式,方便快速開發原型。我參與的有兩個專案在可行性分析階段,都是用scikit-learn來做原型和給客戶做demo。
因此,生產環境中機器學習單機資料平臺, Spark是做產品首選,而scikit-learn家族適合做快速的原型開發驗證。
2. 研究環境中機器學習平臺的搭建
如果只是做研究,那麼選擇就很多了,主流的有三種。
第一種是基於Spark MLlib來學習。好處是學到的東西用到生產環境可以無縫切換,但是壞處也很明顯,Spark東西很多,在自己的單機上跑很吃記憶體,比較慢,而且MLlib的類庫並不豐富,很多演算法需要自己再去找類庫。根據周圍同事的反饋,比較吃力,因此基於Spark MLlib來學習機器學習,我個人覺得不是一個好的選擇。
第二種是基於scikit-learn為主的一系列python工具來學習,包括上面提到的numpy, scipy, pandas, MatplotLib等等。好處是類庫多,API強大,可以讓你專注於資料的分析,例子也多,學習起來不難。當然也有缺點,就是這一大堆的python庫,要熟練的用起來需要一段時間。 個人比較推薦這種方法,周圍同事來說,用scikit-learn學習交流也是主流。
第三種是基於R的平臺來做機器學習(不包括Spark R),主要平臺是R studio。由於R是一門比較老的語言,因此他的資料處理和機器學習的API比較豐富,尤其是對於之前做資料分析師的人來說更是熟悉不過。但是R是一門相對封閉的語言,社群遠遠沒有Python的活躍,而且對於程式設計師來說, R的那種語法讓人難受。幾年前,一般會認為R的機器學習比Python的好,但是現在Python已經將R遠遠甩在了後面。因此,除非你之前已經很熟悉R語言,否則完全不推薦用R來研究機器學習,BTW,這裡沒有歧視R的意思。
總之,如果你想研究學習機器學習,並且沒有特殊的R背景,scikit-learn是你的首選。當然,有人會說,我喜歡自己去一點點的實現機器學習的演算法,不喜歡直接呼叫類庫,這樣不行嗎? 當然,這樣肯定是非常不錯的,並且對加深各個演算法理解很有好處。只是這樣比較的花時間,如果你和我一樣時間不太多的話,還是直接呼叫API來研究資料比較直接。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)