
內(nèi)容來(lái)源:2017年11月4日,Pivotal Greenplum Madlib研發(fā)工程師梅靖怡在“Greenplum和機(jī)器 學(xué)習(xí)客戶研討會(huì)”進(jìn)行《Machine Learning on Greenplum—MADlib簡(jiǎn)介與應(yīng)用實(shí)例》演講分享。IT 大咖說(shuō)(ID:itdakashuo)作為獨(dú)家視頻合作方,經(jīng)主辦方和講者審閱授權(quán)發(fā)布。
閱讀字?jǐn)?shù):4809?|6分鐘閱讀
獲取嘉賓完整演講視頻及PPT,請(qǐng)點(diǎn)擊:http://t.cn/Ewvhaca
摘要
Apache MADlib是Pivotal與UCBerkeley合作的一個(gè)開源機(jī)器學(xué)習(xí)庫(kù),提供了精確的數(shù)據(jù)并行實(shí)現(xiàn)、統(tǒng)計(jì)和機(jī)器學(xué)習(xí)方法對(duì)結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行分析。MADlib提供了豐富的分析模型,包括回歸分析,決策樹,隨機(jī)森林,貝葉斯分類,向量機(jī),風(fēng)險(xiǎn)模型,KMEAN聚集,文本挖掘,數(shù)據(jù)校驗(yàn)等。MADlib支持Greenplum,PostgreSQL 以及 Apache HAWQ, In-Database Analytics的特性使其大大擴(kuò)展了數(shù)據(jù)庫(kù)的分析功能,充分利用MPP架構(gòu)使其能夠快速處理海量數(shù)據(jù)集。本主題將為大家介紹MADlib的基本架構(gòu),工作原理及特性,分享MADlib在互聯(lián)網(wǎng),金融,零售等行業(yè)的用戶案例,展望In-Database Machine Learning的廣闊前景。
MADlib簡(jiǎn)介
MADlib是一個(gè)基于SQL的數(shù)據(jù)庫(kù)內(nèi)置的可擴(kuò)展機(jī)的器學(xué)習(xí)庫(kù)。讓我們來(lái)逐一解釋這個(gè)定義。說(shuō)起機(jī)器學(xué)習(xí)庫(kù),同行的朋友應(yīng)該比較熟悉python上的scikit-learn。我們的庫(kù)實(shí)現(xiàn)了類似的功能,但是我們的語(yǔ)法是基于SQL的,也就是說(shuō),你可以用select + function name的方式來(lái)調(diào)用這個(gè)庫(kù)。這就意味著,所有的數(shù)據(jù)調(diào)用和計(jì)算都在Database內(nèi)完成而不需要數(shù)據(jù)的導(dǎo)入導(dǎo)出。由于應(yīng)用在大規(guī)模并行處理的數(shù)據(jù)庫(kù)內(nèi),它的可擴(kuò)展性也非常好,能夠處理較大量級(jí)的數(shù)據(jù)。
我們的整個(gè)項(xiàng)目和代碼是在Apache上開源的,到目前為止,我們已經(jīng)有6個(gè)release, 并且于今年從阿帕奇孵化器畢業(yè),成為apache的頂級(jí)項(xiàng)目。
我們是一個(gè)在大規(guī)模并行處理系統(tǒng)上的可擴(kuò)展應(yīng)用,目前支持PostgreSQL和Pivotal Greenplum。
MADlib具有強(qiáng)大的數(shù)據(jù)分析能力。我們支持大量的機(jī)器學(xué)習(xí),圖形分析和統(tǒng)計(jì)分析算法。
歷史回顧
MADlib創(chuàng)始于2011年,當(dāng)時(shí)屬于EMC/Greenplum,后來(lái)Greenplum變成了pivotal的Greenplum。主要由UC Berkeley的一位學(xué)者,Joe Hellerstein發(fā)起,Stanford, University of Wisconsin-MADISON和University of Florida也有參與。
MAD這個(gè)名字來(lái)源于三個(gè)詞。
M代表Magnetic,有吸引力的,意味著這個(gè)系統(tǒng)能夠吸引很多的用戶和數(shù)據(jù)。傳統(tǒng)的數(shù)據(jù)倉(cāng)庫(kù)對(duì)新數(shù)據(jù)不夠友好,導(dǎo)入的數(shù)據(jù)往往需要非常干凈和完整。然而MADlib可以做到即使在數(shù)據(jù)不夠整齊的情況下,也能幫助數(shù)據(jù)科學(xué)家進(jìn)行一些有意義的計(jì)算和推斷。
A代表Agile,敏捷,意味著這個(gè)系統(tǒng)能夠幫助數(shù)據(jù)科學(xué)家快速有效地處理數(shù)據(jù)。這有賴于在MADlib在數(shù)據(jù)庫(kù)內(nèi)的集成。
D代表Deep,深入。在大規(guī)模并行集成系統(tǒng)上的應(yīng)用使得數(shù)據(jù)科學(xué)家能夠使用完整的大數(shù)據(jù),而不是在單核的內(nèi)存內(nèi)對(duì)數(shù)據(jù)集的子集進(jìn)行分析,從而提高了分析的精準(zhǔn)性。
三個(gè)字母連在一起,mad這個(gè)詞在英語(yǔ)中除了我們所熟知的瘋狂這個(gè)意思,還有一個(gè)意思是“極好的”。我們希望MADlib能給數(shù)據(jù)科學(xué)家們提供一個(gè)極好的機(jī)器學(xué)習(xí)和數(shù)據(jù)分析平臺(tái)。
MADlib用戶
MADlib有非常廣泛的用戶群體。
目前,我們的用戶涉及金融,保險(xiǎn),互聯(lián)網(wǎng),醫(yī)療,媒體,娛樂(lè),汽車,制造等等行業(yè)??梢哉f(shuō)我們提供的機(jī)器學(xué)習(xí)方法能夠覆蓋大部分行業(yè)的需求。
MADlib功能
如上圖所示,這個(gè)列表是目前MADlib所支持的算法。
監(jiān)督學(xué)習(xí),我們支持Neural Network, SVM, regression, decision tree;非監(jiān)督學(xué)習(xí),我們支持clustering,topic modeling等;圖形處理,我們支持apsp, bfs等等。
另外還有時(shí)間序列處理,模型選擇,基本統(tǒng)計(jì)和數(shù)據(jù)類型轉(zhuǎn)換。到目前為止我們支持了超過(guò)50種算法,是一個(gè)復(fù)雜而成熟的數(shù)據(jù)科學(xué)學(xué)習(xí)庫(kù),能夠支持各種復(fù)雜的機(jī)器學(xué)習(xí)場(chǎng)景。
MADlib特性
更好的并行度。我們?cè)谒惴ㄔO(shè)計(jì)階段就充分考慮了與大規(guī)模并行處理系統(tǒng),基于不同的算法,設(shè)計(jì)不同的分布方式來(lái)保證更快的并行處理速度。
更好的可擴(kuò)展性。隨著數(shù)據(jù)量的增長(zhǎng),我們的擴(kuò)展性非常穩(wěn)定。
更高的預(yù)測(cè)精度。處理大數(shù)據(jù)使得更多有效數(shù)據(jù)被利用,從而實(shí)現(xiàn)更加精確的預(yù)測(cè)效果。
我們是Apache ASF上的頂級(jí)開源項(xiàng)目,我們的開發(fā)是在Pivotal的支持下基于Apache community的,與社區(qū)有非常好的互動(dòng)。
MADlib的工作原理
相信很多Greenplum用戶對(duì)這幅圖很熟悉,這是Greenplum的架構(gòu),當(dāng)一個(gè)query進(jìn)來(lái)的時(shí)候,master server會(huì)對(duì)query進(jìn)行處理,按一定規(guī)則把query分配到多個(gè)segment上并行處理,最后的結(jié)果再返回master server。
MADlib就是構(gòu)建在Greenplum這個(gè)架構(gòu)之上的。MADlib通過(guò)定義postgres上的UDA和UDF建立in-database function。當(dāng)我們用sql, r調(diào)用MADlib的時(shí)候,MADlib會(huì)首先進(jìn)行輸入的有效性判斷和數(shù)據(jù)的預(yù)處理,將處理后的query傳給Greenplum, 之后所有的計(jì)算在Greenplum內(nèi)執(zhí)行。
執(zhí)行流程
上圖中是整個(gè)過(guò)程的執(zhí)行流程。
在客戶端,我們可以使用jupyter, zeppelin, psql等等工具連接數(shù)據(jù)庫(kù)并調(diào)用MADlib function,MADlib處理后根據(jù)算法生成多個(gè)query傳入database, 之后Greenplum執(zhí)行query并返回String, String一般是一個(gè)或多個(gè)存放結(jié)果的表。
MADlib Architecture
這是MADlib的基本架構(gòu),我們的user interface就是sql, 代碼的上層主要是python, 會(huì)做一些input validation和pre-processing. 我們調(diào)用plpy來(lái)執(zhí)行查詢。代碼的中間層和底層主要是c++, 我們用c++來(lái)調(diào)用eigen libraray. Eigen是C++里處理代數(shù)和幾何的包。C++也調(diào)用了c的API來(lái)和DB進(jìn)行交流。
示例– PageRank
下面是一個(gè)MADlib使用示例,以pagerank這個(gè)算法為例。
PageRank是一種由搜索引擎根據(jù)網(wǎng)頁(yè)直接相互的超鏈接來(lái)進(jìn)行計(jì)算的技術(shù),是網(wǎng)頁(yè)排名的一個(gè)重要算法,以google創(chuàng)始人Larry Page的名字來(lái)命名。
在MADlib中,計(jì)算一個(gè)圖的pagerank,需要兩個(gè)表格作為輸入數(shù)據(jù),第一個(gè)表格是vertex(節(jié)點(diǎn)),用來(lái)保存節(jié)點(diǎn)的信息,第二個(gè)表是edge(邊),用來(lái)保存節(jié)點(diǎn)指向節(jié)點(diǎn)的情況。使用MADlib調(diào)用pagerank的步驟如下:select MADlib.pagerank(),這里需要幾個(gè)輸入。第一個(gè)輸入就是vertex表,第二個(gè)輸入是vertex id這一欄在該表中的名稱,在示例中的這個(gè)vertex表里,這就是id這一欄。第三個(gè)輸入是edge table這張表的名稱,第四個(gè)輸入,指出邊的起點(diǎn)和終點(diǎn)所對(duì)應(yīng)的欄在表里的名稱,最后一個(gè)輸入是用戶定義的輸出表格,計(jì)算結(jié)果將返回這個(gè)表格。
上圖是計(jì)算結(jié)果,查看pagerank_out這張表格,可以看到每個(gè)節(jié)點(diǎn)的pagerank分?jǐn)?shù)。另外,我們有一個(gè)表格,pagerank_out_summary,存放了收斂迭代的次數(shù),在這個(gè)例子中,計(jì)算迭代了16次之后收斂并返回結(jié)果。
可擴(kuò)展性
MADlib具有良好的可擴(kuò)展性,能夠處理較大量級(jí)的數(shù)據(jù)。以pagerank為例,這張圖顯了隨著邊數(shù)的增加,完成計(jì)算所需要的時(shí)間。我們可以看到,1億個(gè)頂點(diǎn),從6億條邊到50億條邊,運(yùn)行時(shí)間幾乎保持了線性增長(zhǎng)。
這是SVM的Performance
我們可以看到在一億條記錄范圍內(nèi),運(yùn)行時(shí)間也是接近線性的增長(zhǎng)。對(duì)一億條記錄的處理可以在10分鐘內(nèi)完成。
以上就是對(duì)MADlib的初步介紹,相信大家已經(jīng)對(duì)MADlib有了一個(gè)初步的了解。接下來(lái)是兩個(gè)用戶案例。
用戶案例1 -Greenplum + MADlib助力郵件營(yíng)銷
首先介紹一個(gè)下案例的背景。我們的客戶是某大型跨國(guó)多元化傳媒和娛樂(lè)公司,是Greenplum的用戶。
在這個(gè)案例中,他們想要提高郵件營(yíng)銷的精準(zhǔn)度。他們面臨的主要問(wèn)題有:郵件廣告點(diǎn)擊預(yù)測(cè)模型不夠精準(zhǔn),需要更好的模型和營(yíng)銷策略。其次,他們現(xiàn)有的數(shù)據(jù)分析流程比較繁瑣,速度較慢并且有很多手工的步驟,容易出錯(cuò)。在與Pivotal Data Science Team合作之后,我們?yōu)樗麄兲峁┝艘惶捉鉀Q方案。首先,我們充分利用了MADlib的多種功能,簡(jiǎn)化了整個(gè)data pipeline,用MADlib重新建模和預(yù)測(cè),并且實(shí)現(xiàn)了流程的全自動(dòng)化。
這次合作的影響非常顯著,首先,對(duì)于郵件點(diǎn)擊率,我們有了更快,更高效和更精準(zhǔn)的建模和預(yù)測(cè),其次,該客戶一直是Greenplum的用戶,但對(duì)Greenplum內(nèi)建的各種資源并沒(méi)有充分利用,這次合作讓他們看到了in-database analytics的高效和快捷,使得他們實(shí)現(xiàn)了in-Greenplum analytics一體化。
客戶的數(shù)據(jù)源包含了以下信息:user 在mobile 端的購(gòu)買,預(yù)訂,注冊(cè),郵件營(yíng)銷歷史,網(wǎng)頁(yè)瀏覽歷史,地理信息等等,數(shù)據(jù)量是TB級(jí)別,總共的特征超過(guò)1000項(xiàng)。整個(gè)過(guò)程都在Greenplum這個(gè)平臺(tái)上進(jìn)行。建模工具主要是MADlib,以及一些PL/pgSQL。
以下是該客戶當(dāng)時(shí)的數(shù)據(jù)分析工作流程。原始的數(shù)據(jù)都導(dǎo)入并存在Greenplum中。之后,數(shù)據(jù)被導(dǎo)入SAS中,進(jìn)行了數(shù)據(jù)清洗和準(zhǔn)備。再之后數(shù)據(jù)又從SAS中導(dǎo)入了EXCEL,在EXCEL中建模計(jì)算Information Value 和Weight of Evidence, 即信息量和證據(jù)權(quán)重。之后,數(shù)據(jù)被導(dǎo)回SAS,計(jì)算Pairwise Correlation,一種變量相關(guān)性。根據(jù)計(jì)算的結(jié)果,在EXCEL中去除高度相關(guān)的變量。以上步驟都是為了減少變量的數(shù)量,因?yàn)镾AS上并不能很好地處理超過(guò)1000個(gè)的變量。這之后,數(shù)據(jù)被再次導(dǎo)回SAS,在上面進(jìn)行邏輯回歸,最后把分析結(jié)果導(dǎo)回Greenplum。由于SAS能夠處理的數(shù)據(jù)量有限,客戶只能用Sample進(jìn)行建模,所以在最后,數(shù)據(jù)又導(dǎo)回Excel進(jìn)行KS-Score Test, 進(jìn)行Model Validation。KS-Score Test驗(yàn)證的是樣本分布是否能有效代表總體分布,從而驗(yàn)證模型的有效性。經(jīng)過(guò)Validation之后結(jié)果最終被導(dǎo)回Greenplum,手動(dòng)用該模型對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。
從這個(gè)流程中我們能看到一些問(wèn)題:
首先,很明顯的,數(shù)據(jù)在Greenplum, SAS和Excel之間多次導(dǎo)入導(dǎo)出,比較繁瑣,這期間也會(huì)存在數(shù)據(jù)格式轉(zhuǎn)換,數(shù)據(jù)丟失等等問(wèn)題。
其次,我們可以看到,在SAS和Excel之間來(lái)回的好幾個(gè)步驟其實(shí)都是為了降低維度,減少SAS上的變量數(shù),由于許多變量沒(méi)有得到利用,這從一定程度上降低了模型預(yù)測(cè)的準(zhǔn)確度。
最后,由于SAS和EXCEL能處理的數(shù)據(jù)有限,客戶只能用樣本數(shù)據(jù)來(lái)進(jìn)行建模,沒(méi)有充分利用Greenplum里的大數(shù)據(jù),這也影響了建模的精確度。
在與Pivotal Data Science合作之后,我們建立了一個(gè)新的工作流程。
可以看到,所有SAS和EXCEL內(nèi)的步驟都被移除了,整個(gè)流程都在Greenplum內(nèi)完成。在存放好數(shù)據(jù)之后,首先,用MADlib的feature generation來(lái)提取特征,之后運(yùn)調(diào)用不同的MADlib函數(shù),計(jì)算Information Value, pairwise correlation,完成特征選擇。建模階段,直接調(diào)用相關(guān)的邏輯回歸函數(shù)和elastic net,(用elastic net進(jìn)行變量選擇,然后建立邏輯回歸)。驗(yàn)證階段,MADlib提供了很多validation的函數(shù),最后,MADlib函數(shù)可以對(duì)新的data進(jìn)行預(yù)測(cè)。
從數(shù)據(jù)準(zhǔn)備到特征選擇,再到建模,驗(yàn)證和預(yù)測(cè),MADlib提供了所有的相關(guān)函數(shù)。對(duì)比之前的步驟數(shù)量,也從8步變?yōu)榱?步。另一個(gè)明顯的優(yōu)勢(shì)是,這個(gè)模型用到了Greenplum里的所有數(shù)據(jù),并且可以使用更多的feature來(lái)建模。
此次優(yōu)化使得數(shù)據(jù)分析的整個(gè)環(huán)節(jié)效率都大大提高。在生成數(shù)據(jù)階段。原來(lái)的時(shí)間是75分鐘,優(yōu)化后只需要8分鐘,整個(gè)過(guò)程速度提高了9倍。Attribute compilation階段,速度是之前的3倍,并且運(yùn)用了更多的495個(gè)attribute。在計(jì)算Information Value階段,平均每個(gè)變量的計(jì)算速度是之前的13.7倍。建模階段,之前一次迭代需要大約30分鐘,并且只能運(yùn)用小于50個(gè)變量,而在優(yōu)化之后,平均一次迭代只需要1.86分鐘,并且可以用376個(gè)變量進(jìn)行回歸分析,平均每次迭代速度是原來(lái)的16倍??梢钥吹?,整個(gè)數(shù)據(jù)分析流程得到了非常顯著的提速。
這是建模的結(jié)果。
原始模型的準(zhǔn)確率是99.7%,但是true positive rate是0%。也就是說(shuō),原始的模型只能很好地預(yù)測(cè)不會(huì)點(diǎn)擊郵件的用戶,而沒(méi)有把握預(yù)測(cè)會(huì)點(diǎn)擊郵件的用戶。改良后的模型,準(zhǔn)確率是62.8%,看上去好像降低了,但true positive rate是66%,這意味著,該模型有66%的把握預(yù)測(cè)出會(huì)點(diǎn)擊郵件的用戶,而這些用戶正是給公司帶來(lái)核心價(jià)值的用戶群體。
用戶案例2-基于API日志的金融產(chǎn)品用戶分析
這個(gè)案例的用戶是某大型跨國(guó)金融服務(wù)公司。他們的case主要是手機(jī)mobile app API的分析。
他們主要面臨以下問(wèn)題:1.如何利用API日志更好地理解不同種類的用戶,2.如何更好地理解用戶與APP的交互 3. 如何對(duì)實(shí)時(shí)API請(qǐng)求進(jìn)行分類和安全檢測(cè) 3. 現(xiàn)有API日志數(shù)據(jù)量很大,現(xiàn)有數(shù)據(jù)分析團(tuán)隊(duì)缺乏大數(shù)據(jù)分析技能。
在與Pivotal合作后,我們?yōu)樗麄兲峁┝艘韵陆鉀Q方案:使用MADlib進(jìn)行聚類分析,建立一個(gè)sessionization模型。建立一個(gè)scoring pipeline,對(duì)新的訪問(wèn)進(jìn)行評(píng)估,使用visualization tool更好地呈現(xiàn)結(jié)果。
這次合作的商業(yè)影響也是非常顯著的。首先,我們針對(duì)不同的分析師建立了多個(gè)用戶類型分類,能夠及時(shí)把某種特定類型的用戶信息傳到相應(yīng)的分析師手上。其次建立了實(shí)時(shí)訪問(wèn)安全評(píng)分系統(tǒng),對(duì)可疑訪問(wèn)進(jìn)行及時(shí)處理,最后使用Greenplum + MADlib的形式,使得大數(shù)據(jù)的得到了更加充分的挖掘。
這個(gè)項(xiàng)目的數(shù)據(jù)源主要包括用戶的api 訪問(wèn)日志和customer profile,涉及45天的訪問(wèn)情況,50億行數(shù)據(jù),百萬(wàn)級(jí)別的用戶信息。平臺(tái)依然是Greenplum,建模主要用到了MADlib, PLR, PL/PYTHON和PDLTools。PDLTools是Pivotal data science 的另一套數(shù)據(jù)科學(xué)包。可視化主要在Tableau上進(jìn)行。
如圖所示是整個(gè)建模的過(guò)程。由于篇幅關(guān)系在此不做詳述。
案例總結(jié)
首先,在改良之前,用戶雖然使用了Greenplum,但依然在R上對(duì)data sample進(jìn)行分析,DCA閑置。改良后,用戶使用Greenplum+MADlib對(duì)大數(shù)據(jù)集進(jìn)行了更充分的分析。
第二,在改良前,用戶沒(méi)有建立起良好的用戶分類體系,合作完成后,他們建立了兩套模型對(duì)典型用戶進(jìn)行聚類分析,對(duì)用戶群體和用戶習(xí)慣有了更深入的了解,制定相應(yīng)的營(yíng)銷策略。
第三,之前的model不能高效檢測(cè)可疑的session,改良后,客戶建立起了對(duì)可疑session實(shí)時(shí)評(píng)分體系。
最后,在合作之前,客戶在評(píng)估是否轉(zhuǎn)換到Teradata上,但是改良后,他們決定放棄Teradata,增加GREENPLUM cluster的數(shù)量,充分證明了Greenplum在數(shù)據(jù)分析方面的優(yōu)秀表現(xiàn)。
總結(jié)與展望
通過(guò)使用MADlib,我們能夠進(jìn)行g(shù)raph, clustering, regression, classification等統(tǒng)計(jì)和機(jī)器學(xué)習(xí)分析,此外,我們還有GPText進(jìn)行文本分析,Geospatial進(jìn)行地理空間分析。Greenplum也能很好地支持BI reporting tool,實(shí)現(xiàn)快速的數(shù)據(jù)可視化。我們的理念就是ALLIN ONE DATABASE,讓分析變得更便捷和更高效。
我們很快將要發(fā)布版本1.13,在這個(gè)版本中,將會(huì)加入一些新的圖形方面的算法,包括HITS和Graph cut,我們會(huì)支持mini-batching,加快計(jì)算的速度,同時(shí),隨著新版postgres 10的發(fā)布,我們也會(huì)加入對(duì)新版本的支持。
下一個(gè)版本發(fā)布是2.0,我們會(huì)有一些Interface方面的改動(dòng),算法方面,在圖形方面會(huì)加入特征向量中心性,中間中心性等。SVM,我們會(huì)加入Multiclass,另外,我們會(huì)加入gradient boosted machines(GBM)做boosting。最后,我們會(huì)加入更多的utility function來(lái)預(yù)處理數(shù)據(jù)。
2018年,我們的開發(fā)重心會(huì)放在deep learning上,相信我們能為大家提供更多深度方面的支持。
上圖是MADlib相關(guān)的resource,我們是全開源的,歡迎大家瀏覽或者和我們一起contribute,讓MADlib越做越好。