Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Thuật toán AdaBoost trong Python
Trong bài hướng dẫn này, mình sẽ triển khai thuật toán AdaBoost chỉ bằng các module Python cơ bản và thư viện numpy
. Đây là một kỹ thuật tổ hợp mạnh mẽ giúp kết hợp nhiều mô hình "yếu" (weak classifiers) thành một mô hình "mạnh" (strong classifier).
Mình sẽ cùng tìm hiểu các khái niệm, toán học đằng sau thuật toán AdaBoost và triển khai chi tiết thuật toán từ đầu.
Tổng quan Về AdaBoost trong Python
AdaBoost (Adaptive Boosting) là một thuật toán học tổ hợp, nổi bật nhờ việc tăng cường hiệu suất của các bộ phân loại yếu. Thuật toán sử dụng cách tiếp cận trọng số, trong đó:
- Trọng số được gán ban đầu cho từng mẫu dữ liệu.
- Sau mỗi lần huấn luyện, trọng số được điều chỉnh dựa trên mẫu nào bị phân loại sai.
- Bộ phân loại yếu được tổng hợp bằng cách tính trọng số (alpha) dựa trên lỗi của nó.
Kết quả là một tổ hợp các mô hình phân loại được "boost" qua nhiều vòng lặp.
Bài viết này được đăng tại [free tuts .net]
Cây Quyết Định Nhỏ (Decision Stump)
Cây quyết định nhỏ là bộ phân loại đơn giản, thường được dùng làm mô hình "yếu" trong AdaBoost.
import numpy as np class DecisionStump: def __init__(self): self.polarity = 1 # Hướng của quyết định (>= hoặc <) self.feature_idx = None # Chỉ số đặc trưng self.threshold = None # Ngưỡng phân loại self.alpha = None # Trọng số của bộ phân loại def predict(self, X): """ Dự đoán nhãn (-1 hoặc 1) cho dữ liệu X. """ n_samples = X.shape[0] X_column = X[:, self.feature_idx] predictions = np.ones(n_samples) if self.polarity == 1: predictions[X_column < self.threshold] = -1 else: predictions[X_column > self.threshold] = -1 return predictions
Thuật Toán AdaBoost
Thuật toán AdaBoost kết hợp nhiều cây quyết định nhỏ để tạo thành một bộ phân loại mạnh.
class Adaboost: def __init__(self, n_clf=5): """ - n_clf: Số bộ phân loại yếu (decision stumps) cần tạo. """ self.n_clf = n_clf def fit(self, X, y): """ Huấn luyện mô hình AdaBoost. - X: Dữ liệu đầu vào (n_samples, n_features). - y: Nhãn (-1 hoặc 1). """ n_samples, n_features = X.shape # Khởi tạo trọng số cho từng mẫu w = np.full(n_samples, (1 / n_samples)) self.clfs = [] for _ in range(self.n_clf): clf = DecisionStump() min_error = float('inf') # Tìm ngưỡng tốt nhất cho từng đặc trưng for feature_i in range(n_features): X_column = X[:, feature_i] thresholds = np.unique(X_column) for threshold in thresholds: p = 1 # Mặc định polarity = 1 predictions = np.ones(n_samples) predictions[X_column < threshold] = -1 # Tính lỗi misclassified = w[y != predictions] error = sum(misclassified) if error > 0.5: error = 1 - error p = -1 # Lưu cây quyết định tốt nhất if error < min_error: clf.polarity = p clf.threshold = threshold clf.feature_idx = feature_i min_error = error # Tính trọng số alpha EPS = 1e-10 # Tránh lỗi số học khi chia cho 0 clf.alpha = 0.5 * np.log((1.0 - min_error + EPS) / (min_error + EPS)) # Cập nhật trọng số mẫu predictions = clf.predict(X) w *= np.exp(-clf.alpha * y * predictions) w /= np.sum(w) # Lưu bộ phân loại self.clfs.append(clf) def predict(self, X): """ Dự đoán nhãn dữ liệu dựa trên tổ hợp các bộ phân loại yếu. """ clf_preds = [clf.alpha * clf.predict(X) for clf in self.clfs] y_pred = np.sum(clf_preds, axis=0) y_pred = np.sign(y_pred) return y_pred
Giải thích mã nguồn
Khởi tạo DecisionStump
:
- Bộ phân loại yếu sử dụng một đặc trưng và một ngưỡng để dự đoán.
Tìm bộ phân loại tối ưu:
- Mỗi vòng lặp, thuật toán tìm ngưỡng và đặc trưng sao cho giảm thiểu lỗi.
Cập nhật trọng số:
- Trọng số của các mẫu bị phân loại sai sẽ tăng, giúp các vòng lặp sau chú trọng hơn vào chúng.
Tính trọng số (alpha):
- Bộ phân loại yếu có hiệu quả tốt sẽ được gán trọng số lớn hơn trong tổ hợp.
Tổ hợp kết quả:
- Kết quả cuối cùng là tổng có trọng số từ các bộ phân loại yếu.
Ví dụ sử dụng AdaBoost trong Python
from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.datasets import make_classification # Tạo dữ liệu mẫu X, y = make_classification(n_samples=500, n_features=10, n_classes=2, random_state=42) y = np.where(y == 0, -1, 1) # Chuyển nhãn 0 thành -1 để phù hợp với AdaBoost # Chia dữ liệu thành tập huấn luyện và kiểm tra X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Huấn luyện mô hình AdaBoost model = Adaboost(n_clf=10) model.fit(X_train, y_train) # Dự đoán và đánh giá y_pred = model.predict(X_test) print("Độ chính xác:", accuracy_score(y_test, y_pred))
Kết bài
AdaBoost là thuật toán linh hoạt và hiệu quả cho các bài toán phân loại. Việc triển khai từ đầu giúp bạn hiểu rõ cơ chế hoạt động và cách tổ hợp các mô hình yếu để tạo thành mô hình mạnh mẽ. Hy vọng bài viết này hữu ích cho bạn trong việc áp dụng thuật toán vào các dự án thực tế!