Santander是西班牙的桑坦德銀行,作為主辦方在kaggle上舉辦了他們的第二次匿名數據競賽,參加隊伍數高達9038,反作弊檢查之後剩餘8800,總人數超萬人,這是kaggle歷史上參賽人數最多的比賽,和隊友用最後一週半的時間,拿下了12/9038,按照他們PR的一貫套路是華人第一,然而並沒有什麼意思。在結束後寫點乾貨,讓你儘快找到競賽中不一樣的東西

Santander Customer Transaction Prediction

匿名數據競賽,顧名思義,匿名數據競賽是所有變數喪失原有的業務含義,所有變數可能經過了脫敏變換。選手很難從業務角度去尋找突破口。整個比賽非常刺激,大家都在沉迷於尋找magic,於是乎我也手癢癢,加入其中。尋找Santander留在數據海洋中的one piece。

今天讓我們抽絲剝繭,還原一下案發現場,華山論劍,看各路Grand Master過招。(在這裡順便祝賀我的朋友 @砍手豪 拿下了GM,現kaggle全球排名14 / 1 millon +,有感興趣的獵頭可以私信他了)

說起數據敏感性,可能每個投演算法工程師的人,在校招簡歷上都會寫「數據敏感」,這是個玄而又玄,就像責任心強一樣...拋開玄學和自吹自擂,如果你和我一樣,沒有所謂的敏感性天賦點加成,能否通過嚴謹的推論,數據分析,畫圖,從現象看到本質呢?

讓我們一起看看,藏在數據海洋中的one piece到底是什麼。

線索一: GBDT的參數和收斂現象

GBDT的參數和現象表現的很奇怪,具體有如下,收斂很慢,0.001的學習率下,兩萬多輪收斂。過擬合非常嚴重,在train上高達auc==99+,驗證集的auc又不高。 earlystop非常大。似乎表現出非常強的非線性。

線索二: 從特徵的KDE看起來似乎很簡單

看起來似乎非常規整的分佈,在圖上某個範圍表現出非常強的可分性。跟我們第一條的推論衝突。大部分如下圖所示,隱隱約約感覺一+二能發現點什麼。

線索三: shuffle數據不影響結果

初步推斷,特徵之間正交,幾乎沒有corelation。印證方法,對每個變數分開算模型,然後連乘,用樸素貝葉斯的方法,幾乎不影響性能。

線索四:全部是float,部分表現出高頻重合,似乎又滿足稀疏category的特性

似乎包含某些頻率隱藏之下的信息,至少沒有表現出來都是浮點數的特性。

線索五:測試集裡面有人造數據

製造方法已經被大佬公佈,具體可以參照鏈接。(這個人真是太厲害了,簡直是個天才)。

下面進行推理,結合實驗進行驗證。

線索一 + 線索二:表現出非常強的非線性,然而kde又非常漂亮。魔鬼隱藏在細節之中,kde這種基於估計的方法,如果窗大小太小,細節會被抹去,我們畫圖觀察一下高頻的局部細節。

問題出現了,正態分佈中間出現了不少低頻,這些低頻似乎有所共性。從信號的角度來講,雜訊符合低頻,方差小,平穩的特點,我們做一些實驗。我們通過把所有count==1的幹掉(替換NaN)。

通過在訓練集上測試,我們終於突破了902,不過似乎並沒有LB上表現的那麼強勁。加上test會變得更差。等會,別忘了test中有些假數據,幹擾了統計,幹掉他們,這時候已經發現了一半的magic,基本可以踏上新航線的征途。

如果說這樣你很難理解,那麼讓我通過可視化的方法,福爾摩斯之思維殿堂來還原一下案發現場。

於是你畫出了如下的圖。

嗯,看起來很好,很簡單,正負樣本分佈不同,直接懟進去。

好了,恭喜你,用盡一萬種方法,還是baseline的水平,超越不了901。

如果你結合線索一和線索二,仔細想一下,我們打開了顯微鏡,於是畫出了如下的圖。

等等,正態分佈的中間為什麼摻雜了低頻,他們的統計意義是否足夠強?模型為什麼在這裡糾結了那麼久才收斂,而且那麼容易過擬合?

真相就是,低頻,有著不同的表現。我們已經處理過count==1的情況驗證了。

我們把count 和 value 還有target一起畫出來聯合概率分佈。

好了,真相浮出水面,p(target|count)表現出了一定的線性。p(target|count,value)刻畫的不錯(顏色成團,不是隨機)

那麼接下來問題來了。

1.結合我們對count==1的處理,那麼這些count >= 2的就真的一模一樣嗎?

2.這些count 都等於1的在峯的左邊和右邊真的一樣嗎?

3.低頻區和高頻區的count==1真的一樣嗎,答案顯然,不一樣。

讓我們嘗試通過特徵工程仔細刻畫一下。

那麼接下來的問題是,特徵工程到底是什麼?如何做呢?

答案:把模型看不見的東西,通過feature表現出來。一般情況下,會用非線性三個字概括。

這裡的非線性存在於哪裡呢?

答案:低頻區域的低頻和高頻區域的低頻都有所不同,峯的左右都不同。

所以,我們選擇的刻畫方法是,count / dist 這樣一個交叉特徵衍生構造。這樣就能表現出低頻區域和高頻區域的count特徵的不同。

dist可以選 var-var.mean/max/median/mode/cumprob/1-cumprob。用這三些可以突破923,仔細做做就能突破924甚至925。

至此,你大概能體會到,如何通過模型反饋,EDA來做一些分析,然後再反饋到特徵刻畫,最後再用來提升模型。

總結一下,無非三點。

1.fake data幹擾了統計(特徵的正確性)

2.真實浮點數頻率背後隱藏了信息(模型無法學習直方圖的列高,只能學習橫軸,理解一下)

3.頻率和距離的交叉會衍生出更好的刻畫。(count千篇一律,magic萬裏挑一)

其實還有第四點

4.控制模型,讓GBDT的學習,儘可能優先地在他的衍生和他的原始值上進行。或者是對單個特徵和他的衍生單獨建模

這個手法表現出來就是,有一個kernel,把count==1替換掉,複製兩倍(影響了採樣率),效果會特別好。

關於論壇上值得看的,我覺得是這個。這個題決定金牌的是magic的特徵/參數/模型,決定能不能拿獎金的是NN。其他的都差不多,不過大家分析的一些奇怪的現象和實驗,都可以復盤一下,收穫很大。鏈接如下

NN wo pseudo, 1 fold seed

一家之言,歡迎拍磚。

感謝隊友,daishu,thluo,Q。

推薦閱讀:

相關文章