熬夜幾天懸而未解的模型迷題?
問題整理
(文長慎入) 各位版友好,因為公司的要求,需參加了玉山[https://tbrain.trendmicro.com.tw/Competitions/Details/10]的盜刷比賽,其實目的不在得獎,只是在訓練模型中,有一些盲點,真的蠻想釐清的,特別是在訓練時的驗證結果和實際提交的測試結果的落差,感到非常困惑,不知起因為何,這樣也會影響到後續我們在建模時,如何評估出一個較valid的model,進到production當中?
(一) 簡要版問題:
- 想請教,如果在一個imbalance的資料集,同時多數feature都是categorical data type的情況下,如果為了要進行變數縮減,而將各欄位中,出現頻率少的category整併,會不會造在positive/negative的case,都被混合在一起,而讓這個類別不顯著。
- 如果僅針對類別特徵,進行one hot encoding,而結果會多達20多萬的特徵數,那麼是不是我自己的feature engineering(數量約10到20個),一同放在建模時,就不會發生效果?更深入討論,在Logistic/Ensemble Method/Neural Network,都是如此嗎?
- 在使用自己切割出來的validation set/test set(完全不在訓練集中,也不用來調參),做出來的分數不錯,但後續實際用考題的測試資料集做驗證,分數會低個0.1到0.2(F1 Score)?這造成了在建模當中,判斷模型是否需要調整的困難?不知道為何會有這樣的落差產生?
- 如果要針對Multi-Layer Perception進行建模,不知道是否有適合的模型設計架構?可以參考?
(二) 詳述的問題背景:
因應公司要求參加了玉山的比賽,但是目前最佳的F1-Score成績,只有0.55,而目前在leaderboard上的最佳成績有到0.69,其實志不在得獎,只是真的蠻想了解,在我設計的模型與流程上,是不是有盲點,可以再改善。
目前的資料集,總數大約有150萬筆,主要是針對盜刷的判斷。
(三) 在進行Exploratory Data Analysis時,主要有幾點:
- 盜刷的帳號與交易次數,大部份都只有一次,這意謂著無法了解進行追縱。
- 如果假定盜刷都是由同一集團所為,從每一筆盜刷的時間間隔,僅可以看出大部份都是1日,而一般正常的刷卡,則是1日或是2日以上各半。
- 除此之外,其它都是類別變數。
(四) 資料集的特色,主要有兩個問題:
第一,它裡面有許多欄位都是類別,並且每種類中,有許多的類別,出現的頻率除了少數幾種別較高外,其它都很低,大約0.01之類的佔比。
第二,資料集是非常不平衡地,positive case只佔了0.013。
(五) 目前進行特徵工程與模型的設定,與結果如下:
- 直接將所有欄位的類別,進行one hot encoding,最後得出的總數會有20多萬筆欄位的sparse matrix。
- 針對僅有的數值型欄位,進行Binning成幾組。
- 針對每一類別欄位,先進行logistic regression, 找出每個欄位中,顯示的類別,進行重編碼為1,而不顯著地,為0。
- 以模型而言,邏輯斯模型的成效或是利用簡易的Neural Network(架構僅兩層,外加dropout),均較RandomForest/Xgboost的效果好。
- 以建立訓練樣本來說,將positive case進行over-sampling,讓正/負訓練樣本的比率是1:1或是1:2的方式進行訓練,這樣在validation set的效果,都會比使用sklearn當中的class-weight或是使用Xgboost當中的sample-weight效果來得好。
- Validation set也採用兩種方式評估,一種是同樣1:2的正/負比,進行confusion matrix,一種是使用原母體比率0.013:1的方式,進行評估。
- 最後則是在Probability Threshold上的調整,透過手動調整的方式,來找出適當的threshold的數值。
(六) 進行dimensionality reduction:
- 我曾經嘗試使用降維,利用TruncatedSVD()函數,但是發現以降維到100個features來說,其表現比使用one hot encode的成果還差。
- 但是如果我想增加feature數量到1000,那我的jupyter notebook就會爆出MemoryError,或是iteration的時間要非常久。
(七) 目前遇到的難題:
- 其實我仍然希望用降維的方式處理,因為剛剛上述的模型,以直接one hot encode的方式,20多萬的欄位,其實訓練的時間要非常久,而且也沒辦法進行調參,每一次的測試都很花時間。
- 但是如果直接利用TruncatedSVD()降維,又會遇到時間太久,feature數量不能設定太多。
- 如果要透過手動,將要出現頻率少的類別,進行整併,不確定這樣是否會讓一些盜刷會發生在的類別,就和一般正常類別混和在一起,而看不出來顯著。
- 如同前面所述,在使用自己切割出來的validation set/test set(完全不在訓練集中,也不用來調參),做出來的分數不錯,但後續實際用考題的測試資料集做驗證,分數會低個0.1到0.2(F1 Score)?這造成了在建模當中,判斷模型是否需要調整的困難?不知道為何會有這樣的落差產生?
- 不確定是否這類問題,真的有必要使用非線性的模型,例如Neural Network,而使用的話,其適合的設計架構為何?
如果有版友願意提供建模上的經驗分享,請再私訊我,小弟也可以提供3000元的小紅包,作為感謝喔!因為真的想增進自己在這方面的能力!感謝!