Các Phương Pháp Ensemble Trong Machine Learning: Bagging, Boosting, Stacking, Voting, Blending

Machine learning là một nhánh của trí tuệ nhân tạo, tập trung vào việc xây dựng các hệ thống tự động học và thích ứng. Nó sử dụng các mô hình thống kê để trực quan hóa, phân tích và dự đoán dữ liệu. Một mô hình machine learning cơ bản bao gồm tập dữ liệu (để huấn luyện mô hình) và thuật toán (để học từ dữ liệu). Tuy nhiên, một số mô hình có độ chính xác thấp và kết quả đưa ra không được chính xác. Một trong những giải pháp đơn giản nhất để khắc phục vấn đề này là sử dụng ensemble learning.

Ensemble learning là một phương pháp meta, kết hợp nhiều mô hình machine learning để tạo ra một mô hình tối ưu, từ đó nâng cao hiệu suất của mô hình. Ensemble learning có thể giảm overfitting một cách dễ dàng, tránh tình trạng mô hình hoạt động tốt trên tập huấn luyện nhưng không đưa ra kết quả tốt trên tập kiểm tra.

Tóm tắt các ưu điểm của ensemble learning:

  • Tăng hiệu suất mô hình
  • Giảm overfitting
  • Giảm phương sai
  • Cung cấp độ chính xác dự đoán cao hơn so với các mô hình đơn lẻ
  • Có thể xử lý dữ liệu tuyến tính và phi tuyến tính
  • Có thể được sử dụng để giải quyết các bài toán hồi quy và phân loại

Dưới đây chúng ta sẽ tìm hiểu các phương pháp ensemble learning khác nhau:

Voting

Voting là một kỹ thuật ensemble learning kết hợp các dự đoán từ nhiều mô hình machine learning khác nhau để tạo ra kết quả. Nhiều mô hình cơ bản được huấn luyện trên toàn bộ tập dữ liệu để đưa ra dự đoán. Mỗi dự đoán của mô hình được coi là một "phiếu bầu". Dự đoán nhận được nhiều phiếu bầu nhất sẽ được chọn làm dự đoán cuối cùng.

Có hai loại voting để tổng hợp các dự đoán cơ bản - hard voting và soft voting.

Hard voting chọn dự đoán có số phiếu bầu cao nhất làm dự đoán cuối cùng, trong khi soft voting kết hợp xác suất của mỗi lớp từ mỗi mô hình và chọn lớp có xác suất cao nhất làm dự đoán cuối cùng.

Trong các bài toán hồi quy, cách hoạt động hơi khác một chút vì thay vì tìm lớp có tần suất cao nhất, chúng ta lấy dự đoán của mỗi mô hình và tính trung bình chúng để đưa ra dự đoán cuối cùng.

from sklearn.ensemble import VotingRegressor

from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor

ensemble_voting = VotingRegressor(
    estimators=[
        ('dtr', DecisionTreeRegressor(max_depth=5, random_state=42)),
        ('lr', LinearRegression()),
        ('knr', KNeighborsRegressor())
    ])
ensemble_voting.fit(X_train, y_train)

Bagging

Bagging sử dụng nhiều mô hình machine learning yếu và tổng hợp các dự đoán của chúng để tạo ra dự đoán tốt nhất. Nó dựa trên bootstrap aggregation, trong đó bootstrap là một kỹ thuật lấy mẫu ngẫu nhiên từ tập hợp có thay thế. Aggregation là quá trình kết hợp nhiều dự đoán để tạo ra dự đoán cuối cùng.

Random forest là một trong những mô hình phổ biến nhất sử dụng Bagging. Nó bao gồm nhiều cây quyết định hoạt động như một khối thống nhất. Random forest sử dụng khái niệm Bagging và tính ngẫu nhiên của đặc trưng để tạo ra mỗi cây độc lập. Mỗi cây quyết định được huấn luyện từ các mẫu được lấy ngẫu nhiên từ dữ liệu. Trong random forest, các cây cuối cùng không chỉ được huấn luyện trên các tập dữ liệu khác nhau mà còn sử dụng các đặc trưng khác nhau để dự đoán kết quả.

Bagging thường có hai loại - tập hợp các cây quyết định (được gọi là random forest) và tập hợp các mô hình ngoài cây quyết định. Cả hai đều hoạt động tương tự, sử dụng phương pháp tổng hợp để tạo dự đoán cuối cùng, chỉ khác nhau ở mô hình mà chúng dựa trên. Trong sklearn, chúng ta có lớp BaggingClassifier để tạo các mô hình ngoài cây quyết định.

from sklearn.ensemble import RandomForestClassifier, BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC

rf_classifier = RandomForestClassifier(
    n_estimators=15, 
    criterion="gini",
    max_depth=10
)
rf_classifier.fit(x_train, y_train)

bagging_clf = BaggingClassifier(
    base_estimator=DecisionTreeClassifier(max_depth=3),
    n_estimators=12,
    random_state=5
)
bagging_clf.fit(X_train, y_train)

Boosting

Các phương pháp ensemble Boosting chuyển đổi các weak learner thành strong learner bằng cách chú trọng vào các lỗi của mô hình trước đó. Boosting triển khai các thuật toán ML đồng nhất theo cách tuần tự, mỗi mô hình cố gắng cải thiện độ ổn định của toàn bộ quá trình bằng cách giảm sai số của mô hình trước đó.

Khi huấn luyện mô hình thứ n+1, mỗi điểm dữ liệu trong tập dữ liệu được gán trọng số bằng nhau, sao cho các mẫu bị phân loại sai bởi mô hình n sẽ được gán trọng số cao hơn (quan trọng hơn). Lỗi được truyền từ n learner sang n+1 learner, mỗi learner cố gắng giảm thiểu lỗi.

AdaBoost là một trong những mô hình cơ bản nhất sử dụng Boosting để tạo dự đoán. AdaBoost tạo ra một rừng decision stump (một stump chỉ có một node và hai lá) khác với random forest tạo ra cả cây quyết định hoàn chỉnh. Nó gán trọng số cao hơn cho các mẫu bị phân loại sai và tiếp tục huấn luyện mô hình cho đến khi đạt được tỷ lệ lỗi thấp.

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier

base_tree = DecisionTreeClassifier(max_depth=3, random_state=1)
ada_classifier = AdaBoostClassifier(
    base_estimator=base_tree, 
    n_estimators=10, 
    learning_rate=0.05, 
    random_state=1
)

ada_classifier.fit(x_train, y_train)

Stacking

Stacking còn được gọi là stacked generalization, là một dạng kỹ thuật ensemble được đề xuất bởi David H. Wolpert vào năm 1992, nhằm mục đích giảm sai số bằng cách sử dụng các bộ tổng quát hóa khác nhau.

Mô hình stacking sử dụng các dự đoán từ nhiều mô hình cơ bản để xây dựng mô hình meta, được sử dụng để tạo dự đoán cuối cùng. Mô hình stacking bao gồm nhiều lớp, trong đó mỗi lớp gồm một số mô hình machine learning, và các dự đoán của chúng được sử dụng để huấn luyện lớp tiếp theo.

Trong quá trình stacking, dữ liệu được chia thành hai phần: tập huấn luyện và tập kiểm tra. Tập huấn luyện được chia tiếp thành k-fold. Các mô hình cơ bản được huấn luyện trên k-1 phần và dự đoán trên phần kᵗʰ. Quá trình này được lặp lại cho đến khi mỗi fold được dự đoán. Sau đó, các mô hình cơ bản được fit trên toàn bộ tập dữ liệu và đánh giá hiệu suất. Quá trình này cũng được áp dụng cho các mô hình cơ bản khác.

Các dự đoán từ tập huấn luyện được sử dụng làm đặc trưng để xây dựng mô hình lớp thứ hai hoặc meta model. Mô hình cấp hai này được sử dụng để dự đoán tập kiểm tra.

from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import RidgeClassifier
from sklearn.ensemble import StackingClassifier

base_learners = [
    ('knn', KNeighborsClassifier(n_neighbors=3)),
    ('dt', DecisionTreeClassifier(max_depth=4)),
    ('ridge', RidgeClassifier(alpha=1.0))
]

stacking_model = StackingClassifier(
    estimators=base_learners, 
    final_estimator=RidgeClassifier(),
    cv=3
)
stacking_model.fit(X_train, y_train)

Blending

Blending là một dạng kỹ thuật ensemble learning khác được phát triển từ Stacking, và điểm khác biệt duy nhất giữa hai phương pháp là nó sử dụng tập holdout (validation) từ một tập huấn luyện để thực hiện dự đoán. Nói một cách đơn giản, dự đoán chỉ được thực hiện cho tập dữ liệu được giữ lại. Tập dữ liệu holdout và các dự đoán được sử dụng để xây dựng mô hình cấp hai.

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC

from sklearn.linear_model import LogisticRegression

X, y = make_classification(
    n_samples=8000, 
    n_features=15, 
    n_informative=12, 
    n_redundant=3, 
    random_state=99
)

X_train_full, X_test, y_train_full, y_test = train_test_split(
    X, y, test_size=0.25, random_state=7
)
X_train, X_val, y_train, y_val = train_test_split(
    X_train_full, y_train_full, test_size=0.3, random_state=7
)

def initialize_base_models():
    models = list()
    models.append(('knn', KNeighborsClassifier(n_neighbors=5)))
    models.append(('dtree', DecisionTreeClassifier(max_depth=6)))
    models.append(('svc', SVC(kernel='rbf', probability=True)))
    return models

base_models = initialize_base_models()
meta_features = list()

for name, model in base_models:
    model.fit(X_train, y_train)
    proba_predictions = model.predict_proba(X_val)
    meta_features.append(proba_predictions)

meta_features = np.hstack(meta_features)

meta_learner = LogisticRegression(max_iter=500)
meta_learner.fit(meta_features, y_val)

meta_features_test = list()
for name, model in base_models:
    proba = model.predict_proba(X_test)
    meta_features_test.append(proba)

meta_features_test = np.hstack(meta_features_test)
final_predictions = meta_learner.predict(meta_features_test)

accuracy = accuracy_score(y_test, final_predictions)
print('Blending Accuracy: %.3f' % (accuracy*100))

Kết luận

Sau khi đọc bài viết này, bạn có thể thắc mắc liệu có phương pháp tốt nhất để chọn mô hình hay không, hoặc nên sử dụng kỹ thuật ensemble nào khi cần thiết.

Khi đối mặt với câu hỏi này, chúng tôi luôn khuyên bạn nên bắt đầu từ một mô hình đơn lẻ đơn giản, sau đó thử nghiệm với các kỹ thuật mô hình hóa khác nhau như ensemble learning. Trong một số trường hợp, mô hình đơn lẻ có thể hoạt động tốt hơn mô hình ensemble, thậm chí còn tốt hơn nhiều.

Cần lưu ý rằng: ensemble learning không bao giờ nên là lựa chọn đầu tiên, mà nên là lựa chọn cuối cùng. Lý do rất đơn giản: việc huấn luyện một mô hình ensemble sẽ tốn nhiều thời gian và đòi hỏi khả năng xử lý đáng kể.

Quay lại với câu hỏi của chúng ta, các mô hình ensemble nhằm mục đích cải thiện khả năng dự đoán của mô hình bằng cách kết hợp một số mô hình cơ bản cùng loại. Mỗi kỹ thuật ensemble đều có ưu điểm riêng và giúp cải thiện hiệu suất mô hình.

Nếu bạn đang tìm kiếm một phương pháp ensemble đơn giản và dễ triển khai, bạn nên sử dụng Voting. Nếu dữ liệu của bạn có phương sai cao, bạn nên thử Bagging. Nếu các mô hình cơ bản được huấn luyện có độ lệch cao trong dự đoán, bạn có thể thử các kỹ thuật Boosting khác nhau để cải thiện độ chính xác. Nếu có nhiều mô hình cơ bản hoạt động tốt trên dữ liệu và bạn không biết chọn mô hình nào làm mô hình cuối cùng, bạn có thể sử dụng phương pháp Stacking hoặc Blending. Tất nhiên, phương pháp nào hoạt động tốt nhất phụ thuộc vào dữ liệu và phân bố đặc trưng.

Cuối cùng, các kỹ thuật ensemble learning là công cụ mạnh mẽ để cải thiện độ chính xác và hiệu suất của mô hình, chúng có thể dễ dàng giảm cơ hội overfitting và underfitting, đặc biệt khi tham gia các cuộc thi đây là yếu tố quan trọng để nâng cao điểm số.

Đăng vào ngày 30 tháng 5 lúc 16:12