
基于Spark的機器學(xué)習(xí)經(jīng)驗
如何基于spark做機器學(xué)習(xí)
Spark發(fā)展到1.5版本,算是全平臺了,實時批計算,批處理,算法庫,SQL,hadoop能做的,基本他都能做,而且做的比Hadoop好。
當然,這里我要提及的是,Spark依然是Hadoop生態(tài)圈的一員,他替換的也僅僅是MR的計算模型而已。資源調(diào)度依賴于Yarn,存儲則依賴于HDFS,是hadoop生態(tài)圈的一顆新星(其實算是老星啦)。
我 之前寫文章說,Spark-Shell是個偉大的創(chuàng)新,加上牛逼的Scala語言,寫spark程序就和寫普通的shell腳本(或者類似python程序)一樣容易。問題是,原來的shell,python只能在單機工作,現(xiàn)在你寫的每一行代碼,都被放到了一個幾百臺,幾千臺的規(guī)模上去做了。
以前的統(tǒng)計/機器學(xué)習(xí)依賴于數(shù)據(jù)抽樣,抽樣從統(tǒng)計的角度來看,如果足夠隨機,其實可以很精準的反應(yīng)全集的結(jié)果,但事實上往往很難做好隨機,所以通常做出來也會很不準?,F(xiàn)在大數(shù)據(jù)解決了這個問題,但不是通過優(yōu)化抽樣的隨機來解決,而是通過全量數(shù)據(jù)來解決。
要解決全量的就需要有強大的處理能力,spark首先具備強大的處理能力,其次SparkShell帶來了傳說中的即席查詢。做算法的工程師,以前經(jīng)常是在 小數(shù)據(jù)集上跑個單機,然后看效果不錯,一到全量上,就歇菜了,和單機效果很不一樣。雖然是小數(shù)據(jù),但是在你的筆記本上跑你幾個小時,也是很正常的。
但 是有了spark后,不一樣了,尤其是有了spark-shell。 我后面的兩個例子,都完全是在spark-shell上寫就的。邊寫代碼,邊運行,邊看結(jié)果。我研究的CSDN幾百萬博文的時候,就是直接拿全量數(shù)據(jù)跑,直接看效果。spark 抽樣也很方便,一個sample函數(shù),你想要多少就多少。
幾 十個G的博文數(shù)據(jù),count一下也就十幾秒,cache了之后幾秒就count完了。所以說,如果docker顛覆了部署,那么spark-shell也應(yīng)該顛覆算法工程師的日常工作。我現(xiàn)在會和一個百度的朋友比,哇,最近我們spark集群內(nèi)存有9個T了,對方鄙視的看我一眼:百T的飄過…..
目前Spark已經(jīng)提供的算法,我用的最多的是貝葉斯,word2vec,線性回歸等。所以這里,作為算法工程師,或者分析師,一定要學(xué)會用spark-shell。
基于Spark做新詞發(fā)現(xiàn)
新詞發(fā)現(xiàn)是一個非常有意思的領(lǐng)域,用途非常多。譬如可以構(gòu)建垂直領(lǐng)域詞庫,自動發(fā)現(xiàn)新熱門詞匯。詞庫的重要性我不用強調(diào)了。基于Spark強大的計算能力,我直接對200萬+的博文進行了分析,得到大概八萬詞,包含中文、英文、中英文混合詞。
通過凝固度、自由度、詞頻、idf以及重合子串(比如 c1c2c3..cN c2c3..cN-1 這種形態(tài)的,我們認為是重合子串,如果詞頻一樣,則都過濾掉,否則留詞頻高的)五個維度進行閾值設(shè)置和過濾。
事實上,中間結(jié)果可以到幾百億,一個不小心就可以把Spark跑死,但是也在這個過程中慢慢對Spark有了更深的理解。 最終效果還是不錯的,現(xiàn)在它已經(jīng)作為我們的基礎(chǔ)詞庫了。
基 本上就是用spark計算出詞的五個屬性: 凝固度、自由度、詞頻、idf以及重合子串。算法自然是參考論文的,凝固度、自由度的概念來源于這里重合子串能修正一類的問題,但我感觸比較深的是,通常某篇論文只會在一個視角去focus某件事情,所以你需要參考多篇,從不同角度去理解這件事情的解決方式,最后通過實驗綜合,得到一個更好解決方案。
我參考了兩篇論文,比如凝固度,自由度是出自一篇論文,而重合子串則來自另外一篇論文,然后自己觀察實際數(shù)據(jù),添加了很多規(guī)則,才得到最后的結(jié)果。
一說到算法,大概很多人心里就是想著,恩,我把數(shù)據(jù)轉(zhuǎn)化為算法需要的格式,然后丟給現(xiàn)成的算法跑,跑著就出結(jié)果,或者出模型,然后反復(fù)嘗試,直到得到你認為 能接受的或者最優(yōu)的結(jié)果。我一開始也是這么想的,可是如果你真的做這件事情,就發(fā)現(xiàn)完全不是那樣子啊,需要注意的細節(jié)太多了。
新詞發(fā)現(xiàn)沒有現(xiàn)成的工具包,所以完全自己寫了。第一步,你要獲取語料。這容易,基于現(xiàn)有的平臺,我從我們資源中心挑出了200萬篇文章id,然后根據(jù)id到數(shù)據(jù)網(wǎng)關(guān)獲取title,body字段。這個基于現(xiàn)有的平臺,也就一個SQL + 幾行Scala代碼就搞定的事情。
SQL 其實就是用Hive 生成一個200萬博文id列表。Scala代碼也就幾行。
因為我們的新詞發(fā)現(xiàn)是沒有詞典的,需要枚舉所有組合,然后通過一定的規(guī)則判定這是不是一個詞。比如 ‘我是天才’,就這四個字, 組合有,‘我是’,‘我是天’,‘我是天才’,‘是天’,‘是天才’,‘天才’ 。
你想想,200萬篇文章,這種組合得多夸張,問題是你還要接著給這些組合做計算呢。這個算法可沒告訴你怎么處理的,你只能自己去想辦法??吹搅耍嬲阕鏊惴ǖ倪^程中,不只是實現(xiàn),你需要面對的問題特別多,我是怎么做的呢?
將所有html標簽替換成空格。
通過小空格將一個大文本切分成無數(shù)小文本塊。
我們認為一個詞的長度最長不能超過5個字。
對每個小文本塊再抽取出中文,中英文,英文。
將一些特殊字符,類似“?。ぁǎ?{}【】的呀啊阿哎吧和與兮呃唄咚咦喏啐喔唷嗬嗯噯你們我他她,這是由于” 這些不可能成詞的字符先去掉。處理的過程中,你可能需要寫中文,英文,中英文的抽取方法。
通過上面的五個處理,你計算規(guī)模會小非常多。如果不這樣處理,估計再大內(nèi)存都能讓你歇菜。接著就是按論文里的規(guī)則做計算了,比如算詞的凝固度,算重合子串。 這里面還會遇到很多性能,或者內(nèi)存的坑,比如Spark里的groupByKey,reduceByKey。我一開始省事,用了groupByKey,歇 菜了,內(nèi)存直接爆了,為啥,你要去研究groupByKey到底是怎么實現(xiàn)的,一個詞出現(xiàn)幾十萬次,幾百萬次都很正常啊,groupByKey受不了這種 情況。所以你得用reduceByKey。
在spark 1.5里,已經(jīng)支持動態(tài)調(diào)整worker數(shù)目了。我之前做這個的時候,會開的比較大,如果集群規(guī)模比較小,可能會影響別人,而且用完要趕緊釋放,但釋放了重新再起,也還是很麻煩的,現(xiàn)在好很多了。
很好,實現(xiàn)了算法后得到了結(jié)果,可人家沒告訴你,他貼出來的結(jié)果都是好看的,那是因為他是按頻次排的,但如果你拉到最后看,結(jié)果就不太好看了。這個時候你就需要觀察數(shù)據(jù)了,然后提出新的規(guī)則,比如最后得到的中文詞結(jié)果,我用了一些簡單規(guī)則過濾下,都是哪些呢?
凡是詞里面包含‘或’的,或者’就’的或者上面羅列的,我都認為這個詞是沒有意義的,經(jīng)過這個簡單規(guī)則一過濾,效果好非常多,很多沒什么意義的生活詞,或者不成詞的詞就被去掉了。中文,英文,中英文混合,我都加了很多這種規(guī)則,最終才過濾出了八萬計算機詞匯。
我 在做上面的方案時,基本上就是在spark-shell中完成的。其實有點像ngram,就是對所有字符串做所有枚舉,只是會限制最終成詞的長度。我這里 中文是最長五個字,英文是四個字,中英文一塊的是五個字,接著要算出每個詞左右連接字。
重合子串,是這個算法的一個比較大的問題,比如 c1c2c3…cN c2c3…cN-1,因為是從統(tǒng)計的方案做的,c1c2c3…cN c2c3…cN-1 他們兩算出來的分數(shù)可能就是一樣的,所以如果我們發(fā)現(xiàn)他們的分值或者出現(xiàn)頻率是一樣的,就可以直接排除掉了。
基于Spark做智能問答
其實我做的智能問答算不上智能問答,但是內(nèi)部一開始這么叫的,所以也就這么順帶叫下來了。 其實做的事情非常簡單:
比較兩個標題的相似度
如果我們能知道兩個句子說的其實是一件事情,那么就能打通各產(chǎn)品的互通鴻溝了。之前試水的項目是打通問答到博客的通道。具體效果大家可以看看CSDN的問答產(chǎn)品,里面的機器人,背后用的算法就是這套。
當用戶問一個問題,機器人就會到博客里去找有沒有這個問題的答案,或者有沒有可以做參考的。 比較神奇的是,之前有個在問答活躍的人也特別喜歡貼博客鏈接作為回答,我們對比了機器人和他的結(jié)果,發(fā)現(xiàn)機器人和他貼的差不多。
對于擁有內(nèi)容的網(wǎng)站來說,這個技術(shù)還是非常重要的,比如CSDN,有論壇,博客,資訊,雜志等等,都是內(nèi)容的載體。用戶在問答頻道里問的一個問題,其實在博客,在論壇早就已經(jīng)有答案了。具體做法是透過word2vec解決一意多詞的問題。接著將詞轉(zhuǎn)換為句子向量。這樣任何一個問題都可以轉(zhuǎn)換為一個向量。同理任何一篇博文的標題也可以轉(zhuǎn)化為一個向量。
word2vec,采用的數(shù)據(jù)來源,我是用的搜索引擎的數(shù)據(jù)。大部分內(nèi)容類的網(wǎng)站,他的PV應(yīng)該有相當一部分來自搜索引擎,其實搜索引擎對這些網(wǎng)站來說,就是一個大的寶藏。因為搜索的query串,都是用戶遇到的問題,然后指向到解決這些問題的內(nèi)容上。
內(nèi)容上,所以我直接拿用戶的query作為word2vec的語料,得到一些常用的提問詞,每個詞用一個50維度的向量表示。當然,我們不可能真的讓一個問 題和幾百萬內(nèi)容直接做比較,一個簡單有效的方式是,先通過搜索引擎去搜,然后將搜索得到top100結(jié)果做向量計算得到新的得分。 基本相似度大于0.9 的可以算作答案。大于0.7的就可以作為參考答案了。站內(nèi)搜索服務(wù)應(yīng)該是標配了,所以對大部分網(wǎng)站應(yīng)該不是問題。
對了,這里有個問題是:word2vec計算出來的是用一個稠密的定長向量表示詞,我的做法是直接把一個句子的里的詞的向量按位做加法,重新得到一個新的向量作為句子的向量。當然,這種方式也是有缺陷,也就是句子越長,信息損耗越大。但是做這種標題性質(zhì)的相似度,效果出奇的好,那種句子里很多詞匯不相同的,它都能算出他們很相似來,這是因為word2vec可以算出不同詞匯之間關(guān)系。
好了,具體的內(nèi)容就分享到這里。
總結(jié)
下面是我的幾個觀點:
作為數(shù)據(jù)分析師,算法工程師,請好好利用spark-shell。 Spark社區(qū)為了滿足數(shù)據(jù)分析師,算法工程師,其實也做了非常多的工作,包括Python, R語言的支持。15年社區(qū)努力做的DataFrame其實就是從R里借鑒過來的,也方便R數(shù)據(jù)科學(xué)家方便的遷移過來。我覺得大家都應(yīng)該與時俱進,不要只玩 單機了。
課程Q&A
Q: 如何從0開始系統(tǒng)學(xué)習(xí)spark,最后轉(zhuǎn)行?
A: 學(xué)會scala就行,scala是一門具有學(xué)院派氣息的語言,你可以把它寫的像python,ruby那樣,也可以寫的想java那樣方方正正,也可以學(xué)習(xí)python,spark支持python但是可能有些功能用不了,用了一天的時間把Scala的官方教程看了,基本就能上手了。
Q:建議不做RAID的原因是什么?
A: 比如我例子提到的默認HDFS的所有數(shù)據(jù)都會存三份,可以保證數(shù)據(jù)位于不同的服務(wù)器上,不同的磁盤上,所以無需RAID。
Q:很多沒什么意義的生活詞,或者不成詞的詞,這些詞是怎樣得到的?也是分析出來的?
A: 因為用的都是統(tǒng)計的一些方式,所以肯定會有很多無意義的詞匯,假設(shè)我們現(xiàn)在得到的詞匯幾何是A,接著我去爬了一些新聞和生活的類的博客,然后用程序去跑一遍得到一批詞匯B,然后A-B 就能得到一拼更純正的計算機詞匯。
Q:內(nèi)存要調(diào)到多大才能不會爆掉?是不是有什么比例?
A: 你不管調(diào)到多大,如果用的不好 也都有可能,groupByKey這個會有很大的內(nèi)存問題,他形成的結(jié)構(gòu)式 key-> value1,value2,value3……valuen,這種是非常消耗存儲空間的額,大家使用spark的時候,序列化最好使用kyro,性能確實 好太多,一個worker 會同時配置可以使用的內(nèi)存和cpu,這個時候一定要搭配好。比如你允許work使用5個cpu,那內(nèi)存最好能配到10G,如果內(nèi)存過小,你的cpu會大量 浪費在GC上,我一般是單個worker 12G內(nèi)存 ,可使用4核。
Q:直接把一個句子的里的詞的向量按位做加法,這是如何加?能舉個例子不?
A:比如 考慮一個三維向量: A[1,3,5] B[1,3,7],現(xiàn)在有個句子 是AB兩個詞組成,則對應(yīng)的向量為A+B=[2,6,12]
Q:還有中文分詞是用的什么方法?可否分享代碼不啊?
A:這里是無監(jiān)督分詞,所以不用中文分詞,按維度疊加,才能保證都是相同長度的向量,而且中文分詞這塊,我推薦我一個同事的 ansj分詞,還是做的不錯的。
Q:一些分詞方法具有新詞發(fā)現(xiàn)的功能,比如crf,樓主是比較過效果么?而且我記得matrix67這個算法復(fù)雜度還是很高的?
A: matrix67 這個算法復(fù)雜度還是非常高的,你實際操作就會發(fā)現(xiàn)計算量,內(nèi)存使用量都很大,crf等據(jù)我所知,還都是需要依賴詞表的,matrix67的這個方式,完全不需要任何先驗的東西。
Q:為什么一個詞要用50維度表示? 這能舉個例子不? 這里不太明白。
A: 理論上維度越長越好,我當時是隨意試了一個值。發(fā)現(xiàn)效果其實已經(jīng)可以了,這是一個可以調(diào)整的值,比如你可以分別生成50,150,300維度的,然后試試那個效果好。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03