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