Học máy - Tổng hợp Bootstrap (Đóng gói)
Trên trang này, W3schools.com hợp tác với Học viện Khoa học Dữ liệu NYC để cung cấp nội dung đào tạo kỹ thuật số cho sinh viên của chúng tôi.
Đóng bao
Các phương pháp như Cây quyết định có thể dễ bị trang bị quá mức trên tập huấn luyện, dẫn đến dự đoán sai về dữ liệu mới.
Bootstrap Aggregation (đóng bao) là một phương pháp tập hợp nhằm giải quyết vấn đề trang bị quá mức cho các vấn đề phân loại hoặc hồi quy. Đóng bao nhằm mục đích cải thiện độ chính xác và hiệu suất của các thuật toán học máy. Nó thực hiện điều này bằng cách lấy các tập hợp con ngẫu nhiên của tập dữ liệu gốc, có thay thế và khớp với bộ phân loại (để phân loại) hoặc bộ hồi quy (để hồi quy) cho mỗi tập hợp con. Các dự đoán cho từng tập hợp con sau đó được tổng hợp thông qua phiếu bầu đa số để phân loại hoặc tính trung bình cho hồi quy, làm tăng độ chính xác của dự đoán.
Đánh giá một bộ phân loại cơ sở
Để xem việc đóng bao có thể cải thiện hiệu suất của mô hình như thế nào, chúng ta phải bắt đầu bằng cách đánh giá cách thức hoạt động của trình phân loại cơ sở trên tập dữ liệu. Nếu bạn không biết cây quyết định là gì, hãy xem lại bài học về cây quyết định trước khi tiếp tục, vì đóng bao là phần tiếp theo của khái niệm.
Chúng tôi sẽ tìm cách xác định các loại rượu khác nhau được tìm thấy trong bộ dữ liệu rượu của Sklearn.
Hãy bắt đầu bằng cách nhập các mô-đun cần thiết. from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
Tiếp theo, chúng ta cần tải dữ liệu và lưu trữ vào X (tính năng đầu vào) và y (đích). Tham số as_frame được đặt bằng True để chúng ta không bị mất tên tính năng khi tải dữ liệu. (phiên bản sklearn
cũ hơn 0,23 phải bỏ qua đối số as_frame
vì nó không được hỗ trợ)
data = datasets.load_wine(as_frame = True)
X = data.data
y = data.target
Để đánh giá chính xác mô hình của chúng tôi trên dữ liệu chưa nhìn thấy, chúng tôi cần chia X và y thành các tập huấn luyện và kiểm tra. Để biết thông tin về việc chia nhỏ dữ liệu, hãy xem bài Đào tạo/Kiểm tra.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)
Với dữ liệu đã được chuẩn bị, giờ đây chúng tôi có thể khởi tạo trình phân loại cơ sở và điều chỉnh nó phù hợp với dữ liệu huấn luyện.
dtree = DecisionTreeClassifier(random_state = 22)
dtree.fit(X_train,y_train)
Kết quả:
DecisionTreeClassifier(random_state=22)
Bây giờ chúng ta có thể dự đoán loại rượu qua tập kiểm tra chưa được nhìn thấy và đánh giá hiệu suất của mô hình.
y_pred = dtree.predict(X_test)
print("Train data accuracy:",accuracy_score(y_true = y_train, y_pred = dtree.predict(X_train)))
print("Test data accuracy:",accuracy_score(y_true = y_test, y_pred = y_pred))
Kết quả:
Train data accuracy: 1.0
Test data accuracy: 0.8222222222222222
Ví dụ
Nhập dữ liệu cần thiết và đánh giá hiệu suất phân loại cơ sở.
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
data = datasets.load_wine(as_frame = True)
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)
dtree = DecisionTreeClassifier(random_state = 22)
dtree.fit(X_train,y_train)
y_pred = dtree.predict(X_test)
print("Train data accuracy:",accuracy_score(y_true = y_train, y_pred = dtree.predict(X_train)))
print("Test data accuracy:",accuracy_score(y_true = y_test, y_pred = y_pred))
Chạy ví dụ » Trình phân loại cơ sở hoạt động khá tốt trên tập dữ liệu đạt độ chính xác 82% trên tập dữ liệu thử nghiệm với các tham số hiện tại (Các kết quả khác nhau có thể xảy ra nếu bạn không đặt tham số random_state
).
Bây giờ chúng ta đã có độ chính xác cơ bản cho tập dữ liệu thử nghiệm, chúng ta có thể thấy Trình phân loại đóng bao thực hiện một Trình phân loại cây quyết định duy nhất như thế nào.
QUẢNG CÁO
Tạo một bộ phân loại đóng bao
Để đóng bao, chúng ta cần đặt tham số n_estimators, đây là số lượng bộ phân loại cơ sở mà mô hình của chúng ta sẽ tổng hợp lại với nhau.
Đối với tập dữ liệu mẫu này, số lượng ước tính tương đối thấp, thường xảy ra trường hợp khám phá phạm vi lớn hơn nhiều. Việc điều chỉnh siêu tham số thường được thực hiện bằng tìm kiếm dạng lưới , nhưng hiện tại, chúng tôi sẽ sử dụng một bộ giá trị được chọn cho số lượng công cụ ước tính.
Chúng tôi bắt đầu bằng cách nhập mô hình cần thiết.
from sklearn.ensemble import BaggingClassifier
Bây giờ, hãy tạo một phạm vi giá trị đại diện cho số lượng công cụ ước tính mà chúng tôi muốn sử dụng trong mỗi tập hợp.
estimator_range = [2,4,6,8,10,12,14,16]
Để xem Trình phân loại đóng bao hoạt động như thế nào với các giá trị khác nhau của n_estimators, chúng ta cần một cách lặp lại trong phạm vi giá trị và lưu trữ kết quả từ mỗi nhóm. Để làm điều này, chúng ta sẽ tạo một vòng lặp for, lưu trữ các mô hình và điểm số trong các danh sách riêng biệt để hiển thị sau này.
Lưu ý: Tham số mặc định cho trình phân loại cơ sở trong BaggingClassifier
là DicisionTreeClassifier
do đó chúng ta không cần đặt tham số này khi khởi tạo mô hình đóng bao.
models = []
scores = []
for n_estimators in estimator_range:
# Create bagging classifier
clf = BaggingClassifier(n_estimators = n_estimators, random_state = 22)
# Fit the model
clf.fit(X_train, y_train)
# Append the model and score to their respective list
models.append(clf)
scores.append(accuracy_score(y_true = y_test, y_pred = clf.predict(X_test)))
Với các mô hình và điểm số được lưu trữ, giờ đây chúng ta có thể hình dung được sự cải thiện về hiệu suất của mô hình.
import matplotlib.pyplot as plt
# Generate the plot of scores against number of estimators
plt.figure(figsize=(9,6))
plt.plot(estimator_range, scores)
# Adjust labels and font (to make visable)
plt.xlabel("n_estimators", fontsize = 18)
plt.ylabel("score", fontsize = 18)
plt.tick_params(labelsize = 16)
# Visualize plot
plt.show()
Ví dụ
Nhập dữ liệu cần thiết và đánh giá hiệu suất BaggingClassifier
.
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import BaggingClassifier
data = datasets.load_wine(as_frame = True)
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)
estimator_range = [2,4,6,8,10,12,14,16]
models = []
scores = []
for n_estimators in estimator_range:
# Create bagging classifier
clf = BaggingClassifier(n_estimators = n_estimators, random_state = 22)
# Fit the model
clf.fit(X_train, y_train)
# Append the model and score to their respective list
models.append(clf)
scores.append(accuracy_score(y_true = y_test, y_pred = clf.predict(X_test)))
# Generate the plot of scores against number of estimators
plt.figure(figsize=(9,6))
plt.plot(estimator_range, scores)
# Adjust labels and font (to make visable)
plt.xlabel("n_estimators", fontsize = 18)
plt.ylabel("score", fontsize = 18)
plt.tick_params(labelsize = 16)
# Visualize plot
plt.show()
Kết quả
Chạy ví dụ »Kết quả được giải thích
Bằng cách lặp qua các giá trị khác nhau cho số lượng công cụ ước tính, chúng ta có thể thấy hiệu suất mô hình tăng từ 82,2% lên 95,5%. Sau 14 công cụ ước tính, độ chính xác bắt đầu giảm, một lần nữa nếu bạn đặt random_state
khác thì các giá trị bạn thấy sẽ thay đổi. Đó là lý do tại sao cách tốt nhất là sử dụng xác thực chéo để đảm bảo kết quả ổn định.
Trong trường hợp này, chúng tôi thấy độ chính xác tăng 13,3% khi xác định loại rượu.
Một hình thức đánh giá khác
Khi bootstrapping chọn các tập hợp con quan sát ngẫu nhiên để tạo các bộ phân loại, có những quan sát bị loại bỏ trong quá trình lựa chọn. Sau đó, những quan sát "ngoài túi" này có thể được sử dụng để đánh giá mô hình, tương tự như mô hình của bộ thử nghiệm. Hãy nhớ rằng ước tính tự dùng đó có thể đánh giá quá cao lỗi trong các vấn đề phân loại nhị phân và chỉ nên được sử dụng như một sự bổ sung cho các số liệu khác.
Chúng ta đã thấy trong bài tập trước rằng 12 công cụ ước tính mang lại độ chính xác cao nhất, vì vậy chúng ta sẽ sử dụng công cụ đó để tạo mô hình của mình. Lần này, đặt tham số oob_score
thành true để đánh giá mô hình với điểm sẵn có.
Ví dụ
Tạo một mô hình với số liệu sẵn có.
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
data = datasets.load_wine(as_frame = True)
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)
oob_model = BaggingClassifier(n_estimators = 12, oob_score = True,random_state = 22)
oob_model.fit(X_train, y_train)
print(oob_model.oob_score_)
Chạy ví dụ »Vì các mẫu được sử dụng trong OOB và bộ kiểm tra là khác nhau và tập dữ liệu tương đối nhỏ nên có sự khác biệt về độ chính xác. Rất hiếm khi chúng giống hệt nhau, một lần nữa OOB nên được sử dụng là phương tiện nhanh chóng để ước tính lỗi nhưng không phải là thước đo đánh giá duy nhất.
Tạo cây quyết định từ phân loại đóng bao
Như đã thấy trong bài học Cây quyết định , có thể vẽ đồ thị cây quyết định mà mô hình đã tạo. Cũng có thể xem các cây quyết định riêng lẻ được đưa vào bộ phân loại tổng hợp. Điều này giúp chúng tôi hiểu rõ hơn về cách mô hình đóng bao đạt được dự đoán của nó.
Lưu ý: Tính năng này chỉ hoạt động với các tập dữ liệu nhỏ hơn, trong đó các cây tương đối nông và hẹp giúp dễ hình dung.
Chúng ta sẽ cần nhập plot_tree
từ sklearn.tree
. Các cây khác nhau có thể được vẽ biểu đồ bằng cách thay đổi công cụ ước tính mà bạn muốn hình dung.
Ví dụ
Tạo cây quyết định từ phân loại đóng bao
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import plot_tree
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)
clf = BaggingClassifier(n_estimators = 12, oob_score = True,random_state = 22)
clf.fit(X_train, y_train)
plt.figure(figsize=(30, 20))
plot_tree(clf.estimators_[0], feature_names = X.columns)
Kết quả
Chạy ví dụ »Ở đây chúng ta chỉ có thể thấy cây quyết định đầu tiên được sử dụng để bỏ phiếu cho dự đoán cuối cùng. Một lần nữa, bằng cách thay đổi chỉ mục của bộ phân loại, bạn có thể thấy từng cây đã được tổng hợp.