為什麼有些公司在機器學習業務方面傾向使用R+Hadoop方案?
由於他們在不懂R和Hadoop的特性應用場景的環境下,恰好抓到了一根免費,開源的稻草。
R:
R的應用場景不在於無與倫比的統計學習本領,而在於布局化數據下無與倫比的單位代碼產出量。神經網路,決定計劃樹等基於布局化數據的演算法一行代碼搞定,預測又只是一行代碼。如許,貿易資料庫(如包括Oracle,Netezza,Teradata,SAPHANA等)提供了R接供詞統計闡發職員舉行高效實行。同樣的,SAS和IBMSPSS也做到了一部分高效實行本領,他們沒有的是R獨佔的巨大cranpackages群。但相似的一點是,R的package群也把它的用戶慣壞了,慣壞到這些人只因此為這是一個SAS大概SPSS的免費版,而不是去通過代碼學習怎樣做呆板學習哪怕一點點核心原理。你要做的,便是高效的最新布局化數據演算法的實行。
最緊張的是,從Hadoop上的數據載入到這些庫,不但包管了數據本身的精確性和布局化,也已經包管了數據模型的第二、第三範式化(CAErwin的第一課),想做任何一個闡發,你手邊的資料庫大略的join就形成了你必要的闡發寬表。想想SQL里sumover的計劃含義:為什麼它要製造數據的冗餘?那肯定是為了BI大概闡發存在的。
Hadoop:
Hadoop的應用場景不在於給統計闡發軟體提供強力的支持,而只是提供了一個散布式數據的泛用免費框架,基於鍵值對(keyvaluepair)高效的對原始非布局化數據舉行存儲。
傳統方法下目測可以做到對連續型數值、分離型數值、字元串、大型字元串BLOB、地理信息(二維點,多邊形)的存儲,Hadoop相稱於直接把很多成果擴展:比如Hive作為一個根本東西,直接提供了更遍及的數據範例存儲方案:數組(array),布局體(struct),鍵值對(map)等。
業務場景:我存儲一篇文章不再必要一坨筆墨灌進去,先做NLP分析,然後形成(詞,詞性)的元組,再組生長數組(Array)即可方便的存儲、闡發,以及利用內置UDF、自寫UDF對巨大布局行轉列,提取信息。(固然,將NLP分析本身整合在UDF乃至演算法中都是可行的,如PySpark)
------------------------
*2014.8改造闡明:
要是你至今以為非布局化數據,鍵值對是一種矯飾見解,我就換一個至簡的說法:一個只有兩列的數據表。兩列的mn*2和多列m*n數據表是可以在肯定加工價格下互轉的。這種數據布局被大量應用於Java,C++,Python乃至JavaScript中,當你望見雷同Hashmap,Hashtable,dict,map等字眼,那便是這貨沒跑了:顛末計劃,用於存儲的鍵(key)被散列後決定了它可以或許被勻稱地散布式存儲,值(value)是鍵的跟隨,隨著鍵被存儲。
對付非布局化數據而言,元數據和數據不像方表,極其容易抽象出來(無非便是列名和方表的內容)。初看一個半布局化的Json/XML,元數據出如今鍵(key)中,數據出如今值(value)中,容易明白。但在分析其他範例數據,(如網路日記Url),鍵里的所謂元數據才是要闡發的東西(一個用戶重複的利用price=xxx做查問條件,闡明代價敏感,有大概xxx取了很多多少值乃至全部大概值,key卻很少,大概只有price和brand;此時用戶舉動模式出如今key里了。)
------------------------
布局化和非布局化資料庫連合的R+Hadoop看起來很美,實則困難重重。我的見解是,任何一家在數據闡發範疇(文本發掘臨時除外,來由在業務場景里形貌過)決定以一個妥當的態度涉足的企業,都無一例外的基於數據強同等性的思量,選擇傳統的布局化資料庫作為後續布局化闡發的依託——哪怕他們是收費的。要是風俗代碼開闢,Hadoop+python本身做開真箇數據處理懲罰,而後利用基於java的Mahout是一個很天然的選擇:其提供的矩陣謀略(SVD),迭代式聚類演算法(如Kmeans),基於圖的迭代模型(一個例子是PageRank演算法,值中存的也是Key),以及集成決定計劃樹等模型,在散布式場景下是瓜熟蒂落完成的,而R則會像一個跟隨,很難找到它的應用場景。一樣具有較高編碼服從的Python可以越發機動、精美(縮進的意義上)的承繼mrjob類完成相應成果,在數據實行性探索這一步,matplotlib產出報告恐怕是不如R+knitr+ggplot2更能媚諂老闆,但一旦必要階段性的測試,Python這種膠水語言大概一步到位的利用Java開闢顯得更接地氣,更容易落地。
(關於落地性,再小小吐槽一下R在Windows和Linux兩個平台下可以或許利用的包範疇是差別的,尤其是利用Rcpp大概並行包的時間。Python和Java則不常見到這種題目)
R+Hadoop的幻覺:
不管什麼和Hadoop連合,都喜好以wordcount這種典範的鍵值對開始。究竟上R可以做這件事,但因此為R做的無與倫比,就有點進入誤區。還是那句R的美在於布局化數據下無與倫比的單位代碼產出量。一旦你發明你作為專註於數據的闡發師,同時也是一個並不骨灰的代碼開闢者,開始用R操縱列表和數據布局,開始用R重寫Mapper和Reducer,你就會孕育產生一個疑問:
為嘛不學Java、Python?這種闡發「不傳統」,就算你不想學吧,為嘛不找懂它們的人來干?
Python基於鍵值對存儲,也具有相稱高的單位代碼產出量,也有很多科學謀略包。從這個意義上你可以做出一個白箱,單機縮水版的mahout,並且得當處理懲罰有增量演算法的大數據學習(看看NumPy,SciPy,)。一樣免費。
數據發掘的幻覺:
數據發掘是什麼,很難嗎?
廣義的數據發掘,包括數據闡發和呆板學習,只說最核心的數學見解的話,預計就幾句話;恰好R的簡便性也是能用幾句話做完這幾句話的:
0數據洗濯,標準化。和1-4,明白真實天下是相輔相成的
1開始學的數學本領是空間分析:LL",PCA,SVD,一樣平常回歸以及L2/L0處罰變種;從資訊理論角度講信息流壓縮(著名如LZ及變種LZO);SVM用到的RBF也算基提取本領。
2再學最優化演算法:L1處罰回歸,SVM(利用的Newton-Raphson/Gauss-Newton/Levenberg-Marquadt(還是1的內容!);MonteCarloMarkovChain
3數據布局:決定計劃樹(列表類),詞頻統計(鍵值對大概字典類),FP-growth(一個樹的加強版)。學到這,所謂「貝葉斯」底子就不克不及叫演算法,只能叫一個無處不在的引導頭腦。
4模型集成:Adaboost,神經網路,bootstrap。集成時,權重本領和處罰本領我的明白是不可分裂。但這個頭腦對要領,對模型參數都能集成,大雜燴。1個超等精妙的模型不如200個精良明白了題目性子的土鱉模型更實用。
任何一個聽起來很裝逼的演算法,逃不過被分析成這4類要領組合的運氣。參數調優這種不提要挈領的題目,確實必要結適時間本錢人力本錢看(研究者,門生,碼農的本錢和投入量完全不一樣)
可以看到,大數據闡發的瓶頸在哪?
第0步,和曾經的大Boss討論過,傳統行業數據堆棧實行最少還能打10年,而"實體-干係"見解和"鍵-值"見解這兩種抽象最少還能打30年,數據的構造,過濾,元數據維護都是數據孕育產生代價的必經之路,這方面的事變很枯燥但是很底子,大數據和傳統數據都必要;
第1步是最根本最緊張的闡發本領,也最容易在大數據語境下導致單機無法闡發的億階希罕大矩陣孕育產生:例1,用戶User對商品SKU的購買記錄;例2,在特定的經緯度,特定的時間,特定的用戶產生了舉措;這兩個例子是典範的「查問大略闡發難,匯總還不如不匯總」的環境,必須要有散布式希罕矩陣處理懲罰技能;
第2步,序貫MCMC的串列性可以通過並行集成要領模仿,但是收斂性還仍舊較低,必要暴力並行堆FLOPS;對應的,由於SVM/Lasso都有增量演算法、散布式演算法方案,核心頭腦在於「天下的真實,模型的本質,都是希罕的」,鎖少量資源,散布式地更新模型係數大概是梯度,這些演算法在理論上得到突破後,每每依賴闡髮型資料庫大概大數據平台機動的並發調理,機動的行列殽雜存儲模式,這一點是單機、小集群、傳統資料庫難以企及的;
第3、4步,這裡固然舉了很大略的例子,但這些是在數學模型和數據模型上是最沒有開闢壓力的,必要體貼的只是資深步伐員的功底了。舉例闡明,文本發掘(NLP)統計完詞頻你還是得會空間里做PCA(大概其他情勢的大矩陣加工);要是不然,只引入HMM模型和底子字典樹的話,學習本錢就只有學習貝葉斯理論了,並且仍舊可以高效並行的辦理NLP題目,有興趣的可以參考Viterbi演算法和CRF演算法。
大數據的幻覺:存儲和謀略的辯論
大數據處理懲罰,多大算大?像我說的,在3,4步出來的數據,原始數據很大,加工匯總完了很小,大概處理懲罰起來是高度獨立的。散布式存儲不影響闡發,說是大數據,著實和小數據處理懲罰沒差別。
必要隨時互換資源的聚類,回歸,SVD,PCA,QR,LU等干係到矩陣分析的謀略乃至是高效訪問,更進一步另有熱數據在內存上而不是物理存儲上的多次迭代,這才是大數據真正的挑釁。
那些有監督的分類樹,把數據集切成1000份並且有冗餘的給500台呆板每台3-5份數據末了得到集成的分類結果,我很難稱其為「大數據謀略技能」,它的本質和挖礦機每秒能做無數個高度同質化的hash謀略一樣,不必要資源互換,不必要大量通訊,它只是「小數據+獨立運算後直接可以或許整合結果」的範疇內打轉。
------------------------
*2014.8改造闡明:
數據在物理存儲、內存、乃至顯存的原地迭代會帶來數據重散布;在傳統數倉範疇數據,重散布著實是對將來服從進步預期的妥協,且內里含有比較多對傳統業務穩固命據架構的明白。
大數據期間明顯不存在什麼數據堆棧ER模型穩固性,不知道大家有沒有這種體驗:一個新需求,一個全新的天南地北的研究性題目的場景下,就能建個新庫來舉行探索與數據加機靈理,數據發掘。各不相謀,實行容易,落地與整合困難。——這個環境下要是要頻繁走物理存儲的話,基於key的重新散布會讓數據像煮沸的一鍋粥大量佔用網路與IO寫入帶寬,與傳統資料庫性能的巨大邊界是無法迴避的題目。因此在這個場景下,Spark、Storm、GPU謀略火起來,如Scala、Clojure、Python等含有FP見解的語言走得越來越靠近開闢工程師的視線,較高級的封裝東西如圖模型謀略的GraphSQL等組件也浮出水面。並且說句實話,Map(映射)和Reduce(規約)在這些語言中,已經是老的失了很多多少年牙的見解了。
(FP:FunctionalProgramming我攔截翻譯成函數式編程,這明顯是泛函編程)
------------------------
大數據見解引入這件事兒是大炮打蚊子——內存內的闡發和數據探索,顯現(單節點):
*從數據記錄條數講:
百萬級,R的上限;
千萬級-億級,SAS的上限;
千萬級,Python的上限;
*我的利用經歷,從數據佔用內存的服從講:載入400M數據會使得
Python(Numpy列存)佔用內存500M
R(我審慎推測是行存列存和二維表三樣都存一份)載入占內存2G
SAS(行存)佔用600M,顛末表級壓縮(依然是行存)150M
*後續的原始處理懲罰
尤其是字元串操縱這種數據洗濯,R險些不克不及做,奪目shell及regexp的人又做的太容易。
若想用R,這就必要你輸入到R的數據險些就能直接開始跑闡發了。若不信邪,我保舉你用readLines加上strsplit來操縱讀入R的文件,看看他數據洗濯的服從和read.delim,和SASprocimport以及Python的withas語法相差多少。
*顯現方案:
只要數據量低於剛才提到的限度,R又提供了最好的顯現方案,由於「顯現方案是專用而非泛用」的:
a.Hadley最聞名的R包之一ggplot2將來會引入SVG等可交互元素。一個具有d3.js可視化特性的畫圖包還不讓你震驚嗎?
b.百度echarts團隊項目被taiyun包裝成recharts放在了github上
c.已經參加RStudio的R統計達人YihuiXie的作品knitr,可以或許利用markdown語法動態將數據發掘結果,圖片,視頻天生打包放進html大概pdf文檔。
說說敵手:
a.R要比Python現有的可視化包(以matplotlib和pygame為主)更友愛,更易於操縱。
b.固然讓從來沒打仗過前真箇人私家迷戀在用Chrome即可調試的JavaScript內里不太科學,但我愛不釋手,並且其核心的顯現方法確實將來會參加R。
c.Java魄力魄力的Processing,無縫調用java庫,封裝大量java圖形函數、視頻相干API、滑鼠相應API,可以導出javaapplet或port成js代碼;搞大數據的人肯定熟習java開闢,可以險些0本錢又高效快速的利用它。
這幾種東西確實各有千秋,我個人私家無法棄取,但平心而論,R是學習門檻、編碼服從和產出結果同時最風雅的(個人私家經歷緣故起因無法對SASVA,Tableau,Flex或更一樣平常的BI顯現東西置評,其受眾由於軟體本錢,落地性不敷等緣故起因,我缺乏利用它們的經歷,它們也缺乏對我的吸引力)
歸納下我的明白,R的產出報告雷同html+javascript+CSS一樣,是得當輕量闡發,輕量顯現的。
大數據干這件事兒是正道——非布局化大數據批量大概迭代處理懲罰:
你的演算法已經走到了「萬事俱備,只差跑全量」如許一個敵手中的數據很相識的地步了。Wiki對RevolutionAnalytics的先容講:Rdidn"tnativelyhandledatasetslargerthanmainmemory,這麼機動小巧的東西做個抽樣數據闡發明顯是很好的。
非布局化大數據應用的場景只能是:
-你很懂數據散布的細節(大概是項目經歷,大概是R上已經做過抽樣探索)
-題目得當的演算法你明白於胸;增量演算法存在;暴力並行謀略(矩陣謀略,圖迭代)沒題目
-你以為把雷同Mahout謀略的步調顛末代碼包裝交付給R來做沒題目
-你完全不care互動式探索
這是你必要的R應用場景么?大概換一種說法,這種應用場景R有什麼上風?調用編譯好的cpp庫,fortran庫是R發揮上風的地方嗎?要知道演算法服從排名上RjavaC++。演算法月內要上線,本身看著辦。
說下前鄙team(一個不是專業做數據發掘的數據部分)的經歷:
講了半天R+Hadoop,不上Mahout,任意搞搞RSnow,準備買SAS。
由於我會SAS(少量用Macro,沒用過矩陣,由於沒須要)和R(沒有學習本錢),Python的並行包pp利用中,思量mahout。
更新:當大數據平台用戶不饜足於存儲,大略加工以及成型演算法實行,也開始存眷最小查問、互動式探索服從了,諸如Spark的內存辦理方案將會更符合。
現team是一個同事至少是碩士(統計/金融/謀略機),專做金融行業數據發掘的小團隊。本領和業務場景可以供參考。
*SAS本領包圍面95%(具備核心代價的數據在辦事器上可以或許處理懲罰的量很少高出上億,主推SAS)
*Python和R包圍面都在70%+
*Hadoop/大數據見解淡:客戶有充足的Teradata、Oracle、SAS辦事器
*Hive/Spark:Hive做幫助、機動倉儲,PySpark作為一個可以預期、穩固的數據發掘平台的接點
結束語:
趁便也給數學系、統計系的數據闡發師,以及他們的領導們提示一句:要是員工A有員工B沒有的代碼開闢本領,R又完全替員工B把數學的事變做完了,形成了依賴,那員工B存在的意義是什麼?誇大數學理論這麼一點點上風也都不復存在了。
呆板學習演算法在差別的階段得當利用差別的東西,研究和利用接不上也就算了,千萬別連東西得當的環境都不懂,作為互聯網從業者,這就太盲從了。
精英的研究者是本身做開闢的——這話也可以這麼說,精英的開闢者們本身做研究。每一個模型都不美滿,何況新題目湧現的越來越快,現存的模型很大概不饜足你的闡發必要。以是才要一邊踏實理論,以最少的實行嗅到最得當題目的演算法,一邊以開放的心態採取和明白新技能的應用場景,深入生長數據發掘研究,從代碼優化改革(盜窟)走向技能原創。
------------------------
*2014.8改造闡明:
------------------------
*2015.11改造闡明:
2年左右的時間裡並沒有新技能的湧現,但是有成熟技能的沉澱以及輪子化。我之前以為的Spark只管分發數據,啟動Python跑腳本(跑CUDAC步伐大概別的什麼東西要領大同小異)的這種我一開始以為著實有些不倫不類,尋求速率的實行模式,如今竟然已經繞過了Hadoop自成一種模式了。並且,Spark的成果進一步從分發數據退化到了分發演算法參數?!(有個例外,Spark跑圖模型演算法無法僅僅分發參數)
這險些已經闡明白數據科學只要快。險些無法容忍I/O,委曲容忍大量的散布式內存數據互換,要是拿到GPU上去,數據頻繁的通過PCIE互換,早晚也是要被否。
反過來看我這篇答覆著實很可笑,2年的時間就可以或許讓當時不少我以為存在迷霧的東西變得清楚很多。R如今的定位是什麼?科學謀略範疇好玩的玩具Julia,Lua滿地都是,樂意砸時間的人隨時隨地都能用輪子搞出東西來。——但你別忘了很多提供輪子的大神是寫著C++給你們造玩具的。
玩具對技能模式變革的作用便是拉動性的,能不克不及拉動那要看老闆玩心重不重。
離開好玩上升到企業戰略生長層面,大量草根首創的CTO帶著最守舊的方案和最守舊的那一批開闢者受到動蕩的新業務打擊,舊有模式其不經濟性漸漸被發明,並且有了模塊化的更換方案。身邊有很多並不大神,但接地氣兒的開闢者。這內里,很難有人Python/JavaScript/GoLang三者都一竅不通。
尋求經濟性對技能模式變革的作用是推動性的。大家都在沉澱,玩票都在失去空間。不推就去世。
參考內容:
推薦閱讀:
※機器學習之數據預處理簡介
※cs231n assignment1
※如何六個月內學會深度學習
※為什麼我們需要傳統方法?
※邏輯回歸(二分類)與極大似然