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)

نتیجه:

در اینجا فقط اولین درخت تصمیمی که برای رأی‌گیری در پیش‌بینی نهایی استفاده شده است را می‌بینیم. با تغییر شاخص طبقه‌بند می‌توانید هر یک از درختان را که به صورت تجمعی استفاده شده‌اند، مشاهده کنید.

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
Python - محدود کردن داده (MongoDB Limit)

Python – محدود کردن داده (MongoDB Limit)

Python MongoDB محدود کردن نتایج برای محدود کردن نتایج در MongoDB، از متد limit() استفاده می‌کنیم. متد limit() یک...

بیشتر بخوانید
Python - بروزرسانی (MongoDB Update)

Python – بروزرسانی (MongoDB Update)

به‌روزرسانی یک رکورد برای به‌روزرسانی یک رکورد یا سند در MongoDB، از متد update_one() استفاده می‌کنیم. پارامتر اول متد...

بیشتر بخوانید
Python - حذف کالکشن (MongoDB Drop Collection)

Python – حذف کالکشن (MongoDB Drop Collection)

حذف کالکشن شما می‌توانید یک جدول یا کالکشن در MongoDB را با استفاده از متد drop() حذف کنید. مثالحذف...

بیشتر بخوانید

نظرات

سوالات و نظراتتون رو با ما به اشتراک بذارید

برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید.