Table of Content

Important

Tham khảo

M03W2.3_Decision Tree

1. Review Decision Tree

Ta biết công thức Gini Impurity (đo mức độ tạp chất) - càng nhỏ thì dữ liệu càng tinh khiết (chỉ có 1 class): Trong đó là tỉ lệ mẫu lớp$$$cSFS_ff$. Trong ví dụ Iris, ta đánh giá mức “tạp” của nút bằng Gini Impurity và chọn phép tách tối ưu theo Gini Gain.

image 76.png Ref: https://www.fs.usda.gov/wildflowers/beauty/iris/flower.shtml

SamplePetal_LengthPetal_WidthSepal_lengthSepal_WidthLabel
11.00.25.13.50
21.30.64.93.00
30.90.74.73.20
41.70.54.82.81
51.80.96.63.31
61.21.35.22.41
![[image 1 37.pngimage 1 37.png]]
![[image 2 35.pngimage 2 35.png]]
Bước 0 — Nút gốc
Đầu tiên chúng ta có 6 sample và value theo từng Label là
Tính Gini Impurity ở đây:
Bước 1 — Chọn ngưỡng đầu x[0] ≤ 1.1
  • Nhánh True (≤ 1.1): samples = 2, value = [2, 0] (lá thuần Class 0).
  • Nhánh False (> 1.1): samples = 4, value = [1, 3]
  • Gini sau tách (trọng số):
  • Gini Gain tại gốc: (giá trị 1.1 là tốt nhất để phân chia) → Tách này là “đáng giá”: một nhánh đã sạch hoàn toàn. Bước 2 — Tách tiếp nhánh phải theo x[0] ≤ 1.5 (đang ở nút samples = 4, value = [1,3], gini = 0.375)
  • Nhánh True (≤ 1.5): samples = 2, value = [1,1]
  • Nhánh False (> 1.5): samples = 2, value = [0,2] (lá thuần Class 1).
  • Gini sau tách (trọng số):
  • Gini Gain tại nút con:

Code IRIS-2D:

Load dữ liệu:

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import matplotlib.pyplot as plt
import pandas as pd
# load data
data = pd.read_csv('iris_2D.csv')
# get x
x_data = data[['Petal_Length', 'Petal_Width']]
print(x_data)
y_data = data['Label'].astype(int)
print(y_data)

Cài đặt decision tree:

 Petal_Length  Petal_Width
0           1.0          0.2
1           1.3          0.6
2           0.9          0.7
3           1.7          0.5
4           1.8          0.9
5           1.2          1.3
0    0
1    0
2    0
3    1
4    1
5    1
Name: Label, dtype: int64
# DecisionTreeClassifier
dt_classifier = DecisionTreeClassifier(max_depth=2, criterion='gini')
dt_classifier.fit(x_data.values, y_data.values)
  • max_depth=2: Độ sâu tối đa của cây là 2
  • criterion='gini': Phân loại dựa trên đánh giá gini (hoặc có thể dùng entropy)
  • fit(x_data.values, y_data.values): train dữ liệu, đưa dữ liệu vào. Minh họa sau khi train **dt_classifier**:
from sklearn import tree
plt.figure(figsize=(10, 3))
tree.plot_tree(dt_classifier)
plt.show()

image 3 33.png Minh họa bằng dtreeviz:

import dtreeviz
viz_model = dtreeviz.model(
    dt_classifier,
    X_train=x_data,
    y_train=y_data,
    feature_names=['Petal_Length', 'Petal_Width'],
    target_name='Label',
)
viz_model.view()

image 4 28.png

Code: IRIS-3D

Load dữ liệu

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import matplotlib.pyplot as plt
import pandas as pd
# load data
data = pd.read_csv('iris_3D.csv')
# get x
x_data = data[['Petal_Length', 'Petal_Width', 'Sepal_Length']]
print(x_data)
y_data = data['Label'].astype(int)
print(y_data)
Petal_Length  Petal_Width  Sepal_Length
0           1.0          0.2           5.1
1           1.3          0.6           4.9
2           0.9          0.7           4.7
3           1.7          0.5           4.8
4           1.8          0.9           6.6
5           1.2          1.3           5.2
0    0
1    0
2    0
3    1
4    1
5    1
Name: Label, dtype: int64
  • Ở đây có thêm cột là Sepal_Length Cài đặt Decision Tree:
dt_classifier = DecisionTreeClassifier(max_depth=2, criterion='gini')
dt_classifier.fit(x_data.values, y_data.values)
  • Vẫn như cũ Minh họa cây
from sklearn import tree
plt.figure(figsize=(10, 3))
tree.plot_tree(dt_classifier)
plt.show()

image 5 26.png

import dtreeviz
viz_model = dtreeviz.model(
    dt_classifier,
    X_train=x_data,
    y_train=y_data,
    feature_names=['Petal_Length', 'Petal_Width', 'Sepal_Length'],
    target_name='Label',
)
viz_model.view()

image 6 24.png

Vấn đề đặt ra

  • Ở đây chúng ta từ 2 cột data (feature) tăng lên thành 3 cột nhưng thuật toán vẫn dùng feature Petal Length để phân loại dữ liệu → Từ đó dẫn đến là không sử dụng triệt để các data khác để xử lý bài toán.
  • Mở rộng ra khi dữ liệu bảng có nhiều feature hơn thì việc khai thác hết tất cả các dữ liệu là điều hợp lý và tránh được lỗi tiềm tàn và có thể là overfitting như decision tree.

2. Random Forest

Trong thực tế, một cây quyết định đơn lẻ thường quá khớp và nhạy cảm với dữ liệu huấn luyện. Ý tưởng cốt lõi của Ensemble là “nếu 1 cây chưa tốt, hãy dùng nhiều câytổng hợp kết quả”. Việc bình quân hóa (averaging)/ bỏ phiếu đa số (majority vote) giúp giảm phương sai của mô hình mà không làm tăng quá nhiều độ chệch. image 7 19.png

Ensemble Learning

Ensemble Learning là kỹ thuật kết hợp dự đoán từ nhiều mô hình thành phần (base learners) để tạo ra dự đoán chính xácvững hơn so với từng mô hình riêng lẻ. Trong ngữ cảnh ở đây, các mô hình thành phần là Decision Trees (như hình minh họa).

Random Forest

Random Forest là thuật toán supervised learning sử dụng nhiều Decision Trees huấn luyện theo cơ chế bagging + lấy mẫu đặc trưng ngẫu nhiên (feature subsampling), sau đó gộp dự đoán để cho ra một kết quả cuối cùng. Mô hình áp dụng được cho cả phân lớp lẫn hồi quy.

Bootstrapping

Chọn ngẫu nhiên sample Bootstrappinglấy mẫu ngẫu nhiên có hoàn lại (random sampling with replacement) từ tập gốc để tạo ra tập con có cùng kích thước N cho mỗi cây. Do có hoàn lại, mẫu có thể lặp lạimột số phần tử không xuất hiện trong tập con này (gọi là Out-of-Bag – OOB đối với cây đó). image 8 19.png Chọn ngẫu nhiên Feature Ngoài việc lấy ngẫu nhiên dữ liệu mẫu, RF còn lấy ngẫu nhiên các Feature.

image 9 18.png

⇒ Điều này làm các cây ít tương quan hơn, nhờ đó mô hình tổng hợp ổn địnhgiảm phương sai.

Aggregating

Sau khi huấn luyện n cây trên các bootstrap dataset, Random Forest sẽ gộp dự đoán của từng cây để ra kết quả cuối cùng cho một điểm dữ liệu . image 10 17.png Ví dụ: với điểm có features [7.8, “no”, 5] và nhãn thật , ba cây lần lượt dự đoán 8.2; 6.8; 5.5. Kết quả gộp:

Aggregating: Classification vs Regression

Trong Random Forest, cách gộp dự đoán khác nhau tùy bài toán: Phân lớp (Classification) – Voting

  • Hard vote (phổ biến): mô hình chọn nhãn xuất hiện nhiều nhất trong các cây.
  • Soft vote: trung bình xác suất các lớp rồi chọn lớp có xác suất lớn nhất. Thường ổn định hơn khi lớp mất cân bằng. image 11 17.png Hồi quy (Regression) – Averaging
  • Trung bình dự đoán số thực từ các cây.
  • Có thể gán trọng số theo chất lượng từng cây (ví dụ OOB): image 12 16.png

2.1. Classification

Simple IRIS

Ta dùng 2 thuộc tính Petal_LengthPetal_Width để dự đoán Label ∈ {0,1}.

Petal_LengthPetal_WidthLabel
1.00.20
1.30.60
0.90.70
1.70.51
1.80.91
1.21.31
Quy trình huấn luyện một cây trong Random Forest (classification):
  1. Create a new dataset: lấy bootstrap từ tập gốc (lấy mẫu có hoàn lại).

  2. Select features randomly: tại mỗi nút, chọn ngẫu nhiên m đặc trưng (ở đây từ {Petal_Length, Petal_Width}).

  3. Construct best splitting: tìm ngưỡng tách tối ưu theo tiêu chí impurity (ví dụ Gini hoặc Entropy).

    Gini tại nút:

    Thông tin (Entropy):

    Chọn split làm giảm impurity nhiều nhất (Information Gain / Gini decrease).

  4. Build a Decision Tree: lặp đến khi thỏa tiêu chí dừng (độ sâu, số mẫu tối thiểu…).

  5. Enough? Không — lặp lại cho nhiều bootstrap ⇒ n cây; dự đoán dùng voting (hard/soft). image 13 15.png

Bước 1 + 2 – Tạo bootstrap dataset & chọn đặc trưng ngẫu nhiên (IRIS)

Ta rút mẫu có hoàn lại từ tập gốc để tạo một bootstrap dataset rồi chọn ngẫu nhiên một tập con đặc trưng cho cây hiện tại. image 14 15.png Ví dụ trên IRIS rút gọn với hai thuộc tính Petal_LengthPetal_Width, cây này ngẫu nhiên chỉ dùng Petal_Length để học ranh giới.

image 15 15.png

Bước 3 - Construct best splitting

Histogram cho thấy các điểm tách thử nghiệm tại 1.101.55; cây được xây bằng cách chọn ngưỡng làm giảm độ hỗn loạn (impurity) lớn nhất theo Entropy.

image 16 12.png

  • Nút gốc: 6 mẫu,
  • Tách 1: ngưỡng
    • trái : (H = 0.0)
    • phải : (H ≈ 0.811).
    • Entropy sau tách
  • Tách 2 (nhánh phải): ngưỡng
    • trái : (H = 1.0),
    • phải : (H = 0.0).
    • Entropy sau tách = Kết quả: cây có ba lá, trong đó hai lá thuần (pure), một lá còn hỗn hợp do dữ liệu ít.

Bước 4: Lặp lại tiếp tục

Create a new dataset image 17 12.png Select features randomly image 18 12.png Construct best splitting image 19 12.png

Inference

Petal_Length = 1.7 Petal_Width = 0.8 image 20 11.png ⇒ Class 1

3. Step-by-step Example

Dataset

Sử dụng Random Forest cho phân lớp với dữ liệu sunburn gồm các thuộc tính nhân khẩu học và việc dùng kem chống nắng để dự đoán Kết quả (bị cháy nắng hay không). Tất cả đặc trưng đều là categorical. Bảng dữ liệu:

IDMàu tócChiều caoCân nặngDùng kemKết quả
1ĐenTrung bìnhNhẹKhôngCháy nắng
2ĐenCaoTrung bìnhKhông
3RámThấpTrung bìnhKhông
4NâuThấpTrung bìnhKhôngCháy nắng
5NâuTrung bìnhNặngKhôngCháy nắng
6RámTrung bìnhNặngKhông
7NâuTrung bìnhNhẹ?
Kiểu dữ liệu & miền giá trị:
  • Màu tóc (Categorical): Đen, Nâu, Rám
  • Chiều cao (Categorical): Thấp, Trung bình, Cao
  • Cân nặng (Categorical): Nhẹ, Trung bình, Nặng
  • Dùng kem (Categorical): , Không
  • Kết quả (Categorical – Target): Cháy nắng, Không

Problem

Bài toán: Binary Classification — dự đoán nhãn “Cháy nắng” hoặc “Không cháy nắng” từ các đặc trưng categorical (màu tóc, chiều cao, cân nặng, dùng kem). Mục tiêu: xây một “rừng” nhỏ để minh hoạ cơ chế bagging + random feature. Siêu tham số:

  • Kích thước rừng: Decision Trees (mỗi cây học trên bootstrap dataset khác nhau).
  • Số đặc trưng xét tại mỗi nút: (mỗi lần tách, chỉ chọn ngẫu nhiên 2 feature để tìm split tốt nhất). Cách hoạt động tóm tắt: Với mỗi cây :
  • (1) tạo bootstrap từ tập gốc,
  • (2) ở mỗi nút chỉ xét đặc trưng ngẫu nhiên
  • (3) chọn ngưỡng tách làm giảm impurity (Gini/Entropy) lớn nhất,
  • (4) lặp đến khi đạt tiêu chí dừng. Khi dự đoán, gộp kết quả:

Bootstrap Sampling (Bagging)

image 21 10.png

Build Decision Trees: Tree 1 on Bootstrap Dataset 1

Split 1. Randomly select two features: Màu tóc, Dùng kem image 22 8.png Tính tại nút gốc : , Tiếp theo, thử Tính cho Màu tóc:

  • Nhánh Rám: 2 mẫu đều Không ⇒ G(Rám) = 0

  • Nhánh khác (Đen/Nâu): 4 mẫu với tỉ lệ Không, Cháy nắng

  • Gộp trọng số:

  • Gini Gain:

image 23 8.png

Tính Gini Gain cho Dùng kem:

  • Vì cả hai nhánh đều thuần:

  • Gini Gain:

image 24 8.pngDùng kem cho gain lớn nhất (so với “Màu tóc” chỉ 0.25), nên được chọn làm Split 1. image 25 8.png

Build Decision Trees: Tree 2 on Bootstrap Dataset 2


Build Decision Trees: Tree 3 on Bootstrap Dataset 3


Prediction & Aggregation