熬夜幾天懸而未解的模型迷題?

問題整理

Tom Lin
Tom Lin
Nov 5 · 5 min read

(文長慎入) 各位版友好,因為公司的要求,需參加了玉山[https://tbrain.trendmicro.com.tw/Competitions/Details/10]的盜刷比賽,其實目的不在得獎,只是在訓練模型中,有一些盲點,真的蠻想釐清的,特別是在訓練時的驗證結果和實際提交的測試結果的落差,感到非常困惑,不知起因為何,這樣也會影響到後續我們在建模時,如何評估出一個較valid的model,進到production當中?

(一) 簡要版問題:

  1. 想請教,如果在一個imbalance的資料集,同時多數feature都是categorical data type的情況下,如果為了要進行變數縮減,而將各欄位中,出現頻率少的category整併,會不會造在positive/negative的case,都被混合在一起,而讓這個類別不顯著。
  2. 如果僅針對類別特徵,進行one hot encoding,而結果會多達20多萬的特徵數,那麼是不是我自己的feature engineering(數量約10到20個),一同放在建模時,就不會發生效果?更深入討論,在Logistic/Ensemble Method/Neural Network,都是如此嗎?
  3. 在使用自己切割出來的validation set/test set(完全不在訓練集中,也不用來調參),做出來的分數不錯,但後續實際用考題的測試資料集做驗證,分數會低個0.1到0.2(F1 Score)?這造成了在建模當中,判斷模型是否需要調整的困難?不知道為何會有這樣的落差產生?
  4. 如果要針對Multi-Layer Perception進行建模,不知道是否有適合的模型設計架構?可以參考?

(二) 詳述的問題背景:

因應公司要求參加了玉山的比賽,但是目前最佳的F1-Score成績,只有0.55,而目前在leaderboard上的最佳成績有到0.69,其實志不在得獎,只是真的蠻想了解,在我設計的模型與流程上,是不是有盲點,可以再改善。

目前的資料集,總數大約有150萬筆,主要是針對盜刷的判斷。

(三) 在進行Exploratory Data Analysis時,主要有幾點:

  1. 盜刷的帳號與交易次數,大部份都只有一次,這意謂著無法了解進行追縱。
  2. 如果假定盜刷都是由同一集團所為,從每一筆盜刷的時間間隔,僅可以看出大部份都是1日,而一般正常的刷卡,則是1日或是2日以上各半。
  3. 除此之外,其它都是類別變數。

(四) 資料集的特色,主要有兩個問題:

第一,它裡面有許多欄位都是類別,並且每種類中,有許多的類別,出現的頻率除了少數幾種別較高外,其它都很低,大約0.01之類的佔比。

第二,資料集是非常不平衡地,positive case只佔了0.013。

(五) 目前進行特徵工程與模型的設定,與結果如下:

  1. 直接將所有欄位的類別,進行one hot encoding,最後得出的總數會有20多萬筆欄位的sparse matrix。
  2. 針對僅有的數值型欄位,進行Binning成幾組。
  3. 針對每一類別欄位,先進行logistic regression, 找出每個欄位中,顯示的類別,進行重編碼為1,而不顯著地,為0。
  4. 以模型而言,邏輯斯模型的成效或是利用簡易的Neural Network(架構僅兩層,外加dropout),均較RandomForest/Xgboost的效果好。
  5. 以建立訓練樣本來說,將positive case進行over-sampling,讓正/負訓練樣本的比率是1:1或是1:2的方式進行訓練,這樣在validation set的效果,都會比使用sklearn當中的class-weight或是使用Xgboost當中的sample-weight效果來得好。
  6. Validation set也採用兩種方式評估,一種是同樣1:2的正/負比,進行confusion matrix,一種是使用原母體比率0.013:1的方式,進行評估。
  7. 最後則是在Probability Threshold上的調整,透過手動調整的方式,來找出適當的threshold的數值。

(六) 進行dimensionality reduction:

  1. 我曾經嘗試使用降維,利用TruncatedSVD()函數,但是發現以降維到100個features來說,其表現比使用one hot encode的成果還差。
  2. 但是如果我想增加feature數量到1000,那我的jupyter notebook就會爆出MemoryError,或是iteration的時間要非常久。

(七) 目前遇到的難題:

  1. 其實我仍然希望用降維的方式處理,因為剛剛上述的模型,以直接one hot encode的方式,20多萬的欄位,其實訓練的時間要非常久,而且也沒辦法進行調參,每一次的測試都很花時間。
  2. 但是如果直接利用TruncatedSVD()降維,又會遇到時間太久,feature數量不能設定太多。
  3. 如果要透過手動,將要出現頻率少的類別,進行整併,不確定這樣是否會讓一些盜刷會發生在的類別,就和一般正常類別混和在一起,而看不出來顯著。
  4. 如同前面所述,在使用自己切割出來的validation set/test set(完全不在訓練集中,也不用來調參),做出來的分數不錯,但後續實際用考題的測試資料集做驗證,分數會低個0.1到0.2(F1 Score)?這造成了在建模當中,判斷模型是否需要調整的困難?不知道為何會有這樣的落差產生?
  5. 不確定是否這類問題,真的有必要使用非線性的模型,例如Neural Network,而使用的話,其適合的設計架構為何?

如果有版友願意提供建模上的經驗分享,請再私訊我,小弟也可以提供3000元的小紅包,作為感謝喔!因為真的想增進自己在這方面的能力!感謝!

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade