Decision Trees
Cây quyết định
Hỏi 20 câu để đoán đồ vật
Hồi nhỏ bạn từng chơi game “Tôi đang nghĩ đến một con vật” — bạn hỏi liên tục: Nó sống trên cạn không? → Có 4 chân không? → Nó có sọc không?. Mỗi câu hỏi chia đôi khả năng cho đến khi chỉ còn lại một đáp án. Cây quyết định làm đúng như vậy — chỉ khác là máy tính chọn câu hỏi có ích nhất bằng một công thức thay vì linh cảm.
Nó sống trên cạn không?
Bạn đưa cho AI 24 học sinh (giờ học, điểm kiểm tra) và bảo nó dự đoán ai qua môn. AI chọn câu hỏi đầu tiên ở gốc cây bằng cách nào?
Một cây có ba loại phần:
Mỗi nút bên trong cây là một câu hỏi kiểu “đặc trưng X ≤ ngưỡng T?”. Nhánh trái (≤) — nhánh phải (>).
Kết thúc nhánh. Lá xanh = đa số mẫu rơi vào đây thuộc lớp “qua môn”.
Lá đỏ = đa số mẫu ở đây thuộc lớp “rớt”. Dự đoán cho một điểm mới = đi theo câu hỏi đến khi chạm lá.
Hình minh họa
Chọn đặc trưng, kéo ngưỡng, và xem cây mọc ra. Mỗi lần áp dụng một split, cây mọc thêm một tầng. Tối đa độ sâu 3 — chính là mức dùng trong thực tế để tránh overfitting.
Xanh = qua môn, đỏ = rớt. Đường tím = ngưỡng bạn đang xem trước.
Thử thay đổi max_depth — xem cây 'mọc' sâu hơn hay bị cắt tỉa
Gini và Entropy thường cho kết quả rất gần nhau. Khi max_depth lớn hơn, cây sâu hơn — accuracy trên tập train tăng nhưng rủi ro overfitting cũng tăng.
Lựa chọn chia nào giảm Gini nhiều nhất? (Gini gốc của 24 mẫu là 0.500 — hai lớp cân bằng)
Bạn có 2 cây: A (sâu 2, acc_train = 82%, acc_val = 80%) vs B (sâu 8, acc_train = 99%, acc_val = 73%). Chọn cây nào đem ra dùng thật?
Giải thích
Ở mỗi nút, cây quyết định trả lời đúng một câu: trong tất cả cách chia, cách nào làm dữ liệu “sạch” nhất? Có hai công thức phổ biến để đo độ sạch — cả hai đều nhỏ khi dữ liệu đã gần như cùng một lớp.
Công thức 1 — Gini impurity (mặc định của scikit-learn)
Nói bằng tiếng Việt đời thường: “Nếu bạn rút ngẫu nhiên 1 mẫu ra, và đoán nhãn cho nó bằng cách lại rút ngẫu nhiên 1 mẫu nữa — xác suất đoán sai là bao nhiêu?”. Dữ liệu thuần một lớp → Gini = 0. Hai lớp cân bằng 50/50 → Gini = 0.5 (cao nhất).
Công thức 2 — Entropy (nền tảng lý thuyết thông tin)
Nói bằng tiếng Việt đời thường: “Cần trung bình bao nhiêu câu hỏi yes/no để biết chắc nhãn của một mẫu?”. Thuần 1 lớp → cần 0 câu, H = 0. 50/50 → cần 1 câu, H = 1 (cho 2 lớp). Gini và Entropy thường cho cây gần như giống nhau — chọn cái nào cũng ổn, scikit-learn mặc định dùng Gini vì nhanh hơn (không có log).
Quy trình ở mỗi nút
Liệt kê mọi ngưỡng ứng viên. Với mỗi đặc trưng, sắp xếp các giá trị khác nhau, rồi lấy trung điểm giữa hai giá trị kề nhau làm ngưỡng thử. Nếu đặc trưng có 15 giá trị khác nhau → 14 ngưỡng.
Tham số quan trọng cần biết
Giới hạn số tầng của cây. Nhỏ (2–4) → đơn giản, dễ hiểu, ít overfit. Lớn (8+) → accuracy train cao nhưng rủi ro overfit.
Số mẫu tối thiểu ở mỗi lá. Đặt 10–20 với dataset vừa phải để tránh lá quá nhỏ = lá học thuộc.
'gini' (mặc định, nhanh) hoặc 'entropy' (gốc lý thuyết thông tin). Hai cái thường cho kết quả rất gần nhau.
Cost-complexity pruning — 'phạt' cây lớn. Tăng α → cây nhỏ hơn. Là cách hiện đại để tránh overfit thay cho min_samples.
Cây quyết định kết nối với nhiều khái niệm khác: overfitting/underfitting giải thích vì sao phải giới hạn độ sâu, đánh đổi bias-variancelà khung lý thuyết chung, và khi bạn thấy cây quyết định “đọc” xong, bạn cũng đã sẵn sàng học Random Forest.
- Cây quyết định = chuỗi câu hỏi 'đặc trưng ≤ ngưỡng?'. Dự đoán = đi theo câu hỏi từ gốc đến khi chạm lá.
- Chọn split tốt nhất ở mỗi nút bằng Gini (hoặc Entropy) — thử hết mọi cặp (đặc trưng, ngưỡng), chọn cái giảm độ lẫn lộn nhiều nhất.
- Ưu điểm: dễ đọc, không cần chuẩn hóa dữ liệu, xử lý đặc trưng hỗn hợp tự nhiên, robust với outlier.
- Nhược điểm: cây sâu = overfit. Kiểm soát bằng max_depth, min_samples_leaf, ccp_alpha; hoặc dùng Random Forest / Boosting để mạnh hơn hẳn.
Kiểm tra hiểu biết
Cây quyết định chọn câu hỏi nào tại mỗi nút để chia dữ liệu?