Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Triển khai thuật toán Random Forest bằng Python
Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu cách triển khai thuật toán Random Forest bằng cách chỉ sử dụng các module Python cơ bản và thư viện numpy. Random Forest là một thuật toán Học Máy phổ biến và hiệu quả, dựa trên việc kết hợp nhiều cây quyết định (Decision Trees) để cải thiện độ chính xác và tính ổn định của mô hình.
Cùng với việc viết mã, bạn sẽ hiểu rõ cách hoạt động của thuật toán và những khái niệm toán học đứng sau nó, từ việc lấy mẫu (bootstrap sampling), xây dựng cây quyết định cho đến quá trình lấy ý kiến đa số (majority voting).
Cách triển khai thuật toán Random Forest bằng module Python
Dưới đây là đoạn mã nguồn kèm giải thích để bạn từng bước hiểu cách xây dựng thuật toán.
import numpy as np from collections import Counter from decision_tree import DecisionTree # Hàm tạo mẫu ngẫu nhiên với hoàn lại (bootstrap sampling) def bootstrap_sample(X, y): n_samples = X.shape[0] idxs = np.random.choice(n_samples, n_samples, replace=True) return X[idxs], y[idxs] # Hàm xác định nhãn phổ biến nhất def most_common_label(y): counter = Counter(y) most_common = counter.most_common(1)[0][0] return most_common # Lớp triển khai thuật toán Random Forest class RandomForest: def __init__(self, n_trees=10, min_samples_split=2, max_depth=100, n_feats=None): """ Khởi tạo các tham số của rừng ngẫu nhiên: - n_trees: số lượng cây quyết định. - min_samples_split: số mẫu tối thiểu để tiếp tục chia node. - max_depth: độ sâu tối đa của cây. - n_feats: số lượng đặc trưng ngẫu nhiên sử dụng tại mỗi node (tùy chọn). """ self.n_trees = n_trees self.min_samples_split = min_samples_split self.max_depth = max_depth self.n_feats = n_feats self.trees = [] # Danh sách lưu các cây trong rừng def fit(self, X, y): """ Huấn luyện Random Forest: - Khởi tạo và huấn luyện từng cây quyết định với dữ liệu bootstrap. """ self.trees = [] for _ in range(self.n_trees): tree = DecisionTree(min_samples_split=self.min_samples_split, max_depth=self.max_depth, n_feats=self.n_feats) # Tạo mẫu bootstrap X_samp, y_samp = bootstrap_sample(X, y) tree.fit(X_samp, y_samp) self.trees.append(tree) def predict(self, X): """ Dự đoán nhãn cho tập dữ liệu X: - Lấy dự đoán từ từng cây trong rừng. - Kết hợp dự đoán từ tất cả các cây bằng cách lấy ý kiến đa số. """ # Lấy dự đoán từ mỗi cây tree_preds = np.array([tree.predict(X) for tree in self.trees]) # Đổi trục để dễ xử lý: mỗi hàng tương ứng với dự đoán của các cây cho một mẫu tree_preds = np.swapaxes(tree_preds, 0, 1) # Lấy ý kiến đa số cho từng mẫu y_pred = [most_common_label(tree_pred) for tree_pred in tree_preds] return np.array(y_pred)
Giải thích chi tiết mã nguồn
Bài viết này được đăng tại [free tuts .net]
Tạo mẫu bootstrap:
Hàm bootstrap_sample(X, y)
tạo các tập mẫu mới bằng cách chọn ngẫu nhiên các mẫu trong tập dữ liệu ban đầu với hoàn lại (with replacement).
Lấy nhãn phổ biến nhất:
Hàm most_common_label(y)
sử dụng Counter để tìm nhãn xuất hiện nhiều nhất trong một tập hợp nhãn.
Huấn luyện cây trong rừng:
- Trong phương thức
fit
, mỗi cây quyết định được huấn luyện với một tập dữ liệu mẫu bootstrap khác nhau. - Tham số
n_feats
giúp giới hạn số đặc trưng được sử dụng tại mỗi node của cây, điều này giúp tăng tính ngẫu nhiên và cải thiện hiệu quả của rừng.
Dự đoán với Random Forest:
- Phương thức
predict
thu thập dự đoán từ tất cả các cây quyết định. - Áp dụng phương pháp "lấy ý kiến đa số" (majority voting) để kết hợp dự đoán cuối cùng cho từng mẫu.
Kết bài
Thuật toán Random Forest cung cấp một mô hình mạnh mẽ và dễ áp dụng cho cả bài toán phân loại và hồi quy. Với việc xây dựng từ đầu như trên, bạn không chỉ hiểu sâu hơn về thuật toán mà còn có thể tùy chỉnh nó theo nhu cầu riêng. Cách tiếp cận này cũng giúp bạn tự tin hơn trong việc áp dụng các thuật toán học máy vào thực tế.