[Kalapa Credit Challenge] Giải nhì đồng đội (with Code)

data-science
kalapa

#1

Chào mọi người,

Trước tiên xin cám ơn Kalapa và Aivivn đã tài trợ và tổ chức cuộc thi này. Xin chúc mừng các winners đạt được kết quả cao. Xin cám ơn những bạn đã chia sẻ solution tạo sự khích lệ cho những bạn khác trong cuộc đua Public LB đầy thú vị :smiley:.

Từ ban đầu team mình k có ý định tryhard, phải nói team mình khá may mắn khi đạt được giải nhì đồng đội trong khi vị trí chung cuộc là 18. Có thể solution này không có gi đặc sắc so với những bạn top cao, tuy nhiên sẽ có một vài điểm để giúp các bạn tránh được overfit hay những bài shakeup như thế này.

Code cuả team mình được public tại đây.

Data analysis

Sau đây là những quan sát của mình. Nó không nhiều và kỹ, tuy nhiên đủ để mình hiểu và có feeling về data.

  • Data imbalance.
  • Missing value lớn.
    Số lượng missing rất giống nhau, mình đoán data đến từ nhiều nguồn khác nhau.
  • Data gây nhiễu, cần được clean.

Data cleaning

Một số bước clean data đơn giản, trên forum mọi người cũng đã bàn rồi, cho nên mình không nói rõ ở đây. Các bạn có thể tham khảo code của mình để biết thêm chi tiết.

Baseline

Mình xin nói phần này trước phần Feature Engineering. Vì nó ảnh hưởng đến những việc mình làm ở các bước tiếp theo.
sau khi clean data, mình không làm feature gì thêm cả, đưa hết data vào model LGBM, chạy 5-folds sau đó submit. Sau đây là một số kết luận của mình từ baseline model.

  • Không có correlation giữa validation và public LB.
    Validation rất quan trọng. Bởi vì nó ảnh hưởng đến việc bạn chọn hyper-parameters/feature engineering. Chỉ khi nào bạn setup đc một solid validation scheme, thì mới đến bước tiếp theo (Feature engineering, tunning, etc).

  • Variance giữa các fold cực cao

  • Mình thay đổi seed và kêt quả public LB thay đổi theo (nhưng k có variance). Thống kê trong 20 lần chạy với các seed khác nhau, variance giữa các seed cao.

Tại sao lại variance cao?

Theo quan điểm của mình, có thể:

  • Do data.
    Nope :stuck_out_tongue:, bạn k thể đổ lỗi cho data được. Đây là cái bạn phải đương đầu trong thực tiễn.
  • Do model overfit.

Variance cao thể hiện điều gì?

Variance thể hiện tính ổn định của model. Variance cao tức là model không ổn định. Model không ổn định sẽ dẫn tới shakeup. Nó có thể tốt trên tập public test set, nhưng chưa chắc đã tốt trên tập test khác.
Variance có quan trọng không?. Rất quan trọng.
Tại sao?. Trong mô hình thực tế, data có thể thay đổi liên tục theo từng thời điểm. Tháng này Kalapa có 5triệu users, tháng sau có 15 triệu users. Distribution có thể bị skew liên tục. Công ty không cần bạn performance tốt trên 5tr user họ đang có (vì chính xác họ đã gán nhãn rồi), họ muốn kết quả tốt trên 10tr users sắp tới. Việc search seed minh nghĩ không phải một ý tưởng tốt trong bài này. Không thể để kết quả phụ thuộc quá nhiều vào con số hên xui :stuck_out_tongue:. Vậy nên việc giữ cho variance càng thấp càng tốt sẽ giúp bạn tránh rủi ro hơn trọng kết quả cuối cùng.

Feature engineering.

Không có gì đặc biệt trong phần này cả. Mình chỉ thêm một feature mới là mean target encoding.

Feature selections

Đây là phần quan trọng để giảm variance cũng như overfit.
Xuất phát ban đầu từ baseline, mình có 96 features. Sau mỗi lần chạy feature, mình tính feature importants và loại bỏ đi những feature yếu. Mỗi lần như vậy mình tỉa đi khoảng 5-10 features. Sau đó chạy lại lần nữa, và kết quả thấy variance giảm. Vòng loop được lặp lại cho đến khi variance không giảm được nữa thì thôi.
Cuối cùng mình có 31 features tất cả.

Modeling

Model của mình submit gồm 31 features trên. Mình chạy trong 20 seeds và lấy trung bình giữa các seed.

Gini for OOF: 0.2285142769658592
Average CV : 0.2343615754995229
STD CV : 0.01116168868867106
Gini for OOF: 0.23307624671948943

Cuối cùng mình giảm variance xuống được 0.01. Lúc này CV và LB có sự correlation và GAP không lớn. Có thể nói model cua mình ổn định và không overfit. public LB: 0.237, private LB: 0.257

Conclusion.

Mặc solution của đội mình không phải tốt nhất, nhưng mình tin nó sẽ giúp cho organizers build được model stable , ổn định nhất.


[04/16/2020 11:13] [Kalapa Credit Challenge] Giải nhì đồng đội. Cám ơn Kalapa và . . .
#2

Chúc mừng team giải nhỉ. Mình tham gia cuộc thi này hơi muôn, cũng không có kinh nghiệm compete nên thực sự chán nản khi score không vượt nổi 0.25 (là bài public Random Forest with WOE đã được chia sẻ). Càng nản hơn khi kiểm tra lại model đạt LB 0.25 với tập train thì điểm cực thấp. Suy đoán là 2 tập này có ít mối liên hệ nên mất luôn động lực tối ưu vì mình đã đưa AUC tập train đến gần 0.8 với variant thấp nhưng kết quả LB không vượt nổi 0.23!

Nhưng nhìn vào bảng phân bố public board và private board của cuộc thi này thì quả thật không thể đổ lỗi cho data. Sẽ phải cố gắng hơn trong các lần tiếp theo.

Cuối cùng cảm ơn chia sẻ của team bạn, chúc mừng các đội chiến thắng và cảm ơn ban tổ chức cuộc thi. Hi vọng sẽ có nhiều cuộc thi thế này hơn nữa.


#3

Cám ơn bạn đã chia sẻ. Mình cũng từng nghĩ như bạn: setup stable CV, feature selection do nhận thấy rất nhiều feature gây overfit (đặt biệt là cái district :rofl: làm mình mất ngủ cả tuần khi thí nghiệm với nó). Tuy nhiên, mọi kết quả đều cho public LB thấp quá + tham chọn solution có public cao nên bị shakeup thảm hại :slight_smile:. Cám ơn bạn đã chia sẻ solution của nhóm và insight, sẽ rất giúp ích cho newbie như mình :smiley:


#4

Bạn chia sẻ source code vẽ hình này được không? Nếu có đường thằng identity (y = x) nữa thì sẽ thấy được đội nào bị overfit nặng và đội nào ổn định. Cảm ơn bạn.


#5

Cảm ơn anh đã chia sẻ lời giải ạ. Anh có thể cho em hỏi một chút về cách nhận biết correlation giữa validation và public LB ko ạ. Ngoài ra thì em cũng có sử dụng mean target encoding như a có nói trong bài, nhưng khi dùng cho nhiều feature thì bị overfit rất nặng, nên em chỉ dừng lại ở việc dùng cho một feature có importance cao nhất mà chưa rõ tại sao :frowning: . Anh có thể chia sẻ thêm cho em cách dùng mean target encoding ạ. Em cảm ơn a nhiều ạ


#6

Anh có thể cho em hỏi một chút về cách nhận biết correlation giữa validation và public LB ko ạ

Correlation ở đây là quan hệ giữa CV và LB: tăng thì cùng tăng, giảm thì cùng giảm nhé.

Anh có thể chia sẻ thêm cho em cách dùng mean target encoding ạ. Em cảm ơn a nhiều ạ

Cách dùng mean target encoding (MTE) ở trong code của mình phía trên. Cell số 23.

te_cols = ["province", ]
        for col in te_cols:
            te_d = X_train.groupby(col)[target_col].mean().to_dict()
            X_train[col+'_te'] = X_train[col].apply(lambda x: te_d.get(x))
            X_valid[col+'_te'] = X_valid[col].apply(lambda x: te_d.get(x))
            test_df[col+'_te'] = test_df[col].apply(lambda x: te_d.get(x))

Ở đây mình dùng MTE cho province. Lưu ý của dùng MTE là thực hiện trên fold level. Không được thực hiện trên toàn dataset. Nếu không sẽ bị leak và overfit nặng.


#7

Source này đơn giản mà Bác. Đây ạ:

Bổ sung thêm ảnh theo gợi ý của Bác:


#8

Cảm ơn anh vì đã chia sẻ lời giải. Em có một vài câu hỏi về một vài chi tiết trong code của anh ạ:

  1. Trong quá trình EDA của anh, anh đã kiểm tra data như thế nào để có thể tạo ra fields như FIELD_11_22_ratio ạ? Thường thì trong notebook của em, em sẽ kiểm tra distribution của từng biến (groupby class) trong train/test, rồi sau đó xem xét correlation của tất cả các biến. Mãi đến gần cuối competition, em mới đọc đc 1 vài tips thú vị như FIELD_2 chỉ là null check cho FIELD_3.
  2. Anh sử dụng tool nào cho hyperparameters tuning ạ? Em có đọc 1 lời giải trên kaggle của anh mà anh có nhắc đến hyperopt và optuna. Anh có dùng các tool này cho cuộc thi này ko ạ?
  3. Như em để ý thì phần lớn các đội đc giải sử dụng LGBM hoặc random forest. Em cũng có đọc qua và có thử sử dụng CatBoost nhưng CV lại rất thấp. Anh đã thử qua CatBoost chưa ạ, và tại sao cuối cùng anh lại sử dụng LGBM cho lời giải của mình ạ?

#9

Em là newbie và cũng mong các anh chị chia sẻ góc nhìn (kinh nghiệm) trong quá trình EDA ạ.

  1. Em muốn hỏi thêm là từ góc nhìn nào có thể nhìn ra được FIELD_3 để thành passed_year vậy ạ?
  2. Anh chị có thể chia thêm các quyến sách hay khóa học giúp phát triển kỹ năng trong quá trình EDA được không ạ? Em xin cám ơn