Kaggle之路,與強者為伍——記Santander交易預測


Kaggle——Santander Customer Transaction Prediction 原題鏈接

題目 Description


預測一個乘客在未來會不會交易,不計交易次數,只要有交易即為1,否則為0.

Identify which customers will make a specific transaction in the future, irrespective of the amount of money transacted.

You are provided with an anonymized dataset containing numeric feature variables, the binary target column, and a string ID_codecolumn.

The task is to predict the value of target column in the test set.

Data


提供了 \(200k \times 202\) 的數據,200維的特征,通過EDA發現特征向量基本服從高斯分布,且各個變量之間是獨立的,疑似經過 PCA 處理后的特征。target為0 和 1,其中處於1的占比為 0.1117,不平衡現象明顯。

測試集為 \(200k \times 201\),含有一行ID,與200維數據。目標為預測該用戶的target(0/1)

1nd 解決方法


discussion鏈接

共使用600個特征,使用agumentation技巧擴充數據集,2.1NN/1LGBM融合。

magic特征為unique特征,作者稱其通過EDA觀察 LGB 樹發現其只使用unique特征,從而注重挖掘數據的unique信息。並根據其出現次數構建了5個類別:

  1. value在 target=1 的train data中出現多次
  2. value在 target=0 的train data中出現多次
  3. value在 target=0和target=1 的 train data中都出現多次
  4. value在train data中只出現一次
  5. value在train data和test data(僅包含真實數據) 中都是unique

由此可以構建200個特征(對每個原始特征transform),另外200個特征是數值特征,其將test+data中的unique數據替換為特征的均值。在沒有處理掉fake時,作者用前200個特征用LGBM取得了0.910LB(大致前進0.09),增加后200個特征后取得0.914LB。處理掉fake之后,用LGBM取得0.921LB。

具體來說:作者使用10折交叉驗證,並用不同的seed並在最后進行融合。采用augmentation技巧,即將同樣target的行的特征進行shuffle后作為新的數據進行預測,對target=1的數據進行16次shuffle,對target=0的行進行4次shuffle,同時相應打上偽標簽(test數據也被加入到里面進行訓練,其中前2700個被設為1,后2000個作為0),用LGBM預測,0.92522 LB。

作者同時訓練了一個NN模型,將 val 特征的原始value,unique類與數值特征先映射到embedding,可以構建200個embeddings,然后將200個embedding加權平均在輸入到一串全連接網絡中導出最終輸出。加權的思想類似與attention,加權權重為前置的一個獨立NN模塊,這樣保證最終每個特征用同樣的方式訓練。訓練時對每個batch進行獨立的augmentation,結果為0.92497PB,再把 test 加入訓練后,0.92546PB。大致掃了下作者的源碼,NN的全連接為32層,頻繁使用小量的dropout(0.08)和 BN 層。NN的好處是可以提取到特征之間的關系,以及特征內部數據之間的group關系,同時NN需要訓練的超參數更少。

2nd 解決方法


discussion鏈接

1. 移除fake測試集,保留100k的真實測試集,真實測試集的定義為其存在僅出現 1 次的特征,fake行是真實行拼湊起來的,會對結果造成影響。
2. 同時對訓練集與測試集的各個特征進行標准化處理
3. 構建頻率特征,按照小數點精度,構建4種頻率特征
4. 將每一個原始特征與其頻率特征取出來進行拼接,並增加類別特征(200個類別),構成新的訓練集,在這種情況下相當於僅用原始一個特征來進行訓練,而原始每個特征都是均等的(獨立性假設)
5. 用 lightgbm 訓練和預測
6. 將200個預測結果進行拼接,拼接公式見公式5
7. join真測試集的預測結果,將假測試集的結果置為0,進行提交

該參賽隊伍代碼鏈接

#1 解釋: magic之一,在查看訓練集與測試集的unique計數分布時,發現二者存在較大差距,所以測試集由真的測試集與假的測試集組成,假的測試集是防止用戶進行LB Probe,真的測試集用來評分。假的測試集是真測試集拼湊的,所以特征不唯一,以此來排除它。運用該magic,大致可以從0.901提升到 LB 0.91,PB 0.907

#4 解釋:用單個特征來進行預測,可以有更多的訓練數據(\(200k \times 200\) 行),訓練時對單個特征的關注度也更高,個人理解該方式與比賽期間的augmentation技巧類似。

原始的單個特征為 value
通過 round+計數 擴展特征,最后再加上 特征類別(200個類別),形成的新的train數據為:
value, count_org, count_2, count_3, count_4, varnum ---> target
test數據集做同樣處理

#6 解釋:假設單個特征是依 target 獨立的,也即滿足下述假定:

\[f(n)= \begin{cases} P({\bf x} \,|\, y=1)= \prod_i P(x_i \,|\, y=1) \\ P({\bf x} \,|\, y=0)= \prod_i P(x_i \,|\, y=0) \end{cases} \tag 1 \]

我們的目標是由 \(P(y=1 \,|\, x_i)\) 導出 \(P(y=1 \,|\, {\bf x})\),其中 \({\bf x} = \{x_1, x_2,\dots,x_{200}\}\)

\[\zeta = \frac{P(y=1 \,|\, {\bf x})}{P(y=0 \,|\, {\bf x})} = \frac{P({\bf x} \,|\, y=1)\cdot P(y=1)}{P({\bf x} \,|\, y=0) \cdot P(y=0)}=\frac{P(y=1) \prod_i P(x_i \,|\, y=1)}{P(y=0) \prod_i P(x_i \,|\, y=0)} \tag 2 \]

按照訓練集的統計,可設

\[\lambda = \frac {P(y=1)} {P(y=0)} = \frac 1 9 \tag 3 \]

同時由朴素貝葉斯可知:

\[\begin{align} &P(x_i \,|\, y=1) = \frac {P(y=1 \,|\, x_i) \cdot P(x_i)}{P(y=1)} \tag 4 \\ \zeta & =\frac 1 9 \cdot \prod_i \frac {P(y=1 \,|\, x_i) \cdot P(y=0)} {P(y=0 \,|\, x_i) \cdot P(y=1)} \\ & =\frac 1 9 \cdot \prod_i \frac {9 \cdot P(y=1 \,|\, x_i)} {P(y=0 \,|\, x_i)} \tag 5 \end{align} \]

3nd 解決方法


先取出測試集fake 數據,再把train和fake拼接在一起,然后做特征工程,其使用了unique計數、密度(count平滑后的結果)、前二者相除,故共800維特征。用LGBM訓練,取得0.9225 LB,作者觀察到單用一些特征訓練的auc接近0.5,對最終的結果沒有什么幫助,所以采用 Lasso 來自動削減該類特征。CV時優化了reg_alpha, max_bin, learning_rate, num_leaves 4個參數。

作者關鍵性的操作是用 CNN 進行二階段的訓練。將LGBM的預測結果作為一個特征加入到CNN中,對每個特征列保持相同的卷積核,最后再連一個全連接層,在NN里使用BN避免過擬合。最終平均7個CNN的結果作為最終結果。

其它magic


有看到可以通過將特征列 groupby 后求 方差var,並將方差加減原特征構成新的特征,400維統一放入到 lgb 中訓練,當同時考慮加減並消去 fake 后可以取得 0.922的成績。其實是變相的count,因為在groupby之后,unique的數據方差為0,只有count數較大的值才會有方差,anyway,也是一個比較有趣的思路。

收獲


第一次嘗試參賽,在末尾幾天開始入場,自然沒打算去取得好成績,主要是瘋狂去追 kernels 和看 Discussion,在比賽時段看和在結束之后看是兩種不同的心態。在比賽結束之前,大部分人是比較焦慮的,Discussion 里有很多人發言,但是你也不能確定他們的idea是不是對的,只能用自己的知識和實踐去推斷,在這一期間,務必要保證自己的理智,多嘗試與創新,而不要被誤導到去鑽牛角尖!在比賽后要做好比賽的回顧,因為比賽后有很多人會公布他們的思路和代碼,這個時候就要去潛心學習下比你做的好的人的做法,反思不足,這樣才能爭取在之后的比賽中更進一步。


最后推薦幾個kernels:

  1. 第一名的 kernel鏈接
  2. 號稱actual winner的最早fake test提出者:kernel鏈接 ,可以說比賽時注意到這個kernel,銀牌不是問題了
  3. 參賽期間看得一個kernel ,里面包行augmentation,代碼風格不錯,讀起來挺舒服,可以在此基礎上做自己的修改與嘗試
  4. 第三名的 kernel鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM