[Kalapa Credit Challenge] #6 (with code)

kalapa

#1

1. Add thêm features:

Đầu tiên mình add thêm càng nhiều features càng tốt (Sau đó sẽ lọc lại sau) Ví dụ như:

  • province: add thêm vĩ độ (link), sau đó phát hiện ra miền Tây Nam Bộ có tỉ lệ positive cao hơn, nên mình add thêm feature vùng/miền (link)
  • FIELD_3: các số phân cụm thành 8 cụm lớn trong khoảng [0,4500] và 10-12 cụm nhỏ trong khoảng [4500,10000]. mỗi cụm là một dãy số tăng dần. nhưng không thấy khác biệt giữa positive/negative nên sau này được bỏ đi.
  • FIELD_7: gồm list của các item, có thể tách thành 35 features khác cho mỗi item con trong list và features độ dài của list (xem file), tuy nhiên chỉ có feature độ dài list (f7_count) là có corelation với label. Nhưng sau này nó cũng corelate với một feature khác nên cũng bị bỏ đi.

2. Phát hiện hai phân vùng khác biệt nhau (bởi age_source 2)

Mình phát hiện ra có một lượng lớn dòng cùng null nhiều cột giống nhau, nên mình tách dataset ra làm hai phân vùng, sau này thì biết là do age_source2 (nếu age_source2 null, phần lớn trường đều null theo). Mình phát hiện distribution của các cột khác nhau rõ ràng giữa hai phân vùng. Nên mình cũng chia dataset làm 2 ở các bước tiếp theo.

3. Cách lọc ra features có giá trị:

Sau khi có hai phần vùng và rất nhiều features, mình mới lọc ra.

Với mỗi feature (có sẵn và add thêm), mình sắp xếp rồi gom giá trị gần nhau lại, hoặc nhóm những giá trị có WoE gần nhau lại. rồi vẽ đồ thị so sánh giữa positive và negative như hình vẽ.

Ví dụ như FIELD_11, mình thấy những giá trị <= 5 có tỉ lệ positive cao hơn. Trong khi giá trị >= 5 có tỉ lệ positive thấp hơn. Nên mình đã gom thành 3 category:

  • None: NaN

  • SHORT: 0 <= giá trị <= 5

  • LONG: 6 <= giá trị

Để kiểm tra lại feature có đáng tin hay không, mình thử xáo trộn (shuffle) label lên rồi vẽ lại đồ thị trên xem tỉ lệ positive/negative dao động như thế nào với trường hợp label phân bố ngẫu nhiên. Ví dụ như khi đảo 3 lần sẽ cho ra.

after_2 after_3 after_4

Trong khi label thật có tỉ lệ như hình sau:

after_original

Nhìn bằng mắt ta có thể kết luận feature này là đáng tin và có correlation với label. Sau này thì mình mới biết phương pháp này thật ra là IV (Information Value) hay WoE (Weight of Evidence)

Sau quá trình này, mình gom lại tổng cộng những features sau:

  • Phân vùng age_source2 không Null:

FIELD_1: giữ nguyên

age_source2: chuẩn hóa (-1,1)

age_source1: ‘None’, ‘Young’:(0,30), ‘Old’:(30,100)

FIELD_5: ‘A’:(-1,0.5), ‘B’:(0.5,15)

FIELD_6: ‘A’:(-1,0.5), ‘B’:(0.5,15)

FIELD_7: {‘LNone’:lambda x: len(x.strip())==0, ‘Empty’:lambda x: len(x.strip())==2, ‘Not-Empty’:lambda x: len(x.strip())>2}

FIELD_8, FIELD_10, FIELD_12, FIELD_1, FIELD_1, FIELD_17, FIELD_18, FIELD_19, FIELD_20: giữ nguyên

FIELD_22: {‘LNone’:lambda x:x!=x, ‘A’:(-0.5,0.5), ‘B’:(0.5,44.5), ‘C’:(44.5,100.5),‘D’:(100.5,1000)}

FIELD_25, FIELD_26 ,FIELD_29, FIELD_30 ,FIELD_31, FIELD_46, FIELD_47, FIELD_48: giữ nguyên

FIELD_51: {‘A’:(-0.5,7.5), ‘B’:(7.5,44.5), ‘C’:(44.5,500.5)}

FIELD_52: {‘A’:(29,32), ‘B’:(60,80)}

FIELD_53: {‘A’:(29,32), ‘B’:(60,80)}

FIELD_54: {‘A’:(-1,0.13),‘B’:(0.13,1.2)}

FIELD_56: {‘A’:(-1,0.001), ‘B’:(0.001,1.2)}

FIELD_57: {‘A’:(-1,0.001), ‘B’:(0.001,1.2)}

vung

F7_count

F7_CH

  • Phân vùng age_source2 Null:

FIELD_7: {‘LNone’:lambda x: len(x.strip())==0, ‘Empty’:lambda x: len(x.strip())==2, ‘Not-Empty’:lambda x: len(x.strip())>2}

FIELD_5: ‘A’:(-1,0.5), ‘B’:(0.5,15)

age_source1: ‘None’, ‘Young’:(0,30), ‘Old’:(30,100)

age_source1: chuẩn hóa (-1,1)

FIELD_48: giữ nguyên

vung

4. Áp dụng Machine Learning:

Mình áp dụng sklearn.model_selection.StratifiedKFold (10 folds) cộng với quét lưới tham số để tìm hyperparameter tối ưu thì cho kết quả validation local như sau:

XGBoost:

  • Local 10 KFold Score:

  • —Phân vùng age_source2 Null = 0.09-0.11

  • —Phân vùng age_source2 không Null = 0.28-0.32 (nhiều bộ tham số)

  • Public Score: 0.19

sklearn.neural_network.MLPClassifier:

  • Local 10 KFold Score:

  • —Phân vùng age_source2 Null = 0.09-0.11

  • —Phân vùng age_source2 không Null = 0.28-0.32 (nhiều bộ tham số)

  • Public Score: 0.21

  • Private Score: 0.27

5. Nhận xét:

Hai phân vùng khác hoàn toàn nên mỗi cột dữ liệu không đồng nhất trên hai vùng.

Điểm public khá thấp nhưng do may mắn hay sao đó nên điểm private cao lọt vào top 6.

Hôm qua mình xem bài top1 thử áp dụng chuyển categorical feature thành WoE feature (số) để chạy lại thì thấy score có tăng thêm được khoảng 0.1-0.2. Do thời gian gấp quá nên chưa đo kỹ lại được.

Chủ yếu mình tham gia để học tập và trao đổi là chính, do mình ở mảng vision chứ không phải data. Nên hy vọng sẽ được tiếp xúc để hiểu thêm về mọi người và lĩnh vực này.

6. Source code git: https://github.com/tgialoimtr/kalapa


#2

Damm, nhóm mình cũng có thêm 2 features từ cột province là latitude và longitude nhưng lại không tăng được đểm nên bỏ đi mà không xem xét thêm, cách xử lý của bạn hay quá.


#3

Cách xử lý dữ liệu hay quá, trước mình cũng định add features bằng dữ liệu ngoài nhưng sợ phạm luật nên thôi. Không biết là dùng dữ liệu ngoài như vậy thì BTC có chấp nhận ko :grinning: