特別提醒:以下的工作都是建模學習,而不是嚴格的比賽對比。
一個機器學習小菜雞,如何通過最新的機器學習技術,在一個大神聚集的 Kaggle 比賽中做出前 15 的成績?
Part 1
大家好,我叫小王,第四正規化的運營,機器學習的小菜雞。
今天老闆給了我一個任務,公司花了幾千萬研發出先知機器學習平臺,7 月就對外開放了,拿出去用用吧!
怎麼用呢?旁邊的同事小澄是資料科學家,他每天都有很多業務做,據說國內好多知名的網際網路公司,背後的個性化推薦系統都出自他的手筆。只是平時小澄比較低調,大家都不知道。
但作為一個運營,我是既沒有資料,也沒有場景,我該怎麼辦?
對了,去 Kaggle 吧!
Kaggle 是一個資料科學家的社群,裡面有非常多的比賽案例,尤其是很多經典比賽,那是大神雲集,其中也產出了很多對工業界有深遠影響的演算法和工程實現方式。
抱著花了幾千萬研發出來的寶貝,選個最經典的比賽吧,就 Criteo Labs 舉辦的 Display Advertising Challenge 好了。
這個比賽是關於點選率預估的比賽,它在很多機器學習的場景,例如計算廣告、內容分發、電商推薦等都是非常有用的。而這個比賽的舉辦方也是誠意十足,資料都是脫敏的,總共有 4500 萬行,特徵包括 13 個數值特徵、26 個類別特徵,評估指標是 Logloss。
所以它可以說是點選率預估問題上,最知名的一次比賽了。該比賽總的引數隊伍有 700 多支,KDD Cup 的一些歷屆冠軍也來參加了。
當然,KDD Cup 的冠軍們幾乎拿下了前 15 名,《計算廣告》的作者之一王超對排名給出了說明。(注:下圖的本人是指王超)
那麼多大神的比賽,作為小菜雞的我,能做好嗎?
Part 2
不管了,試試吧!
Step 1:上傳資料
首先我開啟了先知平臺,把比賽資料(criteoKaggle 是我們內部對資料的命名)拖了進去,大小是 2.03 GB。
上傳時間很快,不到 10 分鐘就都上去了。
Step 2:瞭解資料
看一眼資料,果然是脫敏的!反正我任何套路都看不出來。
對於資料的解釋,Kaggle 很是輕描淡寫:
Label,1 代表點選,0 代表沒有點選;
I1 到 I13 是數值特徵;
C1 到 C26 是類別特徵,已經做了雜湊化;
當資料缺失的時候,以 empty 代替。
Step 3:資料拆分
由於不知道怎麼對資料拆分,我用了 IJCAI 2017 的論文,DeepFM: A Factorization-Machine based Neural Network for CTR Prediction 中對該比賽資料的處理方式,按照 9:1 的比例,隨機拆分成訓練資料和測試資料。
Step 4:特徵工程
我想既然 Kaggle 那麼輕描淡寫的解釋資料,那我也輕描淡寫的做特徵工程吧!
I1 到 I13 是數值特徵,都連續化就好了,類似這樣:
f_col_10 = continuous(col_10)
C1-C26 是分類特徵,離散化吧,類似這樣:
f_col_38 = discrete(col_38)
然後把 Label 填上,特徵工程搞定!
label = label(col_1)
Step 5:模型調參
這是個二分類問題,所以要選擇分類演算法。由於完全不懂資料什麼意思,人工特徵的方法幾乎無效。
而如果要提取並使用多層次特徵,就需要靠機器了,所以我從演算法庫中拖出了“線性分形分類器”,也叫 LFC。
然後是設定引數,經過兩三次實驗,我把引數設定如下:
步長 = 0.05
L1 = 0
L2 = 2.5
輪數 = 4 輪
速度優先
Step 6:模型評估
20 分鐘後結果出來了,Logloss = 0.4546629606398476,AUC =0.796。
看了下排名,大概是 33 名。
Part 3
可是,花了幾千萬研發出來的先知平臺,就做出這樣的成果?
畢竟,我是機器學習小菜雞,但先知平臺可不是呀!
不行,再調調…
首先把所有的連續值,取個 log 加入特徵,類似於這樣
f_col_2_log = continuous(log(col_2))
由於線性分形分類器並沒有做特徵組合,所以要想擬合非線性的資料,還得自己做特徵組合。
可是既然看不懂資料,怎麼做呢?用 FeatureGo 吧!
FeatureGo 也是第四正規化自主研發出來的演算法,能夠自動計算出最佳的特徵組合。
通過 FeatureGo 算了一下,最佳的特徵組合做出來了,如下:
f_combine_18_28=discrete(combine(col_18,col_28))
f_combine_20_37=discrete(combine(col_20,col_37))
f_combine_18_28_34=discrete(combine(col_18,col_28,col_34))
f_combine_20_31=discrete(combine(col_20,col_31))
f_combine_29_40=discrete(combine(col_29,col_40))
f_combine_18_20_28=discrete(combine(col_18,col_20,col_28))
由於多加了特徵,所以正則項設定大一點,L2 =5,其他引數和上面的一樣,又一個 20 分鐘,結果好多了,Logloss = 0.45010290821784604,AUC = 0.801。
再看一下排名,到第 15 名啦!
順手看一看論文的結果,比它的 Logloss 小一點,加上 AUC 高一點,心滿意足了!
Part 4
模型算是建完了,看起來很輕鬆,當然實際操作起來更輕鬆,但是背後的技術可是非常牛的。
以至於,像我這樣的機器學習小菜雞,也可以做出這麼牛的模型來。
所以我們得到了這樣的公式:
我(機器學習小菜雞) + LFC + FeatureGo + 一個週末 ≈ 世界 15 名(注:大神雲集的比賽~)
還是很激動人心的!
順便提下,剛才我用到的線性分形分類器(LFC)和 FeatureGo,是以第四正規化的機器學習工程師羅遠飛為主研發的。那個花了幾千萬研發經費的先知機器學習平臺,背後有 3 名 ACM-ICPC 世界冠軍,2 名 KDD Cup 世界冠軍得主,這些人後面做了百度鳳巢,搭建了今日頭條的推薦系統,終於憋了個大招做出了先知機器學習平臺。
現在好訊息是,先知平臺對外開放啦!
我們也是很有誠意的,剛才的實現過程已經放到了我們的平臺。當然,每個人過來跑 4500 萬的資料,對我們的伺服器壓力實在是太大太大太大了......
所以 4500 萬的資料,我們隨機抽取了 300 萬放到平臺中,其中 270 萬作為訓練,30 萬作為測試。
當然效果肯定是會差很多,跑了一下 Logloss = 0.45988947376760886,名次是 73 名。
好吧,還是可以拿個銅牌。
如果你對我們感興趣,請在這裡申請先知平臺:https://prophet.4paradigm.com
注:以上的工作都是建模學習,而不是嚴格的比賽對比。
參考論文:https://arxiv.org/pdf/1703.04247.pdf