CatBoost
CatBoost là thư viện boosting gradient mã nguồn mở của Yandex, mã hóa các đặc trưng phân loại bằng thống kê mục tiêu có thứ tự và phát triển các cây đối xứng.
CatBoost là thư viện gradient boosting mã nguồn mở dành cho decision tree, do Yandex phát triển và phát hành năm 2017. Tên thư viện bắt nguồn từ "categorical boosting": CatBoost nhận trực tiếp các cột phân loại như thành phố, ID sản phẩm hoặc loại thiết bị dưới dạng chuỗi thô và chuyển chúng thành số nội bộ, vì vậy dữ liệu dạng bảng không cần one-hot encoding hoặc target encoding thủ công trước khi huấn luyện. Hai ý tưởng trong bài báo NeurIPS 2018 của CatBoost, thống kê target có thứ tự và boosting có thứ tự, giúp loại nhãn của mỗi dòng huấn luyện khỏi các giá trị dùng để fit dòng đó, tránh hiện tượng rò rỉ gây thiên lệch cho cả target encoding thông thường lẫn boosting tiêu chuẩn. CatBoost huấn luyện trên CPU và GPU, cung cấp giao diện Python, R và dòng lệnh, đồng thời xử lý phân loại, hồi quy và xếp hạng.
Cách CatBoost mã hóa các đặc trưng phân loại#
One-hot encoding tạo một cột cho mỗi danh mục, trở nên cồng kềnh với đặc trưng có hàng nghìn giá trị như ID người bán hoặc người dùng. Target encoding thay mỗi danh mục bằng nhãn trung bình của các dòng thuộc danh mục đó; cách này gọn nhưng làm rò rỉ đáp án: nhãn của chính một dòng góp phần tạo nên giá trị mô tả dòng đó, khiến model học một lối tắt không hiệu quả với dữ liệu mới. Đây là một dạng rò rỉ dữ liệu, biểu hiện thành overfitting và nghiêm trọng nhất ở các danh mục hiếm.
Thống kê target có thứ tự của CatBoost khắc phục vấn đề này bằng cách hoán vị ngẫu nhiên các dòng huấn luyện. Danh mục của mỗi dòng chỉ được mã hóa dựa trên nhãn của các dòng đứng trước nó trong phép hoán vị, có làm trơn theo một giá trị tiên nghiệm, nên không dòng nào nhìn thấy nhãn của chính mình. CatBoost lặp lại quy trình này qua nhiều phép hoán vị, one-hot encode các đặc trưng có rất ít giá trị riêng biệt và tham lam tạo tổ hợp đặc trưng phân loại, chẳng hạn thành phố kết hợp với loại thiết bị, thành đặc trưng mới trong quá trình huấn luyện.
Trong package CatBoost Python, các cột phân loại được truyền theo tên thông qua cat_features. Ví dụ này gán cho mỗi trong số 50 gói đăng ký một tỷ lệ churn ẩn riêng, rồi kiểm tra xem model có khôi phục được các tỷ lệ đó từ tên gói thô hay không:
import numpy as np
import pandas as pd
from catboost import CatBoostClassifier
# Synthetic churn data: each of 50 plans has its own hidden churn rate
rng = np.random.default_rng(0)
rates = rng.uniform(0.05, 0.6, size=50)
plan_ids = rng.integers(0, 50, size=5000)
X = pd.DataFrame({"plan": [f"plan_{i}" for i in plan_ids], "tenure_months": rng.integers(1, 60, size=5000)})
y = rng.random(5000) < rates[plan_ids]
# Raw strings go in directly; CatBoost encodes them with ordered target statistics
model = CatBoostClassifier(iterations=200, depth=4, verbose=0, random_seed=0)
model.fit(X, y, cat_features=["plan"])
# Compare true and predicted churn for the safest and riskiest plans
lo, hi = rates.argmin(), rates.argmax()
probe = pd.DataFrame({"plan": [f"plan_{lo}", f"plan_{hi}"], "tenure_months": [30, 30]})
print("True churn rates: ", rates[[lo, hi]].round(2))
print("Predicted churn rates:", model.predict_proba(probe)[:, 1].round(2))Script in ra tỷ lệ thực là 0.05 và 0.60, cùng tỷ lệ dự đoán là 0.06 và 0.59. Model đã khôi phục tỷ lệ churn của từng gói từ cột chuỗi thô, với chỉ khoảng 100 dòng huấn luyện cho mỗi gói.
Boosting có thứ tự và cây đối xứng#
Gradient boosting tiêu chuẩn tính mục tiêu cho mỗi cây mới—gradient của loss—trên chính các dòng đã dùng để fit những cây trước đó, khiến gradient bị thiên lệch; các tác giả CatBoost gọi đây là dịch chuyển dự đoán. Boosting có thứ tự áp dụng lại thủ thuật hoán vị: gradient của mỗi dòng được tính từ model chỉ huấn luyện trên các dòng đứng trước trong phép hoán vị. Đây là tùy chọn huấn luyện boosting_type="Ordered", thường cải thiện chất lượng trên dataset nhỏ nhưng phải đánh đổi tốc độ. Mặc định trên CPU là phương pháp cổ điển "Plain"; khi huấn luyện trên GPU, mặc định dùng "Ordered" với dataset tối đa 50,000 dòng, ngoại trừ chế độ đa lớp.
Theo mặc định, CatBoost phát triển cây đối xứng, hay cây oblivious, trong đó mọi node ở cùng độ sâu dùng cùng một điều kiện chia. Vì vậy, cây có độ sâu 6—mặc định—chỉ gồm sáu phép kiểm tra đúng-sai, các đáp án tạo thành chỉ số 6 bit trỏ đến 64 lá; cách này giúp dự đoán nhanh và giới hạn độ phức tạp của mỗi cây, tạo thành một dạng regularization. Tham số grow_policy chuyển sang cách phát triển theo chiều sâu hoặc theo lá khi dataset cần cây ít bị ràng buộc hơn.
Ứng dụng thực tế#
- Rủi ro tín dụng: Bên cho vay kết hợp các trường phân loại của người nộp đơn như nghề nghiệp, khu vực và mục đích vay với số liệu thu nhập và nợ dạng số để dự đoán khả năng vỡ nợ, không cần one-hot encode hàng trăm mã nghề nghiệp.
- Xếp hạng và đề xuất: CatBoost cung cấp các loss xếp hạng như YetiRank, dùng để sắp xếp kết quả tìm kiếm hoặc sản phẩm theo mức độ liên quan dự đoán từ các đặc trưng người dùng, mặt hàng và ngữ cảnh trong hệ thống gợi ý.
- Định giá bất động sản: Detector YOLO26 được huấn luyện tùy chỉnh có thể đếm các tiện ích như hồ bơi hoặc tấm pin mặt trời trong ảnh đăng bán; các số đếm này được đưa vào model giá CatBoost dưới dạng cột số, bên cạnh các cột phân loại như khu dân cư và loại bất động sản.
CatBoost so với XGBoost và LightGBM#
Cả ba thư viện đều xây dựng một ensemble gồm các cây theo trình tự, trong đó mỗi cây sửa lỗi của những cây trước đó; đây là điểm khác biệt so với random forest, vốn dùng các cây được huấn luyện độc lập.
- XGBoost: Theo mặc định, phát triển cây theo từng tầng và thêm regularization L1, L2 vào hàm mục tiêu. Hỗ trợ phân loại gốc được bổ sung ở các phiên bản sau, nhưng nhiều pipeline vẫn mã hóa danh mục trước khi huấn luyện.
- LightGBM: Phát triển cây theo từng lá, tách lá giúp giảm loss nhiều nhất, đồng thời chia đặc trưng thành các bin histogram để tăng tốc trên dataset lớn. LightGBM cũng nhận trực tiếp các cột phân loại được mã hóa bằng số nguyên.
- CatBoost: Xây dựng cây đối xứng, mã hóa danh mục bằng thống kê target có thứ tự và cho kết quả tốt mà không cần tinh chỉnh hyperparameter trước. Cấu hình mặc định là 1,000 cây có độ sâu 6; learning rate được tự động chọn dựa trên số vòng lặp đối với các mục tiêu log loss, đa lớp và RMSE.










