1. 程式人生 > >來者如臨高山,往者以觀逝水--天貓品牌推薦演算法比賽總結

來者如臨高山,往者以觀逝水--天貓品牌推薦演算法比賽總結

四個月的比賽總算是落下帷幕了,作為單執行緒的動物,沒有辦法邊寫總結報告(其實就是拖延症)。比賽結束,總算可以靜下心來想一些東西。

我是從年級的群裡知道阿里的這個比賽的,一直都推薦挺感興趣的,那段時間又剛好看了一些推薦方面的書籍,就拿準備拿這個機會練練手,在第一賽季的時候比賽特別瘋狂,第一次提交成績是在326號,F1成績是0.17%,當天排名在1428名,印象中是用的協同過濾演算法,根據使用者購買過的物品來做協同過濾,所有的點選,收藏和加購物車的資訊全部都沒有用,沒過幾天,阿里來到我們學校做宣傳,突然間發現各種經典的推薦演算法在這個比賽中都不怎麼適用,就開始使用規則,比如說對於在日期半個月以前的使用者點選這個物品多少次以上推薦購買,使用者購買過多少次以上的推薦購買,使用者在最近幾天內點選多少次的推薦購買。用簡單的規則來猜測使用者的購買行為,

F1成績大概在6.5%左右,鑑於比賽太過凶殘,基本上每天不提交就能掉個幾十名。後期也嘗試過貝葉斯,lr來做,那個時候對於特徵的理解並不深,感覺成績並不是很好。那段時間基本上都是每天早上兩點多自然醒的看成績,最後第一賽季以7.07%的成績進入第二賽季。

第一賽季在簡單規則上遲到了甜頭之後,第二賽季一開始也是用sql大概寫了下第一賽季規則的思路,成績漲到4.6%左右(用了大概十天),開始和善善用lr來做,第一賽季我們倆都沒有用過lr,所以,一直在嘗試,比如說我們用最簡單的點選來當做特徵,做預測,熟悉了下lr的流程。然後,還嘗試過用一個星期內有互動的ub對的點選值做歸一化處理後做訓練,四個月所有互動的

ub對的所有點選值做歸一化做預測,得到效果竟然不錯,現在看來那個時候也真的是各種腦洞大開。我們也嘗試了抽取LR特徵,和其他隊伍交流,才發現我們的差距,他們已經嘗試了所有的演算法,我們還在LR上面打轉,連提取特徵的方法都是暴力的提取,才有了時間片的概念,開始使用mr提取特徵,估計剛剛開始用mr來寫,特徵經常寫錯,陷入了大概有十幾天都沒有進步的情況,每天晚上和善善在實驗室寫程式碼寫到樓下的人來催,然後一路上很開心的設想:哎呀,明天馬上就要上5了,怎麼辦,要進首頁了,好緊張好激動。但是每天早上起床,總是一臉鬱悶,沒有一次是能夠實現的。到了二十三號的晚上做融合的時候,寫了三個版本,寫完之後一直在算概率,感覺進步的希望不大,就推倒所有的思路,把我們現有的可以提交的版本分成長期預測以及短期預測,長期預測一般都是使用者比較穩定會購買的品牌,短期預測是使用者最近的需求,然後對所有分到長期預測的結果取交集,對所有短期預測的資料也一樣取交集,在把兩個合併。當天的成績是達到了
5.31%。當天排名是25,第一次進入到了第二版面。

第二賽季的第一個月結束後,又開始進入了一段蟄伏期,長期不進步,主要是有了幾個坑,首先,我們都是通過兩個月的資料預測第三月的,比如說比賽有四個月的資料,我們用了第一二月做特徵,第三個月做y值,來做訓練,然後第二三月做特徵,進行線下預測,與用第四個月的購買情況來做評估。第三四月份直接用線下訓練的模型做預測。後面改成,重新訓練二三月份的資料,成績大概提升了0.2%,其二,把兩個月的資料換成三個月的資料,成績也是相應的有提升。後來,根據這段時間的各種特徵的嘗試,寫了第一個版本比較完整的特徵,對於品牌特徵主要從四個方面進行思考(品牌屬性,品牌熱度,最近行為,一些比值),使用者特徵也是主要從四個方面進行思考(購買能力,使用者屬性,最近行為,一些比值),對於ub互動資訊主要是劃分時間片,提取的都是簡單的特徵。演算法也從rf逐步轉移到gbrt,後面幾天穩步提升,到了第二個月的24號,F1成績是5.82%

第二賽季的最後一個月再次大換血的重新整理一份特徵,這次特徵的思考方式主要是想到衡量標準,所有的衡量標準只能想到個數,天數,品牌數,使用者數,次數(不同品牌不同天),行為有點選,購買,收藏,加購物車,操作,按照這些量,加上時間片,組合了一份我覺得基本特徵都包含在內的大雜燴特徵。大雜燴特徵第一次測是用的rf,成績是5.69%,一度心碎,估計一下子加的特徵太多了。本來想要拋棄的,第二天因為也沒有其他東西可以交,就跑了一份gbrt交了,得到的成績是5.88%,後面發現裡面有部分特徵是寫錯的,估計gbrt對特徵的容錯性比較強。然後在此基礎上有加入了一些極值,單份成績沒有變,但是兩份的融合結果漲到了5.92%,再然後,就是經常改改特徵,基本上都是單份沒有提高,融合慢慢提高,在20名左右徘徊,換資料前的最終F1值是5.98%

換資料之後,跑之前的最後成績單份變成了5.99%,融合卻不怎麼能夠提高,再加上最後一個星期的某次提交我還給失誤了。最後的成績在6.02%,幸好還在前三十。

這算是這次比賽四個月的一個流水賬吧,有同學說走到現在,基本上很傻的方法都能做到這個成績,我覺得這可能是因為做到了所以才這麼說,如果說這僅僅是最傻的方法,我們也用了四個月才走到現在。在這個過程當中,對於很多演算法,特徵的抽取,正負樣本的處理,取樣方式,各種調參,特徵的處理,y值處理,融合的方式都有了一個不一樣的理解。這四個月,熬夜跑程式,早上四點起床看成績,其中還經歷連續感冒,胃鏡,拔牙,各種身體上的折磨,最後竟然身殘志堅的堅持下來了,真是佩服我自己!

第一賽季感謝主公,第二賽季感謝親愛的好隊友善善!

其他的一些總結與教訓:

1、記錄還是很有必要的,在記錄的過程中經常會有很多的思路,這一點善善做的很好,向你學習。

2、有想法的時候,儘快實現,要不靈光一閃,經常就給閃沒了。

3、多於其他隊伍進行交流,從幾次比較重要的提升都是因為和其他隊的交流,才知道我們的缺陷。

4、在與其他隊伍交流後能夠多思考,思考其中影響的本質是什麼,從中可以觸類旁通,應用到其他方面。