ATEC螞蟻金服支付風險大賽初賽經驗分享
來自專欄聊聊大數據及機器學習演算法1 人贊了文章
大賽背景
基於移動互聯網的線下支付、保險、理財等新金融業務快速發展,互聯網金融行業不斷突破創新。與此同時,潛伏在網路暗處的黑產勢力也不斷升級,並威脅著整個行業,其中以信息泄露導致電子賬戶安全最為嚴重,並且愈演愈烈之趨勢。黑客竊取的用戶信息包括社保號碼、地址、信用卡信息等,並利用這些泄露信息嘗試登陸盜取賬號資金或盜刷銀行卡,直接導致銀行和第三方支付公司的用戶蒙受大量經濟損失。
此背景下,螞蟻金服本次大賽希望圍繞信息泄露導致賬戶安全威脅為課題,面向行業徵集最智慧的安全解決方案,引領互聯網風控核心技術發展。
大賽的地址:螞蟻金服支付風險大賽
該地址有相應的試題介紹和數據下載。
初賽
首先拿到數據,300個特徵,標籤名稱都沒有,直接全部丟到lgb模型裡面,按照默認參數,跑了一個baseline,成績0.27,感覺還不錯。
接下來按照常規流程先進行數據探索。
數據探索
先看訓練數據集標籤,極不平衡。
標籤分布如下:
因此,當時就考慮可以採用常用的處理非平衡數據集的方法。
然後就查看了下數據的缺失分布:
發現特徵的缺失具有共性,基本上可以認為具有同樣缺失數量的特徵由一個原始特徵衍生而來。
所以
- 篩選特徵第一步:特徵缺失值較多的可以考慮拿掉,我初期是拿掉缺失80%以上的特徵。
然後看具體的每個特徵的數據分布:
利用上面的方式可以查看每個特徵在正常樣本和非正常樣本上的分布差別。
- 篩選特徵第二步:如果分部趨近一致,說明該特徵提供的增益有限,可以將該部分特徵拿掉。
再分析特徵的相關特性:
重點分析了缺失值相同的特徵,查看兩兩特徵之間的相互關係。
之後對特徵做相關性矩陣:
- 篩選特徵第三步:將相關性高於0.85以上的特徵拿掉。
最後,參考了論壇里大家的一些方法,把訓練集和測試集的數據分布放一起看數據的風險分布變化:
def drawDp(data,data_test,feature): data[feature].fillna(-1,inplace=True) data_test[feature].fillna(-1,inplace=True) sns.set_palette("hls") mpl.rc("figure", figsize=(9, 5)) fig_set = data[feature] sns.distplot(fig_set,bins=10,color= r,norm_hist=True,label=data) sns.distplot(data_test[feature],bins=10,color=y,norm_hist=True,label=data_test) return
紅色為訓練集分布情況,黃色為測試集分布情況。分布差異較大的特徵可以拿掉,如上圖的f20和f266。
訓練集和測試集分布較近似的特徵,可以考慮保留。
- 篩選特徵第四步:將訓練集和測試集分布差異較大的特徵拿掉。
經過以上四步驟的篩選,能七七八八篩選掉一些特徵,接下來就可以嘗試不同的模型訓練過程。
嘗試方法
lgb調參
先試下篩後的特徵,用lgb默認參數跑出來的效果,可以到0.31。
SMOTE
一般對於非平衡數據集的採樣方法有2種:過採樣和欠採樣。
過採樣對訓練樣本樣本數量較少的類別進行採樣,合成新樣本放入訓練集來緩解類不平衡。SMOTE就是比較經典的過採樣方法。SMOTE根據兩兩樣本之間的距離空間,隨機生成新樣本。這裡有一篇比較好的介紹SMOTE的文章:SMOTE
欠採樣則相反,它對訓練樣本里樣本數量較多的類別進行向下採樣,拋棄未選中的樣本,從而達到正負樣本相對均衡。
我直接調用imblearn的smote包進行訓練,結果並不好,成績甚至有下降。因此暫時放棄這個方向。
遷移學習
總結之前的思路和論壇里的經驗,可以判斷訓練集和測試集的分布並不一致,單純用經典的機器學習演算法可能並不能得到很好的結果。因此考慮了了一個比較新的方向:遷移學習。
遷移學習就是為了解決訓練數據和測試數據分布不一致的情況。遷移學習可以從現有的數據中遷移知識,用來幫助將來的學習。比較經典的演算法正是交大校友戴文淵大神提出的tradboost演算法。
但理想很豐滿,現實太骨感,tradoost的結果也不容樂觀。
而自己倒偶然想到了一個方法:
用過去一個月的數據訓練出來模型,做下一個月的預測;將下一個月的預測結果作為特徵放入下一個月的訓練中進行訓練,從而得到遷移的模型,做最終結果的預測。然鵝結果一塌糊塗,過擬合嚴重。。。隨棄
聚類方法
這個方法有點數據穿越的意思,我把訓練集和測試集放在一起,採用無監督學習聚類(k_means),將數據集劃分成10份樣本。分別對這10份樣本建模預測,結果可以提升到0.36,但是再提升就很困難,而且10個模型的調參太繁瑣,最後這個方法還是放棄了。
半監督學習
考慮訓練集里有一部分灰樣本,嘗試了比較簡單的無監督演算法。先用有標籤樣本訓練模型,然後用模型預測灰標籤數據,然後根據預測結果設定閾值,再講超過閾值的數據丟回訓練集訓練模型,去預測測試集。結果提升不明顯。
嘗試了種種以上方法後,成績提升仍不明顯,仍在0.37一下,感覺到了瓶頸。
百思不得其解,於是不得不重新回到數據,後來經一個哥們提醒,找到了一個牛逼的缺失比例值,用lgb默認參數train出來的結果線上可以到0.39。。。(在此,特別鳴謝這個哥們,不然很有可能進不去複賽了)
所以,不得不說,模型再好,抵不過特徵選的好。
後面接下來就比較順利了,嘗試不同的lgb參數組合,成績開始穩步提升,順利進入複賽。
初賽總結
其實也做了很多數據分析和方向方法的摸索,但是前期效果並不理想,這裡也是一個教訓:在未找到合適的特徵集合之前,隨便就切換方向其實是一種時間上的浪費。在基本的方法還未得到一個可靠的結果之前,要考慮自己特徵集合的選擇是否有問題。而在得到較為可靠的結果之後,就要多方向嘗試,試遍所有可能的方案(這是我們複賽的坑)。
複賽
複賽最終排名TOP10以內,但很可惜沒能進答辯。
詳細內容後續來寫。
推薦閱讀:
TAG:經驗分享 | 螞蟻金服浙江螞蟻小微金融服務集團有限公司 | 風險控制 |