
Trong phần này, tôi sẽ thực hiện training trên tập dữ liệu feature đã được combine ở các phần trước. Để tiến hành thực nghiệm, ta cần phân chia tập dữ liệu thành 3 tập (train, validation, test). Ở đây, tôi lấy tương ứng tỉ lệ 70/15/15. Mục đích của việc này giúp cho model tránh bị overfitting. Đồng thời, ta có thể dùng validation set để tuning model.
Sau khi phân chia tập dữ liệu, ta sẽ dùng XGBoost để training model. Model này được đánh giá dựa trên AUC metric. Do đó, AUC càng cao, model của ta càng nắm bắt được nhiều pattern trong tập dữ liệu đồng nghĩa với việc khả năng dự đoán của mô hình cũng chính xác hơn.
Cuối cùng, ta dùng model build được để predict output cho tập test và upload submission file lên Kaggle. Tôi có thử upload 2 lần. Lần 1 chỉ gồm các feature binary trong bảng application. Lần 2 gồm các feature ở lần 1 cộng thêm các feature đã tinh chỉnh khác. Kết quả lần 2 vượt trội hơn hẳn lần 1 (0.74 vs 0.63).
Khi đã hoàn chỉnh toàn bộ các bước này, về sau khi thêm feature mới, ta chỉ việc combine features và bỏ vào model để xem kết quả có cải thiện hơn không cũng như phân tích và tuning lại các tham số cho model.
Train validation test split (tvt split)

Do tập dữ liệu test của Kaggle nằm ở một bảng khác (application_test.csv) nên mỗi lần tạo features, combine và predict rất mất công trong việc load và filter dữ liệu. Vì vậy, tôi sẽ tạo một column tên là tvt_code chứa giá trị code (train, val, test, kaggle_test) tiện cho việc truy vấn xuyên suốt quá trình modeling.
Tập validation được sử dụng như thế nào? Tại sao cần validation set khi đã có test set? Thật ra validation set dùng để hyper-parameter tuning cho model. Cho trước tập các hyper-parameter (depth of tree, learning rate, number of tree, number of iteration, etc) làm sao bạn có thể đánh gía được mô hình của mình trong quá trình training? Bạn cần validation set. Tại mỗi vòng lặp training, model sẽ dùng validation set để đánh giá, ta có thể gán giá trị early stoping cho tập này nếu như AUC không tăng trong 100 lần lặp kế tiếp hay AUC bị giảm ở vòng lặp tiếp theo chẳng hạn.
Ngược lại, test set được dùng để đánh giá sao cho model ít bị chủ quan (bias). Bạn có thể xem đây là môi trường giả lập của model, mục tiêu của model là dự đoán tốt trên tập dữ liệu thực tế, dữ liệu mà model hoàn toàn không biết gì tới (unseen data). Do tập này hoàn toàn tách biệt với training data và hyper-parameter tuning trước đó nên bạn có thể đánh giá model của mình khách quan hơn (unbias). Ngoài ra, test set còn giúp bạn phát hiện mô hình của mình có bị overfitting hay không nhờ vào kết quả dự đoán trên tập train cao nhưng khi áp dụng trên tập test thì lại thấp.
Các bước tvt splitting, các bạn có thể tham khảo notebook này.
Combine features

Bước combine feature khá đơn giản, tuy nhiên điểm đáng ngại là khi số lượng feature ngày càng nhiều thì dữ liệu được nạp vào RAM để training ngày càng lớn. Đối với máy tính có cấu hình lớn thì không thành vấn đề, ngược lại máy có cấu hình thấp sẽ khó thực hiện được tác vụ này.
Để khắc phục tình huống này, tôi đề nghị bạn sử dụng 1 trong 2 nguồn tài nguyên được cung cấp miễn phí đó là Kaggle kernels và Google colaboratory.
Các bước combine, các bạn có thể tham khảo notebook này. Kinh nghiệm cho thấy, bạn chỉ nên dùng để thực hiện các tác vụ đòi hỏi nhiều tài nguyên tính toán. Ngược lại, bạn nên code chủ yếu trên local máy mình. Lý do, “tiền nào của nấy”, mình đã từng code trên 2 môi trường này thì thấy khá chậm dù là các tính toán đơn giản.
Modeling với XGBoost
Các bước cài đặt và hướng dẫn sử dụng thư viện XGBoost các bạn có thể tham khảo tại link này. Thông thường, ta sẽ cần 2 loại parameter dùng để định nghĩa cấu trúc cây (param init) và dùng tinh chỉnh trong quá trình training (param fit). Dưới đây là một đoạn code XGBoost cơ bản.
param_init = { "objective": "binary:logistic", "booster": "gbtree", "max_depth": 4, # default: 3 only for depthwise "n_estimators": 1000, # default: 500 "learning_rate": 0.025, # default: 0.05 "subsample": 0.7, "colsample_bytree": 0.6, # default: 1.0 "colsample_bylevel": 0.5, # default: 1.0 "random_state": 0, # "silent": True, "n_jobs": 16, # "tree_method": "hist", # default: auto "grow_policy": "lossguide", # default depthwise } param_fit = { "eval_metric": "auc", "early_stopping_rounds": 500, # default: 100 "verbose": 200, "eval_set": [(X_train, y_train), (X_val, y_val), (X_test, y_test)] } xgb_model = xgb.XGBClassifier(**param_init) xgb_model.fit(X_train, y_train, **param_fit) evals_result = xgb_model.evals_result()
Output của thư viện khi thiết lập thông số verbose
[0] validation_0-auc:0.679439 validation_1-auc:0.676759 validation_2-auc:0.680491 Multiple eval metrics have been passed: 'validation_2-auc' will be used for early stopping. Will train until validation_2-auc hasn't improved in 500 rounds. [200] validation_0-auc:0.753623 validation_1-auc:0.740054 validation_2-auc:0.753235 [400] validation_0-auc:0.769729 validation_1-auc:0.749694 validation_2-auc:0.761941 [600] validation_0-auc:0.778535 validation_1-auc:0.752425 validation_2-auc:0.76462 [800] validation_0-auc:0.786334 validation_1-auc:0.754004 validation_2-auc:0.766037 [999] validation_0-auc:0.793583 validation_1-auc:0.754871 validation_2-auc:0.767048 CPU times: user 12min 53s, sys: 7.15 s, total: 13min Wall time: 54.2 s
Sau khi training hoàn tất, ta có thể viết hàm để visualize AUC và plot feature important như hình dưới.
Các bước modeling, các bạn có thể tham khảo notebook này.
Submit kết quả lên Kaggle
Để có thể submit kết quả lên Kaggle, bạn cần output file kết quả theo format (SK_ID_CURR, TARGET) gồm user ID và giá trị dự đoán của mô hình. Ví dụ
SK_ID_CURR | TARGET |
100001 | 0.0450 |
100005 | 0.1244 |
100013 | 0.0416 |
100028 | 0.0359 |
100038 | 0.1571 |
Nếu submit thành công, bạn sẽ nhận được kết quả như hình dưới.

Kết
Điểm AUC = 0.74 là một kết quả đáng khích lệ. Nếu lên leaderboard để xem các đội khác đã “trau chuốt” AUC của mình như thế nào, bạn sẽ bất ngờ vì ở thời điểm hiện tại AUC ~ 0.8. Bạn có thể thấy khoảng cách điểm chỉ có 0.06 nhưng đòi hỏi nhiều rất nhiều nỗ lực và công sức từ nhiều thành viên.
Tham gia các cuộc thi như Kaggle mang lại cho bạn nhiều thứ như kinh nghiệm làm việc, có gì đó ghi vào CV, làm quen thêm nhiều bạn mới, học cách xử lý tình huống, trải nghiệm sự thăng trầm về cảm xúc khi AUC lên xuống, gãi đầu bức tóc khi mọi cố gắng của mình feature engineering, modeling chẳng giúp AUC tăng lên miếng nào.
Công việc của các Data Scientist ngoài thực tế cũng tương tự như vậy nhưng so với Kaggle thì còn phức tạp hơn nhiều. Bạn phải định nghĩa bài toán phù hợp với hướng kinh doanh của công ty, phải thu thập dữ liệu vì chưa có sẵn, phải clean up data, chọn metric thích hợp để sếp có thể đánh giá được công việc của bạn, etc. Và lắm lúc mô hình của bạn sẽ không được duyệt để lên production do độ chính xác không đạt yêu cầu đề ra, thế là đi tong ngày tháng miệt mài làm việc.
Hiện tại, đã có nhiều đàn anh đi trước chia sẻ lại kinh nghiệm tham gia và giành chiến thắng trong cuộc thi Kaggle. Bạn có thể xem slide bên dưới để có cái nhìn bao quát hơn về cuộc thi này nhé.
slide không xem được anh ơi 😦
ThíchThích