[AIviVN - Kalapa] Giải ba đồng đội (with code)

kalapa

#1

Hi mọi người,

Đầu tiên thì team mình xin cám ơn ban tổ chức đã tạo ra sân chơi rất hay và thú vị cho mọi người tham gia tranh đấu cũng như mài giũa kĩ năng, kinh nghiệm. Xin chúc mừng các bạn/đội khác đã chiến đấu hết mình và đặc biệt là các bạn đã chia sẻ kiến thức trên forum (điều mà đã giúp team thiếu kinh nghiệm như mình rất nhiều).

Team mình tham gia cuộc thi cũng được gần 3 tháng, tuy team mình còn newbie nhưng được cái là try hard với thích làm. Tuần trước thì team mình cũng không nghĩ sẽ được giải vì thứ hạng của team mình ở tận 1xx, tuy nhiên khi có điểm private score thì team mình vô tình lại có giải 3 đồng đội vì điểm public với điểm private của mình không chênh nhau quá. Phần nhiều cũng may mắn ^^ Team mình xin phép được chia sẻ quá trình làm, tuy không nhiều nhưng hi vọng có ích cho các bạn ^^

Source code của team mình (team mình tập dùng ngôn ngữ R, một phần dựa theo bài chia sẻ của bác pvqu47): here

Vì source code có điểm public cao thì điểm private thấp (do overfit) và điểm không cao bằng thì lại cao thật, cho nên team mình cũng không chắc là source code này có phải là source code giúp mình có giải hay không, tuy nhiên mình sẽ vẫn giải thích code cũng như các giai đoạn team mình trải qua cho các bạn ^^

Data Analysis

Team mình nhận thấy rằng là tập dataset:

  1. Imbalanced data:

Team mình có nhận thấy rằng lượng data có label 0 nhiều áp đảo data có label 1, tuy nhiên team mình lại quyết định không xử lí vấn đề này vì ưu tiên xử lí các vấn đề khác.

  1. Missing values:

Các features có rất nhiều nan và None values và team mình tập trung xử lí phần này bằng nhiều cách khác nhau.

Feature Engineering

Mình chia features thành 4 nhóm chính: Category, Boolean, Ordinal và Numeric

Sau đó đếm nan values và none values ở 3 nhóm Boolean, Ordinal và Numeric, vì nhóm Category hơi phức tạp nên chúng mình quyết định chưa xử lí vội.

  • Category:

    • maCv: mình phân nhóm lại theo ngành nghề: ví dụ các data có ‘công nhân’ hoặc ‘cn’ thì mình đều chô vào chung 1 loại là ‘cn’. Các missing data mình fill bằng ‘missing’. Sau đó áp dụng onehot encoding.
    • Province và FIELD_24: fill nan/None data bằng ‘missing’ và áp dụng cả onehot encoding và freq encoding.
    • FIELD_13 và FIELD_9: fill missing data bằng ‘missing’ và áp dụng freq encoding
  • Boolean:

    • Tụi mình chỉ đơn giản là sử dụng:

boolean_map = {'None' : float(-1), 'TRUE' : float(1), True : float(1), 'FALSE' : float(0), False : float(0), np.nan : float(-999)}

  • Ordinal:

    • Tụi mình cũng thủ công dùng:

    ordinal_map = {'A' : float(1), 'B' : float(2), 'C' : float(3), 'D' : float(4), 'Zero' : float(0), 'One' : float(1), 'Two' : float(2), 'Three' : float(3), 'Four' : float(4), 'I' : float(1), 'II' : float(2), 'III' : float(3), 'IV' : float(4), 'V' : float(5), 'missing' : float(-2), 'None' : float(-1)}

  • Numeric:

    • Ở 2 cột age, mình fill missing values lẫn nhau, tức là nếu age_source1 missing nhưng age_source2 lại không thì mình lấy value của cái sau đắp vào cái trước ^^ đồng thời cũng tạo thêm cột feature mới mang giá trị age_source1 == age_source2

    • Fill nan các features bằng mean values.

Tuy nhiên, điểm public lại vẫn không tới 0.25

Sau đó, mình có tham khảo qua về WOE và IV và áp dụng chúng với raw data. Kết quả cải thiện rõ rệt, tụi mình hí hửng áp dụng data tụi mình đã xử lí trước đó vào phương pháp này thì điểm lại tụt rất nhiều. Cho nên tụi mình nhận ra là những data mà tụi mình đã xử lí không phù hợp với cách dùng WOE và IV, và phải chọn lọc kĩ càng lại.

Tốn rất nhiều thời gian đánh giá thì tụi mình cũng chọn ra được cách: sửa giá trị nhỏ nhất của FIELD_52FIELD_53 (vì nhận thấy rằng giá trị đó bị nhiễu so với các giá trị còn lại). Tương tự với FIELD_57 nhưng ở đây lại là giá trị lớn nhất.

Các Ordinal faetures thì tụi mình vẫn numeric hóa như cũ.

Boolean feature thì tụi mình chỉ cần as.logical( FIELD_31 )

Ngoài ra thì tụi mình cũng drop luôn FIELD_7FIELD_32 vì quá phức tạp mặc dù team mình nghĩ FIELD_7 là feature khá quan trọng. Team đã cố gắng liên kết, kết hợp FIELD_7 với FIELD_9 nhưng kết quả không khả quan nên drop luôn :<

Tóm lại, tuy xử lí nhiều nhưng phương pháp WOE thực sự là công cụ mạnh mẽ để xử lí data đặc biệt là data về credit score. Với phương pháp này, tụi mình không cần xử lí quá nhiều nhưng kết quả vẫn khá cao.

Model

Chúng mình chỉ mới thử qua LGB và Random Forest. Tuy nhiên khi sử dụng LGB thì mình nhận thấy có sự overfit lớn khiến điểm thấp nhiều. Trong khi RF lại cho kết quả khả quan hơn, đặc biệt là tham số num.trees có ảnh hưởng lớn tới kết quả.

Conclusion

Trên đây là những chia sẻ của tụi newbie team mình, hi vọng không ít thì nhiều cũng có ích cho mọi người ^^


#2

em đọc cũng chưa hiểu được nhiều, một câu hỏi ngoài lề, không biết ở tầm level thế nào mới đủ sức tham gia mấy cuộc thi nay vậy anh nhỉ.

Nếu được anh có thể chia sẻ sơ qua quá trình anh chuận bị để có thể thi được không, vì nếu anh tư nhận là newbie thì phải có cái tồn tại thấp hơn cả newbie dành cho em nữa. :smiley:


#4

Ngay từ bây giờ Bạn có thể bắt đầu. Bắt đầu không bao giờ là sớm nếu có hứng thú. Qua mỗi lần tham gia trình độ sẽ tăng dần lên.