kaggle Talking Data 廣告欺詐檢測競賽 top 1%方案分享
kaggle Talking Data 廣告欺詐檢測競賽 top 1%方案分享
今天kaggle Talking Data結束了,開榜前踩著金牌最後一名提心弔膽,最後雖然選的結果是第7好的,但還是前進了3名。private榜單上排14,看了下單模型也有進金區的,這次比賽還是CV比較重要,trust local cv應該是每個kaggle玩家的座右銘了,上次toxic從10名掉下來,也是吃了這個的虧。當時感覺訓練和測試分布不同,就全靠梭哈了。最後果然GG。
這次也是跟@砍手豪學到了很重要的一點。
億級數據踩坑
先講一下我們的比賽策略吧,我和砍手豪確定組隊之後,就開始擼代碼調bug的艱辛一周,他把基礎框架搞定了之後,我就開始做了一些對於針對大數據量的優化,發現踩了很多坑。這裡還是想分享一下,這些東西不算數據敏感性這種內功,招式還是很容易學到的。
- 1.pandas的dataframe在連接列的時候,如果你使用pandas.concat(["column1","column2"], axis = 1)就會變得超級慢,有多慢呢,我估計是O(nlog(n))的複雜度,目測考慮了兩個index排序,然以用O(n)插入。所以如果你能保證有序的話,完全可以用dataframe的列賦值。
- 2.還有個坑是大數據量的時候,你可以根據整數類型,浮點類型的範圍減少位數,比如用uint8, float32之類的代替int32,float64
- 3.還有一個lightgbm轉換dataset的時候非常耗費內存,可以把數據load save一下
train_data_v1.save_binary(train_v1.bin)train = lightgbm.Dataset(train_v1.bin, feature_name=predictors, categorical_feature=categorical)
- 4.最後就是可能大家用了多進程multiprocessing來加速,調用pool.apply_async(XX) 之後get_result()會面臨一個觸發這個bug的問題,看了下開發issue列表,大家覺得這個不是正常人的需求,就沒有搞這個。解決這個問題的方法就是, result.to_hdf()然後read回來。這樣就巧妙地避開了,而且這樣也有利用disk加速的好處,hdf5的io還是很快的。
上面都是億行數據在特徵維度變高的時候踩得坑。改bug和優化pipeline用了一周的時間,弄完後,我們就跑出了一直到比賽結束的最好的單模型大概就是單模型 private 0.9830264,所以說後面大多是沒什麼idea之後的特徵篩選關於模型精度提升的驗證試驗,融合之後也沒太大提升。
CV策略
CV策略也是很關鍵的地方。極大地縮短了我們快速驗證特徵有效性的實驗次數。
如果把這個數據集掐頭,然後調整時差後就是完整的4天數據。如何利用四天數據做好一個線下驗證就很關鍵,解決了這個問題,你的線上線下基本就同步了。
所以我們做了三個策略。
- 階段一,特徵構造的時候只選含public的三個小時,用這部分數據可以粗略地篩除一部分特徵,比如跟小時的統計值相關的,一部分跟天相關的,畢竟是一個下採樣,而且不連續。所以這一部分完成後,用了大部分特徵進入第二階段。
- 階段二,訓練集改成第8天,測試集第9天,這樣可以保證一天內連續,可以做關於小時的特徵,以及連續時序,時間窗上的特徵,帶來的問題是,day的信息丟失了,然後這部分做完了,特徵多了起來。進入第三階段
- 階段三,就是完整的78訓練,9天驗證了,根據相關性和特徵重要度做進一步的特徵篩選,修正模型在數據下採樣上的偏差。讓模型更魯棒。以及增加時間粒度的實驗。
- 階段四,最終提交的時候,根據78訓練,9驗證的earlystop盲打,輪次變為1.1倍,直接梭哈
關於NN和FFM的實驗
其幾天在美團跟eureka大佬聊天的時候,他說起之前的CTR/CVR比賽都是ffm起了很關鍵的作用,為什麼這次不行呢,反而成了GBDT的天下。我當時覺得欺詐預估的問題與一般的ctr/cvr的明顯區別就是建模user的困難,user會變化ip,設備,偽裝自己,這樣造成了user的隱變數的穩定性不是那麼魯棒。不過微軟的Lightgbm真的很強,對catgory類做了很多優化,不用one-hot直接fit,關於這一塊的原理,我也十分好奇,在好幾個地方問過了,我記得有人跟我說是直方圖弄概率分布啥的。這一塊有大佬可以在評論里請指教一下。
NN我們做了大概public在9806private9820左右,不過最後融合沒有使用。模型比較關鍵的地方就是交叉熵要做一個加權,讓模型訓練的時候多關注一下正樣本,畢竟CTR裡面正樣本十分稀少而珍貴,解決數據不均衡的問題就比較關鍵。我自己做了一些FNN,PNN,網路寫FM,DeepFM,deep&wide的實驗,效果也一般,最後精力也沒有放在這裡,不過作為彈藥庫儲備還是可以的,以後的比賽可以用上。
特徵工程
特徵工程的思路,這一塊也是跟前排拉開差距的地方,真正的大佬完全可以用方法和特徵對你完成降維打擊,網路的出現讓特徵工程變的弱化,但是在這種非同秩數據上,特徵工程才是制勝法寶。這也是我相對深度學習更喜歡數據挖掘的原因,數據挖掘中關鍵的一步,特徵工程會更讓你理解數據的本質,讓你理解什麼是同分布,什麼是過擬合,什麼是模型的bias。網路確實在同秩數據上諸如圖像文本語音有一定的優勢,但是那種對於結構反向解釋,馬後炮的感覺讓人很難受,或許是距離真正的深度學習大佬差的太遠,還沒辦法深入理解網路的原理。
我們這塊特徵工程大概就是學習了之前CTR的方案,特別感謝piupiu植物們的開源,讓我們受益很多。推薦排序的建模方法也是從piupiu的摩拜單車地點預測開源方案學到了,後來這個方法用到螞蟻金服的商鋪賽題上,對推薦系統的建模,負採樣策略有了更深刻的理解。
關於我們這裡的feature,砍手豪整理了一個關於CTR問題的通用特徵文檔,非常詳細,我這關於版權的問題就簡要描述一下。要是有可能的話,公眾號可以請他出一期分享~
我們大概做了的特徵,basefeature,歷史CVR,歷史轉換次數,時間窗(day,hour,quater,half hou,3min)各個維度的統計值(count, unique, max,var),連續點擊時間間隔,各個維度的排序,以及一些二階統計值,這部分比較關鍵,對app和channel的刻畫重要度都非常高,還有一些user活躍持續時間,活躍頻率等等,感覺特徵也比較基礎。沒有什麼特別出彩的地方,對數據的理解還要看前排大佬的分享。
有一個比較有意思的地方是賽後植物說關於修正同樣樣本預測值的trick,這是一個明顯的訓練和測試數據不同分布的例子,訓練集中正樣本都出現在了開頭,植物的trick把除了最後一個抹0,public上了,private降了,第四名就從這角度,把訓練集重排了下,提了四個萬分位。高手還是高手,這種數據敏感性真的很強。
最後總結一下,一定程度上(只針對監督學習的問題),模型和方法都是招式,數據敏感性才是內功。時刻牢記trust local CV。沒有任何一個模型可以用樣本代表整體,用一定程度的採樣代表全世界。如何減輕bias,這不僅僅是數據競賽的關鍵,也算是論文數據集可信度的關鍵吧。在我看來,只有imageNet這樣規模足夠的數據集檢驗下,模型才有一定的信度。很多人都是在老生常談這個trick在提高數據集,那個trick提高數據集。重劍無鋒,大工不巧,同秩數據,沒有什麼trick不trick,只有萬變不離其宗的樣本刻畫方式,換句話說,就是如何把樣本映射到向量空間,以及如何讓模型在樣本空間中尋找解。深度學習在試圖解決這個過程的自動化,一定程度上,還是有多人工就有多少智能。當然真正的大佬,是可以從方法的革新上對你進行降維打擊,讓你懷疑全世界。比如alexnet之於ImageNet,svd features,ffm等之於Netflix,現階段的xgboost,LGB等等。希望也能成長為給問題造新輪子的人,而不是檢驗輪子的人。最後謝謝隊友們的堅持~started from the bottom.
推薦閱讀:
※用戶畫像——搜狗用戶挖掘:文本分類
※怎樣理解時間序列二
※大數據的誤區,看易經呈現給人類的大智慧
※Kaggle Titanic 生存預測(Top1.4%)完整代碼分享