DS-mini: Modeling với XGBoost

ds_mini_modeling
ds_mini_modeling

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)

ds_mini_tvt_split
ds_mini_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

ds_mini_combined_features
ds_mini_combined_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.

ds_mini_auc_evaluation

ds_mini_feat_imp

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.

ds_mini_kaggle_submission
ds_mini_kaggle_submission

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é.

2 thoughts on “DS-mini: Modeling với XGBoost

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s