Chuyển đến nội dung chính

Bộ phân loại AdaBoost trong Python

Hiểu về cách tiếp cận ensemble, cách hoạt động của thuật toán AdaBoost và học xây dựng mô hình AdaBoost trong Python.
· 8 phút đọc

Khám phá cùng AI

Những năm gần đây, các thuật toán boosting ngày càng phổ biến trong khoa học dữ liệu và các cuộc thi máy học. Hầu hết người chiến thắng các cuộc thi này đều dùng boosting để đạt độ chính xác cao. Các cuộc thi khoa học dữ liệu mang đến nền tảng toàn cầu để học hỏi, khám phá và đưa ra lời giải cho nhiều bài toán của doanh nghiệp và chính phủ. Boosting kết hợp nhiều mô hình có độ chính xác thấp (hoặc yếu) để tạo ra mô hình có độ chính xác cao (hoặc mạnh). Nó có thể ứng dụng trong nhiều lĩnh vực như tín dụng, bảo hiểm, marketing và bán hàng. Các thuật toán boosting như AdaBoost, Gradient Boosting và XGBoost là những thuật toán máy học được dùng rộng rãi để chiến thắng các cuộc thi khoa học dữ liệu. Trong hướng dẫn này, bạn sẽ học thuật toán ensemble boosting AdaBoost, với các chủ đề sau:

Tiếp cận Học máy Ensemble

Ensemble là một mô hình tổng hợp, kết hợp một loạt bộ phân loại hoạt động kém nhằm tạo ra bộ phân loại được cải thiện. Ở đây, từng bộ phân loại bỏ phiếu và trả về nhãn dự đoán cuối cùng theo số đông. Ensemble mang lại độ chính xác cao hơn so với từng bộ phân loại riêng lẻ. Các phương pháp Ensemble có thể song song hóa bằng cách phân bổ mỗi bộ học cơ sở lên các máy khác nhau. Tóm lại, có thể nói phương pháp học Ensemble là các meta-algorithm kết hợp nhiều phương pháp học máy thành một mô hình dự đoán duy nhất để tăng hiệu năng. Ensemble có thể giảm phương sai bằng cách tiếp cận bagging, giảm độ chệch bằng cách tiếp cận boosting, hoặc cải thiện dự đoán bằng cách tiếp cận stacking.

Tiếp cận Học máy Ensemble
  1. Bagging là viết tắt của bootstrap aggregation. Nó kết hợp nhiều bộ học theo cách giảm phương sai của ước lượng. Ví dụ, Random Forest huấn luyện M Cây quyết định; bạn có thể huấn luyện M cây khác nhau trên các tập con ngẫu nhiên của dữ liệu và thực hiện bỏ phiếu cho dự đoán cuối cùng. Các phương pháp bagging tiêu biểu là Random Forest và Extra Trees.

  2. Các thuật toán Boosting là tập hợp các bộ phân loại độ chính xác thấp để tạo ra bộ phân loại có độ chính xác cao. Bộ phân loại độ chính xác thấp (hoặc bộ phân loại yếu) cho độ chính xác tốt hơn việc tung đồng xu. Bộ phân loại độ chính xác cao (hoặc bộ phân loại mạnh) có tỷ lệ lỗi gần 0. Thuật toán boosting có thể theo dõi mô hình nào dự đoán không chính xác. Các thuật toán boosting ít bị ảnh hưởng bởi vấn đề overfitting. Ba thuật toán dưới đây rất phổ biến trong các cuộc thi khoa học dữ liệu.

    • AdaBoost (Adaptive Boosting)
    • Gradient Tree Boosting
    • XGBoost
  3. Stacking (hoặc stacked generalization) là kỹ thuật học ensemble kết hợp dự đoán của nhiều mô hình phân loại cơ sở thành một tập dữ liệu mới. Dữ liệu mới này được xem là đầu vào cho một bộ phân loại khác, bộ này được dùng để giải quyết bài toán. Stacking thường được gọi là blending.

Tiếp cận Học máy Ensemble

Dựa trên cách sắp xếp các bộ học cơ sở, phương pháp ensemble có thể chia thành hai nhóm: ensemble song song sinh các bộ học cơ sở song song, ví dụ Random Forest. Trong ensemble tuần tự, các bộ học cơ sở được sinh tuần tự, ví dụ AdaBoost.

Dựa trên loại bộ học cơ sở, phương pháp ensemble có thể chia thành hai nhóm: ensemble đồng nhất sử dụng cùng một loại bộ học cơ sở ở mỗi vòng lặp. ensemble dị thể sử dụng các loại bộ học cơ sở khác nhau ở mỗi vòng lặp.

Bộ phân loại AdaBoost

Ada-boost hay Adaptive Boosting là một bộ phân loại boosting thuộc nhóm ensemble do Yoav Freund và Robert Schapire đề xuất năm 1996. Nó kết hợp nhiều bộ phân loại để tăng độ chính xác. AdaBoost là một phương pháp ensemble lặp. Bộ phân loại AdaBoost xây dựng một bộ phân loại mạnh bằng cách kết hợp nhiều bộ phân loại hoạt động kém để bạn nhận được bộ phân loại mạnh có độ chính xác cao. Ý tưởng cơ bản của Adaboost là đặt trọng số cho các bộ phân loại và mẫu huấn luyện ở mỗi vòng lặp sao cho đảm bảo dự đoán chính xác các quan sát bất thường. Bất kỳ thuật toán học máy nào cũng có thể dùng làm bộ phân loại cơ sở nếu nó chấp nhận trọng số trên tập huấn luyện. Adaboost cần đáp ứng hai điều kiện:

  1. Bộ phân loại phải được huấn luyện tương tác trên các mẫu huấn luyện có trọng số khác nhau.
  2. Ở mỗi vòng lặp, nó cố gắng khớp tốt các mẫu này bằng cách tối thiểu hóa lỗi huấn luyện.

Thuật toán AdaBoost hoạt động như thế nào?

Nó hoạt động theo các bước sau:

  1. Ban đầu, Adaboost chọn ngẫu nhiên một tập con huấn luyện.
  2. Nó lặp lại việc huấn luyện mô hình máy học AdaBoost bằng cách chọn tập huấn luyện dựa trên dự đoán chính xác của lần huấn luyện trước đó.
  3. Nó gán trọng số cao hơn cho các quan sát bị phân loại sai để ở vòng lặp tiếp theo, các quan sát này có xác suất cao được phân loại đúng.
  4. Đồng thời, nó gán trọng số cho bộ phân loại đã huấn luyện ở mỗi vòng lặp theo độ chính xác của bộ đó. Bộ phân loại càng chính xác sẽ nhận trọng số càng cao.
  5. Quy trình này lặp lại cho đến khi toàn bộ dữ liệu huấn luyện được khớp không lỗi hoặc cho đến khi đạt số lượng bộ ước lượng tối đa đã đặt.
  6. Để phân loại, thực hiện “bỏ phiếu” trên tất cả các thuật toán học mà bạn đã xây dựng.
Thuật toán AdaBoost hoạt động như thế nào?

Xây dựng mô hình trong Python

Nhập các thư viện cần thiết

Trước tiên, hãy tải các thư viện cần thiết.

# Load libraries
from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
# Import train_test_split function
from sklearn.model_selection import train_test_split
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics

Tải tập dữ liệu

Trong phần xây dựng mô hình, bạn có thể dùng tập dữ liệu IRIS, một bài toán phân loại đa lớp rất nổi tiếng. Tập dữ liệu này gồm 4 đặc trưng (chiều dài đài, chiều rộng đài, chiều dài cánh, chiều rộng cánh) và một nhãn đích (loại hoa). Dữ liệu có ba lớp hoa: Setosa, Versicolour và Virginica. Tập dữ liệu có sẵn trong thư viện scikit-learn, hoặc bạn cũng có thể tải từ UCI Machine Learning Library.

# Load data
iris = datasets.load_iris()
X = iris.data
y = iris.target

Chia tập dữ liệu

Để hiểu hiệu năng mô hình, việc chia dữ liệu thành tập huấn luyện và tập kiểm tra là một chiến lược tốt.

Hãy chia dữ liệu bằng hàm train_test_split(). Bạn cần truyền 3 tham số: đặc trưng, nhãn đích và kích thước tập kiểm tra.

# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 70% training and 30% test

Xây dựng mô hình AdaBoost

Hãy tạo mô hình AdaBoost bằng Scikit-learn. AdaBoost dùng Decision Tree Classifier làm bộ phân loại mặc định.

# Create adaboost classifer object
abc = AdaBoostClassifier(n_estimators=50,
                         learning_rate=1)
# Train Adaboost Classifer
model = abc.fit(X_train, y_train)

#Predict the response for test dataset
y_pred = model.predict(X_test)

"Các tham số quan trọng nhất là base_estimator, n_estimators và learning_rate." (Adaboost Classifier, Chris Albon)

  • base_estimator: Bộ học yếu dùng để huấn luyện mô hình. Mặc định dùng DecisionTreeClassifier làm bộ học yếu cho mục đích huấn luyện. Bạn cũng có thể chỉ định các thuật toán học máy khác.
  • n_estimators: Số lượng bộ học yếu được huấn luyện lặp.
  • learning_rate: Góp phần vào trọng số của các bộ học yếu. Mặc định là 1.

Đánh giá mô hình

Hãy ước lượng mức độ chính xác mà bộ phân loại hoặc mô hình có thể dự đoán loại giống hoa.

Độ chính xác có thể tính bằng cách so sánh giá trị thực tế của tập kiểm tra và giá trị dự đoán.

# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.8888888888888888

Bạn đạt độ chính xác 88,88%, được xem là tốt.

Để đánh giá thêm, bạn cũng có thể tạo mô hình với các Bộ ước lượng Cơ sở khác nhau.

Sử dụng các bộ học cơ sở khác nhau

Tôi đã dùng SVC làm bộ ước lượng cơ sở. Bạn có thể dùng bất kỳ bộ học ML nào làm bộ ước lượng cơ sở nếu nó chấp nhận trọng số mẫu, như Decision Tree, Support Vector Classifier.

# Load libraries
from sklearn.ensemble import AdaBoostClassifier

# Import Support Vector Classifier
from sklearn.svm import SVC
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
svc=SVC(probability=True, kernel='linear')

# Create adaboost classifer object
abc =AdaBoostClassifier(n_estimators=50, base_estimator=svc,learning_rate=1)

# Train Adaboost Classifer
model = abc.fit(X_train, y_train)

#Predict the response for test dataset
y_pred = model.predict(X_test)


# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.9555555555555556

Bạn đạt tỷ lệ phân loại 95,55%, được xem là tốt.

Trong trường hợp này, Bộ ước lượng cơ sở SVC cho độ chính xác tốt hơn so với Bộ ước lượng cơ sở Decision Tree.

Ưu điểm

AdaBoost dễ triển khai. Nó lặp lại việc sửa lỗi của bộ phân loại yếu và cải thiện độ chính xác bằng cách kết hợp các bộ học yếu. Bạn có thể dùng nhiều bộ phân loại cơ sở với AdaBoost. AdaBoost không dễ bị overfitting. Điều này được thấy qua kết quả thực nghiệm, nhưng chưa có lý do chắc chắn.

Nhược điểm

AdaBoost nhạy với dữ liệu nhiễu. Nó bị ảnh hưởng mạnh bởi ngoại lệ vì cố gắng khớp hoàn hảo từng điểm dữ liệu. AdaBoost chậm hơn so với XGBoost.

Kết luận

Chúc mừng bạn đã hoàn thành hướng dẫn này!

Trong hướng dẫn này, bạn đã học về các Tiếp cận Học máy Ensemble, thuật toán AdaBoost, cách hoạt động, xây dựng và đánh giá mô hình bằng gói Python Scikit-learn. Đồng thời, chúng ta cũng thảo luận về ưu và nhược điểm của nó.

Tôi mong nhận được mọi phản hồi hoặc câu hỏi. Bạn có thể để lại bình luận, tôi sẽ cố gắng trả lời tốt nhất.

Nếu bạn muốn tìm hiểu thêm về máy học trong Python, hãy xem khóa học Extreme Gradient Boosting with XGBoost và Python Machine Learning: Scikit-Learn Tutorial của DataCamp.

Chủ đề

Liên quan