Random forest, GBM và XGBoost
Học tập hợp từ cây đơn: rừng ngẫu nhiên bagging, boosting gradient, XGBoost và so sánh rừng với boosting trên thử thách classifiers.
KhóThuật toán ~60 phút
Ôn lại trước khi học
Giới thiệu
Bài này học gộp nhiều cây yếu thành mô hình mạnh. Bạn dùng nó để thắng cây đơn với ít công chỉnh.
Kiến thức cần nhớ
Hai triết lý tập hợp
- Bagging: huấn luyện song song nhiều cây rồi bỏ phiếu.
- Boosting: huấn luyện nối tiếp, cây sau sửa sai cây trước.
- Bagging giảm phương sai nhờ trung bình, boosting giảm chệch dần.
- Ví dụ đời thường: bagging như hỏi nhiều bác sĩ rồi lấy ý kiến chung.
Rừng ngẫu nhiên
- Mỗi cây học trên mẫu bootstrap có hoàn lại.
- Mỗi điểm cắt chỉ thử 1 tập con ngẫu nhiên đặc trưng.
- Phân loại bỏ phiếu đa số, hồi quy lấy trung bình.
- Ít siêu tham số, chạy song song tốt, khó hỏng.
Boosting gradient GBM
- Mỗi cây mới học phần dư mà dãy hiện tại còn sai.
- Tốc độ học nhỏ để đi chậm mà chắc, cây nông để yếu vừa đủ.
- Dừng sớm khi điểm kiểm định ngừng cải thiện.
- Nối tiếp nên không song song được và nhiều núm chỉnh hơn.
XGBoost và so sánh
- Là GBM kỹ nghệ hóa: phạt cây phức tạp, bước đi chính xác hơn.
- Xử lý giá trị thiếu tốt, tìm điểm cắt song song, nén dữ liệu.
- Rừng lì với nhiễu nhãn hơn, boosting dễ học thuộc nhiễu.
- Quy tắc: nhiễu cần ổn định thì rừng trước, sạch cần vắt điểm thì boosting.
| Trục | Rừng | Boosting |
|---|---|---|
| Giảm | Phương sai | Độ chệch |
| Nhiễu | Lì đòn | Dễ thuộc |
| Tốc độ | Song song | Nối tiếp |
Ví dụ
- Input: rừng 1 cây với đủ đặc trưng. Output: tương đương cây đơn.
- Giải thích: mất cả 2 nguồn ngẫu nhiên thì chỉ còn 1 cây thường.
- Input: boosting với tốc độ học bằng 0. Output: đứng yên không học gì.
- Giải thích: mỗi bước cộng 0 nên dãy không đổi.
💻 Bài tập
Ngôn ngữ: Python 3 với NumPy. Dùng DecisionTree ngày 53. Bài 3 dùng xgboost hoặc sklearn. Nộp vào day-089/.
Bài 1: Random forest tự cài
class RandomForest:
def __init__(self, n_trees=100, max_depth=None, max_features="sqrt", seed=0, n_jobs=1): ...
def fit(self, X, y): ... # mỗi cây: bootstrap + chỉ thử max_features cột ở mỗi lần cắt
def predict(self, X): ... # bỏ phiếu đa số
def oob_score(self) -> float: ... # accuracy trên các mẫu không được bốc vào cây đó
Sửa DecisionTree ngày 53 để nhận tham số max_features.
Breast Cancer, 70/30: RandomForest(100) accuracy test > DecisionTree đơn
oob_score xấp xỉ accuracy test (chênh dưới 3%)
Bài 2: Gradient boosting cho hồi quy
class GradientBoostingRegressor:
def __init__(self, n_estimators=200, learning_rate=0.1, max_depth=3): ...
def fit(self, X, y, X_val=None, y_val=None, early_stopping=10): ...
# f0 = mean(y); mỗi vòng: r = y - f; khớp cây hồi quy vào r; f += lr * cây(X)
Cần cây hồi quy (lá là trung bình, cắt theo giảm MSE). Viết thêm nếu ngày 53 chỉ có phân loại.
- Chạy trên California Housing. Vẽ MSE train và validation theo số cây.
- Thử
learning_rate = 1.0, 0.3, 0.1, 0.03. So số cây tới dừng sớm và MSE test.
Bài 3: So sánh với thư viện (nâng cao)
mô_hình accuracy/MSE thời_gian_train
DecisionTree (tự cài) ...
RandomForest (tự cài) ...
GBM (tự cài) ...
sklearn RandomForest ...
XGBoost / HistGradientBoosting ...
- Thêm 20% nhãn nhiễu vào Breast Cancer. So độ giảm accuracy của rừng và boosting.
- Thêm 10% giá trị thiếu. Chạy XGBoost trực tiếp (xử lý được
NaN) và so với điền trung vị.
✅ Tiêu chí hoàn thành
- Rừng tự cài thắng cây đơn trên test.
- Có hình MSE theo số cây và bảng learning rate.
- Bảng so sánh 5 mô hình có số thật.
- Giải thích được bagging giảm phương sai, boosting giảm chệch.
❓ Câu hỏi ôn tập
- Bagging và boosting khác nhau thế nào?
- Hai nguồn ngẫu nhiên của rừng là gì?
- Mỗi cây GBM học cái gì?
- Khi nào chọn rừng thay vì boosting?
🌕 Bạn đã hoàn thành ngày 89. Làm hết bài tập phía trên rồi sang ngày tiếp theo.