Python – تجمیع بوتاسترپ (Bootstrap Aggregation)
Bagging یک روش تجمیع (Ensembling) است که به منظور حل مشکل بیشبرازش (Overfitting) در مسائل طبقهبندی یا رگرسیون استفاده میشود. این روش به بهبود دقت و عملکرد الگوریتمهای یادگیری ماشین کمک میکند. Bagging با استفاده از زیرمجموعههای تصادفی از دادههای اصلی (با جایگزینی)، مدلهای مختلفی را آموزش داده و سپس پیشبینیها را از طریق رایگیری اکثریت برای طبقهبندی یا میانگینگیری برای رگرسیون تجمیع میکند.
ارزیابی یک مدل پایه
برای مشاهده اینکه Bagging چگونه میتواند عملکرد مدل را بهبود دهد، ابتدا باید عملکرد مدل پایه را بر روی دادهها ارزیابی کنیم. اگر با درختان تصمیم آشنا نیستید، به درس مربوط به درختان تصمیم مراجعه کنید، زیرا Bagging ادامه مفهوم درختان تصمیم است.
ما به شناسایی انواع مختلف وینهای موجود در دیتاست وین اسکیکیت-لرن خواهیم پرداخت.
وارد کردن ماژولهای لازم:
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
بارگذاری دادهها:
دادهها را بارگذاری کرده و در متغیرهای X
(ویژگیهای ورودی) و y
(هدف) ذخیره میکنیم. پارامتر as_frame
به True
تنظیم شده است تا نام ویژگیها هنگام بارگذاری دادهها از بین نرود. (نسخههای قدیمیتر sklearn
باید آرگومان as_frame
را رد کنند زیرا پشتیبانی نمیشود.)
data = datasets.load_wine(as_frame=True)
X = data.data
y = data.target
تقسیم دادهها به مجموعههای آموزشی و آزمایشی:
برای ارزیابی صحیح مدل بر روی دادههای ندیده، باید X
و y
را به مجموعههای آموزشی و آزمایشی تقسیم کنیم.
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))
نتیجه:
مدل پایه با دقت 82.2% بر روی مجموعه تست عمل کرده است.
ایجاد یک مدل Bagging
برای Bagging باید پارامتر n_estimators
را تنظیم کنیم، که تعداد مدلهای پایهای است که مدل ما قرار است تجمیع کند.
برای این دیتاست نمونه، تعداد تخمینزنندهها نسبتاً پایین است و معمولاً دامنههای بزرگتری برای این پارامتر بررسی میشود. تنظیمات بهینه معمولاً با جستجوی شبکه انجام میشود، اما در حال حاضر از مجموعهای از مقادیر برای تعداد تخمینزنندهها استفاده خواهیم کرد.
وارد کردن مدل لازم:
from sklearn.ensemble import BaggingClassifier
تعریف دامنه مقادیر تخمینزنندهها:
estimator_range = [2, 4, 6, 8, 10, 12, 14, 16]
ایجاد و ارزیابی مدلهای Bagging:
برای مشاهده عملکرد Bagging Classifier با مقادیر مختلف n_estimators
، باید یک حلقه for
ایجاد کرده و نتایج هر تجمیع را ذخیره کنیم.
models = []
scores = []
for n_estimators in estimator_range:
# ایجاد مدل Bagging
clf = BaggingClassifier(n_estimators=n_estimators, random_state=22)
# آموزش مدل
clf.fit(X_train, y_train)
# افزودن مدل و امتیاز به لیستهای مربوطه
models.append(clf)
scores.append(accuracy_score(y_true=y_test, y_pred=clf.predict(X_test)))
نمایش بهبود عملکرد مدل:
import matplotlib.pyplot as plt
# ایجاد نمودار امتیازها در مقابل تعداد تخمینزنندهها
plt.figure(figsize=(9, 6))
plt.plot(estimator_range, scores)
# تنظیم برچسبها و اندازه قلم (برای مشاهده بهتر)
plt.xlabel("n_estimators", fontsize=18)
plt.ylabel("score", fontsize=18)
plt.tick_params(labelsize=16)
# نمایش نمودار
plt.show()
نتیجه:
با بررسی مقادیر مختلف برای تعداد تخمینزنندهها، میتوانیم افزایش عملکرد مدل را از 82.2% به 95.5% مشاهده کنیم. پس از 14 تخمینزننده، دقت شروع به کاهش میکند. به همین دلیل، بهترین شیوه استفاده از اعتبارسنجی متقاطع برای اطمینان از نتایج پایدار است.
ارزیابی دیگر
از آنجا که بوت استرپینگ زیرمجموعههای تصادفی از مشاهدات را برای ایجاد طبقهبندها انتخاب میکند، مشاهداتی وجود دارند که در فرآیند انتخاب جا میمانند. این مشاهدات “خارج از کیسه” (out-of-bag) میتوانند برای ارزیابی مدل مشابه به یک مجموعه تست استفاده شوند. توجه داشته باشید که تخمین خارج از کیسه میتواند در مسائل طبقهبندی دوتایی خطا را بیشازحد تخمین بزند و باید تنها به عنوان مکملی برای معیارهای دیگر استفاده شود.
ما در تمرین قبلی مشاهده کردیم که 12 تخمینزننده بالاترین دقت را به دست آورد، بنابراین از آن برای ایجاد مدل خود استفاده خواهیم کرد و پارامتر oob_score
را به True
تنظیم خواهیم کرد تا مدل را با نمره خارج از کیسه ارزیابی کنیم.
ایجاد مدل با معیار خارج از کیسه:
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_)
تولید درختان تصمیم از مدل Bagging Classifier:
همانطور که در درس درخت تصمیم دیده شد، میتوان درخت تصمیمی که مدل ایجاد کرده است را رسم کرد. همچنین میتوان درختان تصمیم فردی که به طبقهبند تجمعی وارد شدهاند را مشاهده کرد تا درک بهتری از نحوه پیشبینی مدل Bagging به دست آوریم.
توجه: این فقط با دادههای کوچکتر که درختان نسبتاً سطحی و باریک هستند و آسان برای مشاهده هستند کار میکند.
وارد کردن تابع plot_tree
از sklearn.tree
:
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)
نتیجه:
در اینجا فقط اولین درخت تصمیمی که برای رأیگیری در پیشبینی نهایی استفاده شده است را میبینیم. با تغییر شاخص طبقهبند میتوانید هر یک از درختان را که به صورت تجمعی استفاده شدهاند، مشاهده کنید.
برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید. صفحه ورود و ثبت نام