基于PredictionIO的推荐引擎打造,及大规模多标签分类探索
基于PredictionIO的推薦引擎打造,及大規(guī)模多標(biāo)簽分類探索
摘要:在2015年3月21日的北京Spark Meetup第六次活動(dòng)上,尹緒森就如何使用PredictionIO打造一個(gè)定制化推薦引擎進(jìn)行了詳細(xì)介紹,白剛則分享了新浪在大規(guī)模多標(biāo)簽分類上的探索。
在2015年3月21日的北京Spark Meetup第六次活動(dòng)上,一場(chǎng)基于Spark的機(jī)器學(xué)習(xí)專題分享由微軟Julien Pierre、新浪網(wǎng)白剛與Intel研究院尹緒森聯(lián)手打造。
Julien Pierre:Apache Spark in ASG
微軟ASG產(chǎn)品經(jīng)理 Julien Pierre
Julien Pierre首先進(jìn)行了開場(chǎng)發(fā)言,并為大家分享Spark在ASG團(tuán)隊(duì)的應(yīng)用情況。
通過Julien了解到,其團(tuán)隊(duì)主要工作集中在Spark SQL和MLlib兩個(gè)組件,基于Spark做一些交互式分析,其中包括:將Spark與現(xiàn)有的查詢工具(Avacado整合)、使用Spark填補(bǔ)SQL Server DB和Cosmos之間規(guī)模的數(shù)據(jù)處理空白,以及使用Spark處理Bing和Office數(shù)據(jù)集。Julien表示,在小(1TB以內(nèi))數(shù)據(jù)集的處理上,SQL Server DB非常適合,它可以將延時(shí)控制在1分鐘之內(nèi);而在大數(shù)據(jù)集(100TB以上)的處理上,Cosmos可以在小時(shí)級(jí)別搞定;而使用Spark,剛好填補(bǔ)了數(shù)據(jù)處理上1-100TB的空檔,在1分鐘以內(nèi)對(duì)數(shù)據(jù)進(jìn)行處理。
尹緒森:Use PredictionIO to build your own recommendation engine & MLlib 最新成果
Intel研究院工程師 尹緒森?
尹緒森在本次Meetup上主要分享了兩個(gè)話題——使用PredictionIO來打造一個(gè)推薦引擎以及MLlib的最新成果。
PredictionIO
尹緒森首先介紹了PredictionIO,他表示,推薦系統(tǒng)打造過程中,除下Spark,系統(tǒng)還需要其他組件,而PredictionIO就是基于Spark一個(gè)完整的端到端Pipeline,讓用戶可以非常簡(jiǎn)單的從零開始搭建一個(gè)推薦系統(tǒng)。
整個(gè)Pipeline流程如圖所示,其中Spark是整個(gè)管道的核心,整個(gè)Pipeline主要分為以下幾步:
如上所述,一個(gè)完整的Pipeline中同時(shí)存在多個(gè)組件,比如:HBase,為EventServer存儲(chǔ)event;Spark,用于數(shù)據(jù)或者模型的處理;HDFS,用于存儲(chǔ)模型;Elasticsearch,用于元數(shù)據(jù)的處理。而對(duì)于用戶來說,使用PredictionIO來構(gòu)建Pipeline只需要實(shí)現(xiàn)4個(gè)部分:
- Data Source and Data Preparator
- Algorithm
- Serving
- Evaluation Metrics
Engine
在PredictionIO中,Engine是一個(gè)比較核心的部分。在這里,尹緒森通過兩個(gè)用例來講述:
Engine A:Train predictive model
數(shù)據(jù)從Event Server讀取=》通過Data Source后形成TrainingData=》通過Preparator處理后形成PreparedData=》發(fā)送到不同的Training模塊(Algorithm & model)進(jìn)行訓(xùn)練。
Engine B:Respond to dynamic query
Mobile App向Engine提交查詢(輸入)請(qǐng)求,隨后會(huì)發(fā)送到3個(gè)Training模塊(Algorithm & model),生成結(jié)果并通過用戶自定義的算法將3個(gè)結(jié)果進(jìn)行整合,從而產(chǎn)生一個(gè)Predicted Results,并交由Serving呈現(xiàn)在Mobile App。
最后,尹緒森通過實(shí)際代碼講解了如何使用PredictionIO打造一個(gè)基于Spark的Pipeline。
Recent news of MLlib
尹緒森表示,在之前版本,Spark的各個(gè)組件(比如MLlib、Graphx、Core)相對(duì)獨(dú)立,而在1.3發(fā)布后,當(dāng)下已經(jīng)有了一個(gè)融合的趨勢(shì),更加方便用戶使用。最明顯的變化就是MLlib和Spark SQL,其中SparkSQL把SchemaRDD封裝成新的DataFrame API,同時(shí)基于MLlib和SQL發(fā)展出一個(gè)MLPackage,它與DataFrame一起提供了更方便的API為用戶使用;而MLlib則與Spark Streaming一起提供了online training的能力,但是目前online training只有3個(gè)算法;最后,在1.3發(fā)布后,MLlib中添加了很多新的算法,其中多個(gè)都是基于GraphX實(shí)現(xiàn),這主要因?yàn)楹芏嗨惴ǘ歼m合用圖來表示,比如LDA(Latent Dirichlet Allocation)。
分享最后,尹緒森綜述了MLlib近期的幾個(gè)主要更新,其中包括Streaming-wised training、Feature extraction/transformation、LDA on top of GraphX、Multi-logistic regression、Block matrix abstraction、Gaussian Mixture、Isotonic Regression、Power iteration clustering、FPGrowth、Stat、Random forest以及ML package和 DataFrame,并表示ML package和DataFrame是近期最重要的兩個(gè)變化。
白剛:Multi-Label Classification with Bossting on Apache Spark
新浪網(wǎng)廣告算法部門高級(jí)工程師 白剛
白剛在新浪/微博從事廣告算法相關(guān)工作。而本期Meetup上,白剛的分享主要圍繞著新浪門戶的大規(guī)模多標(biāo)簽分類算法工作(項(xiàng)目已上傳到GitHub )。
背景
在類似新浪的媒體中,廣告帶來收益,同時(shí)也會(huì)影響到用戶體驗(yàn)。為了減少對(duì)用戶體驗(yàn)的影響(甚至是對(duì)用戶體驗(yàn)產(chǎn)生幫助),如何區(qū)分“用戶屬于哪個(gè)人群,是哪些廣告的潛在受眾”至關(guān)重要,也就是如何做好user profiling。
如上圖所示,每個(gè)用戶都有著不同的興趣,同時(shí)每個(gè)人也擁有著多個(gè)興趣,因此實(shí)際問題歸結(jié)于如何給用戶打上對(duì)應(yīng)的標(biāo)簽。
問題與求解
在機(jī)器學(xué)習(xí)領(lǐng)域,上述的問題被抽象為模型的建立和預(yù)測(cè):根據(jù)給出的user feature x,輸出符合其興趣的標(biāo)簽集合L,即F :X →L。這里需要做的則是通過一個(gè)superwise的方法對(duì)模型進(jìn)行訓(xùn)練。
所使用數(shù)據(jù)集:Feature是用戶的抽象行為;X,一個(gè)N維的向量;L則是具體的Label集合,同樣是一個(gè)向量,每個(gè)維度的值是正一和負(fù)一,表示加或者不加某一個(gè)Label。訓(xùn)練的最終目標(biāo)是最小化Hamming Loss——即每個(gè)Label的錯(cuò)誤率。在這里,白剛從簡(jiǎn)單的方案介紹,然后針對(duì)其缺點(diǎn),給出了scalable的方案:
1. Per-label bin-classification?
為了得到這個(gè)vector-valued function F :X →L,這里需要為每個(gè)l∈L都訓(xùn)練一個(gè)binary classifier,預(yù)測(cè)時(shí)將判斷每一個(gè)標(biāo)簽上的結(jié)果。
- lOne- versus-all implemented in LibSVM、scikit-learn
- lAd targeting往往使用per-campaign model,為每一個(gè)ad compaign訓(xùn)練一個(gè)二分類模型
這個(gè)途徑主要基于一些已有技術(shù),比如LR、SVM等二分類模型,因此易于驗(yàn)證。但是這個(gè)模型有個(gè)比較明顯的缺點(diǎn),即擴(kuò)展性差——逐個(gè)標(biāo)簽訓(xùn)練模型是個(gè)比較低效的途徑,隨著標(biāo)簽數(shù)的增加,訓(xùn)練耗時(shí)也明顯增加。
2. Multi-Label Classification
基于上述思考,新的目標(biāo)被確定:首先,模型本身的輸出就是多標(biāo)簽結(jié)果,而不是組合多個(gè)二分類的模型去獲得最終結(jié)果;其次,訓(xùn)練過程是最小化Hamming loss,這樣一個(gè)目標(biāo)可以讓多標(biāo)簽的分類更準(zhǔn);最后,必須是可擴(kuò)展的,不管是在Feature的維度上,還是在Label的維度上,亦或是數(shù)據(jù)集的大小上,都能適應(yīng)一個(gè)很大的規(guī)模。
在考量了多個(gè)解決問題的方案后,Boosting最終被選擇,這主要因?yàn)锽oosting在這個(gè)場(chǎng)景下可以更加的高效和方便,同時(shí)在Spark上實(shí)現(xiàn)Boosting這個(gè)多迭代的方式也非常適合。這個(gè)方案主要涉及到兩篇文獻(xiàn)和一個(gè)開源的實(shí)現(xiàn):
文獻(xiàn)1:Improved Boosting Algorithms Using Confidence-rated Predictions( Robert E. Schapire & Yoram Singer)。提出了AdaBoost.MH算法,它主要是對(duì)AdaBoost的擴(kuò)展。
文獻(xiàn)2:The Return of AdaBoost.MH: Multi-class Hamming Trees,2014年由Kegl提出。該方法主要是對(duì)AdaBoost.MH里的base learners做Factorization,將Decision stump和Hamming tree作為base learner。需要注意的是,該方法還處于初級(jí)階段。
開源實(shí)現(xiàn):前述算法的一個(gè)CPP單機(jī)開源實(shí)現(xiàn)。http://multiboost.org。當(dāng)然,在這里希望得到的是通過Spark實(shí)現(xiàn)一個(gè)更具擴(kuò)展性,更容易并行的方案。
分享期間,白剛詳細(xì)的介紹了上述3點(diǎn)工作原理及學(xué)習(xí)機(jī)制,并針對(duì)Spark上的實(shí)現(xiàn)進(jìn)行了詳細(xì)講解,其中包括:
- 多標(biāo)簽情況下弱分類器的系數(shù)的計(jì)算及其數(shù)學(xué)意義。
- Base learner的訓(xùn)練、根據(jù)14年那篇文獻(xiàn)的介紹,把弱分類器分解成一個(gè)只與feature相關(guān)、與label無關(guān)的函數(shù)和一個(gè)只需label相關(guān)、與feature無關(guān)的向量。前者把feature space做劃分,后者在每個(gè)label上對(duì)前者的劃分做修正。
Multiboost on Spark
1. Strong Learner on Apache Spark
AdaBoost.MH on Apache Spark
與Spark的結(jié)合,Strong Learner主要在Spark的driver program中實(shí)現(xiàn)算法邏輯,Base Learner類型作為類型參數(shù)。其中不同Base Learner可替換,實(shí)現(xiàn)可插拔,并實(shí)現(xiàn)了Base Learner的training邏輯與strong learner解耦。代碼參見GitHub。
2. Base Learner on Apache Spark
這個(gè)部分的工作主要是對(duì)弱分類器邏輯實(shí)現(xiàn)的封裝,其最核心內(nèi)容就是實(shí)現(xiàn)baseLearnerAlgo.run(iterData.dataSet)。
通過參考2014年的文獻(xiàn),主要分享了這三個(gè)方面的多標(biāo)簽弱分類算法:
Decision stump:一個(gè)只有一個(gè)節(jié)點(diǎn)的決策樹,只有兩個(gè)模型參數(shù)。J,feature的index,即選擇哪一個(gè)維度的feature去考慮;b,是一個(gè)threshold,當(dāng)在這個(gè)維度上feature的值大于threshold的時(shí)候則劃分為正的部分,反之則劃分到負(fù)的部分。
同時(shí)期訓(xùn)練過程就是尋找最優(yōu)的分隔(j, threshold)的過程
Hamming tree:Decision stump作為節(jié)點(diǎn)的決策樹。
Generalized bin-classifier方案:φ(x)使用任意二分類模型,與v一起來最大化class-wise edge/最小化exp loss。
3. Decision Stump on Apache Spark
對(duì)比單機(jī)版,在Spark中的實(shí)現(xiàn)并不會(huì)真正的去做排序,而是通過flatMap==》reduceByKey的方式實(shí)現(xiàn)。
Decision Stump的實(shí)現(xiàn)
在具體的實(shí)現(xiàn)過程中,白剛展示了Decision Stump的模型效果和訓(xùn)練過程Spark集群負(fù)載等數(shù)據(jù),分析其中存在的一些問題:首先,它是一個(gè)非常弱的二分類模型;其次,Decision stump模型訓(xùn)練的數(shù)據(jù)傳輸量很大;最后,Tree-based模型,并不適合高維稀疏數(shù)據(jù)。因此,需要一個(gè)更強(qiáng)的,更易于訓(xùn)練,并且適應(yīng)高維稀疏數(shù)據(jù)的φ(.)來針對(duì)feature space做二元?jiǎng)澐帧?/p>
4. Generalized binary φ on Apache Spark
白剛表示,通過對(duì)Spark的考量發(fā)現(xiàn),Spark.mllib.classification中已有的模型和算法就符合我們的要求:首先,SVM和LR是比較強(qiáng)的二分類模型;其次,訓(xùn)練過程采用GradientDescent或者LBFGS的數(shù)值優(yōu)化方法,易于訓(xùn)練、效率較高;最后使用SparseVector,支持高維稀疏數(shù)據(jù)。關(guān)于使用些模型的正確性的依據(jù),在AdaBoost機(jī)制中,只要base learner比random guess(正確率0.5)好,整體就是收斂的,由于弱分類器中的vote vector的存在,可以保證每個(gè)label上的錯(cuò)誤率都小于0.5。
后續(xù)工作
分享最后,白剛對(duì)現(xiàn)有的不足之處和可以優(yōu)化的方向進(jìn)行了總結(jié),并邀請(qǐng)大家參與這個(gè)已經(jīng)投放在GitHub上的項(xiàng)目,fork及pull request。
總結(jié)
以上是生活随笔為你收集整理的基于PredictionIO的推荐引擎打造,及大规模多标签分类探索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 若能回到五年前,我会告诉自己这些创业道理
- 下一篇: 淘宝杨志丰:OceanBase--淘宝结