機(jī)器學(xué)習(xí)研究與開(kāi)發(fā)平臺(tái)的選擇
目前機(jī)器學(xué)習(xí)可以說(shuō)是百花齊放階段,不過(guò)如果要學(xué)習(xí)或者研究機(jī)器學(xué)習(xí),進(jìn)而用到生產(chǎn)環(huán)境,對(duì)平臺(tái),開(kāi)發(fā)語(yǔ)言,機(jī)器學(xué)習(xí)庫(kù)的選擇就要費(fèi)一番腦筋了。這里就我自己的機(jī)器學(xué)習(xí)經(jīng)驗(yàn)做一個(gè)建議,僅供參考。
首先,對(duì)于平臺(tái)選擇的***個(gè)問(wèn)題是,你是要用于生產(chǎn)環(huán)境,也就是具體的產(chǎn)品中,還是僅僅是做研究學(xué)習(xí)用?
1. 生產(chǎn)環(huán)境中機(jī)器學(xué)習(xí)平臺(tái)的搭建
如果平臺(tái)是要用于生產(chǎn)環(huán)境的話(huà),接著有一個(gè)問(wèn)題,就是對(duì)產(chǎn)品需要分析的數(shù)據(jù)量的估計(jì),如果數(shù)據(jù)量很大,那么需要選擇一個(gè)大數(shù)據(jù)平臺(tái)。否則的話(huà)只需要一個(gè)單機(jī)版的平臺(tái)就可以了。
1.1 生產(chǎn)環(huán)境中機(jī)器學(xué)習(xí)大數(shù)據(jù)平臺(tái)的搭建
生產(chǎn)環(huán)境里面大數(shù)據(jù)平臺(tái),目前最主流的就是Spark平臺(tái),加上輔助的分布式數(shù)據(jù)處理容器,比如YARN,或者M(jìn)esos.如果需要實(shí)時(shí)的收集在線(xiàn)數(shù)據(jù),那么就加上Kafka。簡(jiǎn)言之,一個(gè)通用的大數(shù)據(jù)處理平臺(tái)就是集成Spark + YARN(Mesos) + Kafka. 我現(xiàn)在做的產(chǎn)品項(xiàng)目都是基于Spark + YARN+ Kafka的,目前來(lái)看,這個(gè)平臺(tái)選擇基本上是主流的方向。
當(dāng)然,有人會(huì)說(shuō),這么多開(kāi)源軟件,一起集成起來(lái)好麻煩,大坑肯定不少,有沒(méi)有一個(gè)通用的平臺(tái),可以包括類(lèi)似Spark + YARN+ Kafka的大數(shù)據(jù)平臺(tái)功能呢?目前據(jù)我所知,做的比較好的有CDAP(http://cdap.io)。它對(duì)Spark, YARN, Kafka還有一些主流的開(kāi)源數(shù)據(jù)處理軟件進(jìn)行了集成,開(kāi)發(fā)者只需要在它上面封裝的一層API上做二次開(kāi)發(fā)就可以了。這應(yīng)該是一個(gè)不錯(cuò)的點(diǎn)子,不過(guò)目前還沒(méi)有看到商用的成功案例,所以我們?cè)跇?gòu)架選型的時(shí)候就沒(méi)有考慮CDAP。
因此,圍繞Spark + YARN+ Kafka的大數(shù)據(jù)平臺(tái)還是***。由于Spark MLlib的機(jī)器學(xué)習(xí)算法并不豐富好用,因此如果你的產(chǎn)品中需要一些MLlib中沒(méi)有的算法,就需要自己去找開(kāi)源實(shí)現(xiàn)了。
1.2 生產(chǎn)環(huán)境中機(jī)器學(xué)習(xí)單機(jī)數(shù)據(jù)平臺(tái)的搭建
生產(chǎn)環(huán)境里面如果數(shù)據(jù)里不大,大數(shù)據(jù)平臺(tái)就顯得有點(diǎn)over design了,此時(shí)我們有更多的選擇。***,仍然是Spark平臺(tái),不過(guò)我們不需要分布式的容器YARN和分布式數(shù)據(jù)分發(fā)的路由Kafka了。為什么***還是Spark呢?因?yàn)槲覀円紤]擴(kuò)展,現(xiàn)在數(shù)據(jù)量不大,不代表以后數(shù)據(jù)量不大。這也是我參與的一些小型數(shù)據(jù)分析項(xiàng)目也是選擇Spark的原因。當(dāng)然我覺(jué)得還有一些原因是Spark同時(shí)支持了Python, Java, Scala和R。這降低了很多程序員的參與門(mén)檻。我參與的Spark項(xiàng)目中,開(kāi)發(fā)語(yǔ)言主要是Java和Scala。Python沒(méi)有選擇是因?yàn)橐恍┧俣鹊脑蚝拖到y(tǒng)其它部分都是用Java寫(xiě)的。
第二個(gè)選擇是以scikit-learn為主的一系列python工具,包括 numpy, scipy, pandas, MatplotLib等等。特點(diǎn)是類(lèi)庫(kù)豐富,尤其是scikit-learn的機(jī)器學(xué)習(xí)庫(kù),可以說(shuō)是十八般武器,樣樣都有。另外就是由于可以交互式的編寫(xiě)程序,方便快速開(kāi)發(fā)原型。我參與的有兩個(gè)項(xiàng)目在可行性分析階段,都是用scikit-learn來(lái)做原型和給客戶(hù)做demo。
因此,生產(chǎn)環(huán)境中機(jī)器學(xué)習(xí)單機(jī)數(shù)據(jù)平臺(tái), Spark是做產(chǎn)品***,而scikit-learn家族適合做快速的原型開(kāi)發(fā)驗(yàn)證。
2. 研究環(huán)境中機(jī)器學(xué)習(xí)平臺(tái)的搭建
如果只是做研究,那么選擇就很多了,主流的有三種。
- ***種是基于Spark MLlib來(lái)學(xué)習(xí)。好處是學(xué)到的東西用到生產(chǎn)環(huán)境可以無(wú)縫切換,但是壞處也很明顯,Spark東西很多,在自己的單機(jī)上跑很吃?xún)?nèi)存,比較慢,而且MLlib的類(lèi)庫(kù)并不豐富,很多算法需要自己再去找類(lèi)庫(kù)。根據(jù)周?chē)碌姆答?,比較吃力,因此基于Spark MLlib來(lái)學(xué)習(xí)機(jī)器學(xué)習(xí),我個(gè)人覺(jué)得不是一個(gè)好的選擇。
- 第二種是基于scikit-learn為主的一系列python工具來(lái)學(xué)習(xí),包括上面提到的numpy, scipy, pandas, MatplotLib等等。好處是類(lèi)庫(kù)多,API強(qiáng)大,可以讓你專(zhuān)注于數(shù)據(jù)的分析,例子也多,學(xué)習(xí)起來(lái)不難。當(dāng)然也有缺點(diǎn),就是這一大堆的python庫(kù),要熟練的用起來(lái)需要一段時(shí)間。 個(gè)人比較推薦這種方法,周?chē)聛?lái)說(shuō),用scikit-learn學(xué)習(xí)交流也是主流。
- 第三種是基于R的平臺(tái)來(lái)做機(jī)器學(xué)習(xí)(不包括Spark R),主要平臺(tái)是R studio。由于R是一門(mén)比較老的語(yǔ)言,因此他的數(shù)據(jù)處理和機(jī)器學(xué)習(xí)的API比較豐富,尤其是對(duì)于之前做數(shù)據(jù)分析師的人來(lái)說(shuō)更是熟悉不過(guò)。但是R是一門(mén)相對(duì)封閉的語(yǔ)言,社區(qū)遠(yuǎn)遠(yuǎn)沒(méi)有Python的活躍,而且對(duì)于程序員來(lái)說(shuō), R的那種語(yǔ)法讓人難受。幾年前,一般會(huì)認(rèn)為R的機(jī)器學(xué)習(xí)比Python的好,但是現(xiàn)在Python已經(jīng)將R遠(yuǎn)遠(yuǎn)甩在了后面。因此,除非你之前已經(jīng)很熟悉R語(yǔ)言,否則完全不推薦用R來(lái)研究機(jī)器學(xué)習(xí),BTW,這里沒(méi)有歧視R的意思。
總之,如果你想研究學(xué)習(xí)機(jī)器學(xué)習(xí),并且沒(méi)有特殊的R背景,scikit-learn是你的***。當(dāng)然,有人會(huì)說(shuō),我喜歡自己去一點(diǎn)點(diǎn)的實(shí)現(xiàn)機(jī)器學(xué)習(xí)的算法,不喜歡直接調(diào)用類(lèi)庫(kù),這樣不行嗎? 當(dāng)然,這樣肯定是非常不錯(cuò)的,并且對(duì)加深各個(gè)算法理解很有好處。只是這樣比較的花時(shí)間,如果你和我一樣時(shí)間不太多的話(huà),還是直接調(diào)用API來(lái)研究數(shù)據(jù)比較直接。