阿里巴巴大數據競賽總結


——謹將此文獻給阿瑞(@Nyanko君一生懸命)和湛盧。阿瑞在MapReduce等方面提供的技術支持,使我們成為最早充分利用ODPS的團隊之一;湛盧提出很多分析問題的新思路,讓我們在走投無路的時候屢次重拾希望。

0.    寫在最前面

這個系列的幾篇文章,記錄我們隊對於問題的整個處理過程。分成兩個部分:首先的這一篇,記錄我們分析問題的思路,以及由此建立的特征體系,模型的選擇和融合;下一篇(也許會有),總結一下top10團隊的做法(這個必須要等到8月20日他們答辯以后了)。         

這個系列的文章重點圍繞電商數據分析。盡管阿里放出的數據字段不多,有人謂之“小氣”(你如何看待今年的阿里巴巴大數據競賽?),仍然可以從中挖掘出業務信息和行為模式,給有志於網站分析,尤其是電商網站分析的同學提供一些思路。

此外,由於我的水平有限,無法面面俱到,有兩個方面不做介紹:一是ODPS平台的具體使用(MR、XLab),二是某種算法的具體實現及詳細原理(所以基本不會有數學公式:-D)。不涉及平台的使用,是為了沒參賽的同學也能看得下去;不講算法的詳細原理,但會用一些直觀的形式說一下自己的理解。

最后,本文來自南京大學“非基向量”團隊的工作,由@且行且析YX執筆,轉載請注明出處:http://www.cnblogs.com/qxqx/p/3903222.html

1.    問題介紹與評估指標

開放數據:天貓用戶在4月-8月的品牌行為數據,對品牌的點擊、購買、收藏、加入購物車等。(一共5個月的數據)

預測數據:同樣這些用戶在9月購買的品牌。

提供的數據形式如下:

     

具體內容,請戳比賽介紹

2.    天貓推薦算法

在阿里內部,天貓算法團隊將品牌推薦轉化為一個點擊率預估問題。(注意:這里討論推薦的目標是為用戶展示之后用戶會去點擊,但是比賽要求的是預測用戶是否去購買)

選取(USERi, BRANDj),即用戶-品牌組合作為樣本,對每個樣本建立若干個特征f1/f2/f3…,是否點擊作為因變量y(點擊標記為1,未點擊標記為0),最終對y進行預測得到點擊的概率:

    

具體到點擊率預估的模型上,使用Learning to Rank的算法,例如LR、Random Forest、GBDT。

上面的做法對於產生過交互的用戶-品牌組合,無論是樣本選取,還是特征抽取都比較容易,但是還要考慮挖掘從未發生交互的用戶-品牌組合進行推薦。這部分“未知”的品牌推薦依靠基於Item的協同過濾:

   

3.    問題分析

但凡學校里上過機器學習相關課程的同學,聽到推薦系統之后,第一反應可能就是協同過濾。可是這里用協同過濾做的效果並不好,內部賽的冠軍算者(@算者-閆新發)在論壇上提到了兩點(奪冠感言:走進業務,提升對世界的認知能力),結合算者的觀點和我的想法,可能的理由如下:

    1.   代價不同。我理解是購物的代價比較高,使得用戶的很多操作都無法轉化為購買,大多數的操作可能都只能是噪音(對於最終的購買行為而言),在有噪音的數據上反復操作(協同過濾的確是算來算去),會讓噪音迅速增大。如果說購買預測的准確率本來就很低,協同過濾的准確率可能還遠在其下。
    2.   喜好的相似性和購買需求的單一性。用戶喜歡逛商城,看衣服,但是用戶買衣服的頻率是有限制的。而協同過濾用到的打分,其實是就是用戶的喜好程度,但是我們無法拿到准確的能反映出品牌需求頻率的數據,作進一步的推斷就缺少依據了。更有糟糕的情形是,用戶對品牌A的喜好程度很高(經常買),品牌A和品牌B的相似度很高,這時候給用戶推薦B,用戶反而不買賬,為什么呢?因為我是品牌A的忠實顧客,而同類商品的轉移成本對我來說太高了。
    3.   數據的完善程度。被不止一個用戶碰到的品牌數太少,不到50%,絕大多數品牌只與一個用戶發生過交互,完全無法和一些典型的協同過濾研究用的數據集相比。

為什么天貓就可以利用協同過濾探索到未知的組合呢?其實上面提到的是點擊率的預測,而點擊和購買不同,無需考慮代價和需求問題。況且天貓內部必然掌握着更多的數據,多到足以讓CF發揮作用。

此路不通,我們自然地想到要在有過交互的組合上做購買率預估。

4.    數據集划分與抽樣

訓練集/預測集划分

訓練集和預測集的划分如下:

 

X(特征提取)

Y(label/prediction)

訓練集

1-92

93-123

預測集

1-123

?(下個月)

即第1-92天的數據作為訓練樣本,並用來提取特征(X),93-123天的購買情況對前面的樣本進行標記(購買的記1,未購買的記為0),在(X,Y)上預測得到購買率預測模型。然后用1-123天的數據作為預測樣本,並用來提取特征,應用剛才得到的購買率預測模型,得到下個月的購買率。

這里其實存在一個問題,訓練的模型是用前三個月預測第四個月,預測卻是在前四個月的樣本上預測第五個月的購買,這里的不一致性該如何解決?我們將在后面討論這個問題。

每天只能提交一次,需要建立相應的線下測試框架:

 

X(特征提取)

Y(label/prediction)

訓練集

1-61

62-92

預測集

1-92

?(93-123)

即根據前三個月預測第四個月的效果,估計前四個月預測第五個月的效果。

 

按轉化行為的樣本划分

考慮購買和收藏行為的特殊性,再對數據所以下的划分,比較各自轉化為下個月購買的效果:

數據划分

P

R

F1

最近三個月購買過的組合

1.86%

5.58%

2.79%

最近三個月收藏(或購物車)且從沒有購買過的組合

0.61%

 

0.97%

 

0.76%

 

最近三個月點擊且從沒有收藏(或購物車)或者購買過的組合

0.22%

 

12.88%

 

0.44%

 

購買的轉化率是最高的,別忘記這是品牌推薦,在現有品牌能滿足需求的前提下,用戶不會太願意承擔購買新品牌的風險。而收藏的操作成本比點擊要高,故用戶對於這種品牌的喜好程度更高。至於純粹的點擊行為,則是最難准確預測的部分。

接下來將把全部的樣本按照上面分成三類。這樣划分的最早我們的准確率總是上不去,原因就是純粹點擊轉化做的太差了,於是索性先把購買抽出來做好,后來每種轉化途徑的准確率都上去了,但是卻沿襲了之前的這種樣本划分。簡單說,就是“歷史遺留問題”。后來也沒有比較過是不是所有樣本放在一起,使用大量稀疏特征會更好(囧)。不過為了下面說明方便,請暫時接受這種划分的設定。

5.    特征提取

特征提取前的預處理:

特征工程重在做細、做實,因此如果在特征提取前不做預處理,個人實在無法接受。譬如考慮購買,很顯然在最后一次購買后若干天之后又產生了點擊,這里的點擊和別的點擊次數是不同的,它很有可能預示着一次新的購物行為的開始。因此這樣的點擊行為應該抽出來單獨做成一個特征。而這種序列的提取,用MapReduce最容易實現。

我們組的特征數一直上不去,最終鎖定在25-30,曾經接受@give學姐的建議,嘗試將特征擴大到200維,可是效果也一直不好。特征提取是個考驗細節工作的活,估計某個關鍵細節沒做好。

所有的特征可以分成四大類,下面介紹每類特征的設計思路。

 

流量特征

流量,就是點擊或購買等行為的次數。這也是唯一建立在用戶-品牌組合上的特征(其他的特征都只是在用戶或品牌的某一個維度上展開)。流量有兩個特性,一是不同行為的重要性更不相同,二是按照時間衰減,短期的操作行為和購買的相關性最強。

有兩種構造流量特征的方法可以讓模型自動學習到時間權重,一種如下圖所示:

   

  

最近一周點擊次數、上周點擊次數、上上周點擊次數……

另一種描述方法是按照用戶對品牌操作的行為序列進行描述,如最近一次點擊次數、最近一次點擊時間、最近倒數第二次點擊次數、最近倒數第二次點擊時間……

用戶購買力/品牌銷售量

反映用戶的購買能力和某個品牌的銷售情況。只取相關性最強的最后一個月數據。

時間間隔類特征

一種是轉化間隔:某種行為經過多長時間可以轉化為購買,例如用戶將一個品牌加入收藏之后,傾向於過多長時間來購買這個品牌。反過來也可以在品牌維度上定義轉化間隔類的特征。

另一類是反應用戶在網站上的活躍度。例如用戶回訪天貓的平均時間間隔。

可以考慮的匯總指標有平均數和中位數,平均數的效果明顯好於中位數。

轉化率類特征

反映用戶和品牌的某種操作轉化為購買的比率。具體的算法可以分為按照次數和按照種類數計算的轉化率。

如果只考慮用戶單次購買行為的成功率,還可以定義跳出率特征(Bounce Rate)。由於缺少進一步的信息,取用戶有操作的每天作為統計上線次數的單位,由此定義  

      跳出率=用戶發生購買行為的天數/用戶上線的總天數

 

6.    模型選擇

Tree-based Models

阿里的算法工程師曾經做過一個分享《海量數據下的非線性模型探索》,提到在淘寶曾經有一個預測下一天ad的ctr的規則:

這個規則很簡單,但是在很長時間里打敗了各式各樣的線性模型。

此外,在淘汰賽的小數據集上,很多同學都抱怨為什么自己研究了大半天的算法,反而比不上自己拍腦袋想出來的幾條規則?

其實這都反映出來,線性模型無法很好地擬合數據。

相對的,基於決策樹的算法Random Forest和GBDT在擬合效果上明顯好於線性模型,同時兩種方法通過集成學習的方式各自避免了過擬合,在數據集跑出了較高的成績。

決策樹的另一個優點是大多數特征不需要太多的后處理,特征選擇的工作稍微做的馬虎一點效果影響也不大。(我是說相對而言,如果想取得特別好的名次需要好好做特征選擇)

Logistic Regression

LR則對特征的要求要“嬌慣”得多,首先必須是線性相關的特征。但是有些特征就不是線性相關的,但是又的確對轉化率會有影響,這時就需要做預處理了。我們用的處理方法是排序並分箱,從而得到一個偏線性的離散化的特征。

LR的另一個問題是它無法學到特征組合的知識,而有些信息只有通過特征間的組合才能表達出來。例如,比起用用戶的購買力作為特征,考慮用戶的購買力與這個品牌是否match要更加靠譜,對應的需要將特征進行組合,例如相乘或者相除。

最近在微博上看到很多人在討論特征離散化的問題,據說,“在工業界,很少直接將連續值作為特征喂給邏輯回歸模型,而是將連續特征離散化成一系列0、1特征,交給邏輯回歸模型”,還有人特地將討論的內容整理了一下,感興趣的同學可以參考:特征離散化、特征組合以及線性模型的非線性基擴展

        

訓練中的抽樣

這是一個不均衡的預測問題,如果我們把所有的負樣本都交給算法,可能模型不管預測什么都是一個negative的結果,大大降低預測的准確度。因此,需要對負樣本進行抽樣。對於不同的數據划分,我們分別選擇1:2、1:5、1:20,此時得到的結果比較均衡。

 

7.    預測結果融合

從數據出發

前面提到,在訓練之前,負樣本進行過抽樣,因此得到的模型必然會偏向抽樣出的數據。這種隨機誤差是由於統計抽樣造成的,解決這個問題簡單而有效的方法就是“多次測量取平均值”,即多次(一般4-5次即可)抽樣,最后取多個模型預測的平均值。

這種融合方法可以使F1得分上升0.04%左右。

從模型出發

融合多個不同的模型,那么各個模型間的差異要盡可能大,因此這里以線性的LR和非線性的Random Forest來講一下我們的融合方法。

在融合前期不妨用簡答的加權求和看一下效果:

 

 

理想情況下,Random Forest可以較好地擬合數據,而LR則可以獲得(線性)一致的結果,削弱某些離群點的表現,如下圖所示(圖片來自More Is Always Better: The Power Of Simple Ensembles):

        

但是上面的兩個分類器在使用之前還滿足融合的另一個前提,那就是兩種方法的效果不能相差太大。這個比賽中,LR的擬合效果完全比不上隨機森林,但是隨機森林,或者說決策樹本身有一個缺點,即只是對歷史行為的記憶,缺少推廣性。

舉例來說,我們的流量特征使用序列的表示方法,考慮特征last_click_date,即用戶最后一次點擊時間。使用Random Forest,模型實際在訓練集上只學到這個特征為1-92時對應的知識,而在預測集上,最后一次點擊時間很可能是100甚至更大(前面提到訓練集划分產生的問題)。這個時候,隨機森林只能把它當做92(訓練集上這個特征最大的可能取值)來處理,從而當last_click_date取100和120的預測值是一樣的,而事實上二者應該存在區別(盡管這個區別可能很小)。想一下LR的預測過程,你會發現LR就可以較好地處理外推問題。

總之,既然不能在全局上進行融合,就要在局部數據上進行融合。上面提到的此類樣本在提交的結果集中約有5萬條,在其上進行Random Forest和LR的融合之后,多命中了大約200條(淚,F1只提高了約0.01%)。

8.    一些不成功的嘗試

繼續掙扎的Item-Based CF

起初基於Item的協同過濾是從“買了又買”(條件概率)入手,后來在這個基礎上我們有考慮“買了不買”的行為。如果“買了又買”對應市場上的互補性商品,則“買了不買”則對應市場上的可替代品牌。例如用戶在購買品牌A的那一天的只是點擊了品牌B,那么A和B可能就是這種關系。

但是做出來的效果差得很遠,如果有精確到秒的數據或許會好一些。

專攻輔助的Item-Based CF

按照協同過濾計算條件概率的公式,將這個預測評分也作為一個特征放入到購買率預測模型中,為有交互的組合提供輔助。結果看來,這種特征基本無效。

環比特征

主要從品牌入手,很多品牌可能具有季節性的銷售特征。自然考慮到品牌銷量的環比變化,結果發現相關性非常之低而且不穩定。或許是因為,時間序列分析無論哪種方法都只能做極短期的預測,一個月實在太長了。

動力學特征

簡單說,就是用戶從隨便點點到確定購買之前,點擊的頻率(按天為單位)是一個勻加速,甚至加速度勻速增加的勻加速過程。做了一階差分之后,發現這種行為特征不明顯。其實,用戶在購買前的各種不同日期點擊品牌的行為本來就很少見,抽樣上不去,規律自然不明顯。

9.    一些沒用上但是有趣的結論

購物沖動在一周內的變化

以一周為周期,購物沖動在周三周四附近最強烈。這個結論未經驗證,實際來自於比賽初期大家猜這是哪年數據來着。有人指出購物量較少的兩天其實是周六、周日,由此反向推出某一天是周幾,進一步推出這是哪一年。

我們組一番扯淡之后覺得,周一周二大家都比較忙,周末則活動太豐富(出去玩之類的),反而沒時間精力網購,周三可能是一周最迷茫的時候(我實習的時候就有這種感覺),而且這個時候下單,剛好周末的時候能收到快遞……你們信或者不信,反正我信了。

每日購買品牌和點擊品牌之間的關系

俗話說“貨比三家不吃虧”,決定買一個品牌之前多比較一下總歸是不錯的,這也反映在多數人的購物行為上。下圖中的各個頂點為品牌,邊表示在購買其中一種品牌的當日也點擊了另外一種品牌,邊的權重為這種模式出現的次數。可以看到買到好的品牌都聚在圖的中心一塊,或者說用戶會在暢銷品牌之間糾結更多時間:

10.    總結文的小結

總的來說,整個比賽的工作量應該是80%的數據分析和特征工程,再加上20%的算法選擇和融合。整篇總結也在前面着墨較多,希望可以為有志往數據分析方向發展的同學提供一些思路。但也只是一些思路,結論切勿盲目套用,具體問題仍應具體分析。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM