天天看點

kaggle Santander Customer Transaction Prediction總結

記一次失敗的競賽經曆

資料分析

1.樣本不均衡。在20萬訓練資料集中,正樣本(y=1)為2萬,負樣本(y=0)為18萬。

2.所有原始特征之間相關性很小。這一點很奇怪,很少有資料集所有特征之間相關性都很小的。

3.所有特征的分布都類似。這一點也是挺奇怪,應該是主辦方對資料做了某種變換。

特征工程

1.由于這個賽題所有特征均為匿名特征且特征之間沒有什麼關聯,是以可以考慮對資料進行重新洗牌(shuffle)。對于訓練資料,分别在标簽為0和标簽為1的樣本中進行重新洗牌。即對于每個特征都進行shuffle操作,這樣得到完全不同的樣本,分别用這些不同的樣本去訓練,然後做預測,最後取平均得到最後的結果。

2.value_count特征。去除test中的合成資料後求各個特征中唯一值的個數。

3.排序特征。對數值特征進行排序。

4.相似比率特征之間的統計特征。這裡的比率為對某個特定值,求target為1的機率。然後對所有特征做相似性分析,把相似性高的特征劃為一組。如下:

kaggle Santander Customer Transaction Prediction總結
kaggle Santander Customer Transaction Prediction總結

然後對每組相似特征求統計特征。

TOP選手方案:

特征部分:

1.count特征。包括value_counts特征,至少在target=1的資料裡出現過一次的值,至少在target=0的特征裡出現過一次的值,在target=0和target=1中至少出現過兩次的值,在訓練資料集中隻出現過一次的值,在訓練集加真實測試集中隻出現過一次的值,用特征的均值去替換該特征中的唯一值(?),四舍五入後求count特征(?)(count特征應該是比較重要的一個特征,在比賽中對其挖掘的太少了,隻做了value_counts的特征)

2.把所有的特征列全部堆成一列(200000*200,1)做為一個特征,count做為第二個特征,特征名稱做為第三個特征(類别),然後用模型訓練。這個模型的得分會比較低(0.53左右),但是使用id聚合得到符合格式的結果,會得到較高的分數(0.924)。這是一個比較神奇的做法,因為這些資料都是獨立的,在使用gbm模型去訓練時,模型可能會學到一些特征的關聯關系,而實際上這些關系很可能是不存在的(因為獨立),這種方法消除了模型學到虛假聯系的可能性。

3.對特征進行标準化。

其他一些技巧:

1.神經網絡訓練技巧:添加batch norm和小的dropout,采用0.01的學習率,一個訓練周期隻使用15次疊代(epoch)。

2.在使用lightgbm等樹模型的時候,可以畫出其節點分裂圖,觀察哪些特征有用,進而幫助進行下一步的特征工程。

總結:

這個比賽總之是挺可惜的,賽後看了一下前排大佬的開源,感覺其實幾個關鍵的點都找到了,但是缺了一點堅持和運氣。心态上有些急于求成,總是想找可以上很多分的magic,而忽略了對基本操作的深入了解(燈下黑?)。多嘗試不同的模型,本題中有效的使用神經網絡也是獲勝的一個關鍵點。

繼續閱讀