原文發(fā)表于:天池-第三屆Apache Flink極客挑戰(zhàn)賽第2名方案和代碼
歡迎關注微信公眾號:YueTan
背景
參賽動機:
- 不喜歡996拿著955極低的工資,突然發(fā)現(xiàn)自己的時間變成了每天刷劇,心有愧疚负拟。
- 想了解大數據砚哆,F(xiàn)link作為當紅的實時計算引擎,比賽還有官方大佬幫忙解答問題细诸,是很難得的學習機會。
結果:
- 拿到第2超出預期。工程加算法賽敬肚,其實每個人都是在工程能力的枷鎖下進行探索毕荐,我屬于枷鎖極重的那個束析,只能在極小范圍里輾轉騰挪優(yōu)化,運氣流選手憎亚。
- 注:文章發(fā)表時還沒有答辯员寇,最終成績也沒確定。之前寫過答辯的攻略第美,我對答辯雖擅長卻越發(fā)無感蝶锋,這種態(tài)度就容易降名次,甚至答辯前就公開了這篇文章什往。標題說自己是第2的方案扳缕,萬一答辯完后只有第5不要覺得我沽名釣譽了。真正好的方案是接受時間檢驗的,為了創(chuàng)新而創(chuàng)新是不對的躯舔,為了讓自己顯得創(chuàng)新而硬說自己創(chuàng)新是更不對的驴剔。平心而論,我覺得此次的方案平平無奇粥庄,若要找出什么出彩的地方丧失,我比較喜歡數據增強那一環(huán)節(jié)。
任務背景:
- 部分商家通過刻意點擊熱門和自家東西來讓推薦系統(tǒng)誤以為二者是高度相關惜互,從而蹭到了熱點布讹。感興趣可以搜索co-visit attck of recommentation system,很多論文還介紹了其他攻擊方法训堆,挺有意思描验。
框架
整體涉及到的框架較多,參賽完讓我獨立開發(fā)還是做不到蔫慧,但至少有個模糊的概念挠乳。本次使用的組件主要有:flink AI flow,occlum姑躲,cluster serving睡扬,kafka等,下面是我畫的一個結構圖:
數據
很多特征和模型的改進黍析,需要匹配以相應的工程改進卖怜。但是數據處理,是可以直接提現(xiàn)的阐枣,所以我做了一些樣本選擇马靠、數據增強的工作。在那之前蔼两,我可以說一下我對業(yè)務的理解甩鳄。我的設想是某些用戶其實才是檢測的重點,因為像我一樣天資愚鈍额划,根本想不到這種抱大腿的攻擊方法妙啃。為了讓系統(tǒng)推薦自家商品,能想到連續(xù)點擊熱門商品和自家商品的人俊戳,了不得揖赴。所以一開始,我就把重點放在了用戶特征上抑胎。
初賽線上有100萬訓練數據燥滑、10萬測試數據,可以下載的有50萬訓練數據和5萬測試數據阿逃。作為一個分類任務铭拧,首先查看其類別分布:
- 50萬訓練集:負樣本450000赃蛛,正樣本50000
- 5萬測試集:負樣本45000,正樣本5000
證明測試集是經過精確采樣的搀菩,所以正負樣本比例完全一致焊虏。然后就是查看ID類,物品ID分布如下圖秕磷∷斜眨可知,大多數測試集都是新的item澎嚣。
用戶ID分布如下圖疏尿,大多數測試集中也都是新的測試集。同時易桃,業(yè)務中其實對用戶ID可以建立黑名單和白名單制褥琐,因此針對user ID可以有更多的操作。建立特征時晤郑,也可以考慮id的歷史成績敌呈,畢竟一些ID可能都是種子選手了。
ID的時間關系造寝。去掉visit time為負數的訓練樣本后磕洪,可知大多數時間都在1-10萬左右,最大時間409599诫龙,總樣本50萬析显,可知很多樣本是同一時間的。
而測試集時間签赃,大多都在90萬以上谷异,證明中間還是間隔了不少時間的。最小時間:114054 最大時間:950485锦聊。因此可以部分得出結論:測試集幾乎都是新的樣本與物品歹嘹,在一段新的時間,對模型泛化能力要求較高孔庭。
同時初賽提供了75個匿名特征尺上,復賽152。其中前m個是商品特征史飞,后面的是用戶特征尖昏。所以如何確定這個m呢仰税?根據其獨特個數來判斷即可构资,如下代碼所示。同時可以看出即使是同為商品特征陨簇,也可以分為大概兩組吐绵。一組的nunique大概是20左右迹淌,另一組大概是70左右。大概可以想象提供的數據大概是embedding數據和count己单。nunique大概就是類別個數唉窃。在embedding中,同一個類別還是對應著同一個embedding數據纹笼,其中embedding維度就是70對應的維度個數纹份,肉眼可見大概embed_size是15,而類別個數則是70廷痘。同理蔓涧,另一組對應的embed_size也是15,類別個數則是20笋额。
而對測試集而言元暴,同樣可知embed_size當然是沒有變的15,而類別則不同兄猩。測試集中一個類別數量為50茉盏,一個為8。至于這50和8與訓練集是子集或非集枢冤,需要向數據挖掘中的frenquency encoding一樣涩维,把訓練集和測試集合在一起再計算一次。
同時拳亿,后半部分為用戶特征漓库,同理可以畫出用戶特征的nunique。
比較奇怪的地方出現(xiàn)了趟咆,在測試集中用戶的類別比訓練集中還要多添瓷。
因此首先區(qū)分用戶特征和商品特征。畢竟感覺賽題方提供的是半匿名數據值纱,告訴了籠統(tǒng)鳞贷,但是如何進一步區(qū)分則需要對數據進一步深挖才可以。這道題目既然給了user特征和item特征虐唠,可以參考的方法就有點擊率預估搀愧、文本匹配等大方向。點擊率預估中最重要的特征可以有類別count特征疆偿、目標編碼特征和embedding特征咱筛。
我覺得自己做的比較有意思的部分就是數據增強了。主要借鑒了推薦系統(tǒng)和對比學習中杆故,對正樣本和負樣本的重視迅箩,嘗試了一些操作。
模型
模型比較簡單处铛,我最終用的就是常規(guī)的雙塔模型饲趋。雖然也嘗試了各種優(yōu)化拐揭,但還是最開始的簡單模型效果最好。詳情可以參考我的十月比賽流水奕塑,里面詳細記錄了我每天的想法和操作堂污,應當是這些特征本身已經比較強。
我的第一部分優(yōu)化是細節(jié)優(yōu)化龄砰。增加交互特征F1確實提分了盟猖,但是導致延時多了不少,因此得不償失换棚。SE沒起作用扒披,反而是加個BatchNorm和Dropout好用的不得了。
第二部分優(yōu)化是增加多任務圃泡,自編碼任務優(yōu)化碟案。自編碼部分使用100萬數據,分類部分使用10萬數據颇蜡。本以為這個AE-DNN可以有所作為的价说,但其實沒啥效果。
訓練細節(jié)和上分路徑如下风秤。分層學習率鳖目,label smoothing都是起作用的。
結論部分缤弦,當然是自夸一波领迈,自己人就不多說了。
開源代碼
開源代碼地址:https://github.com/LongxingTan/Data-competitions/tree/master/tianchi-flink-aaig
謝謝關注碍沐,我是YueTan狸捅。