بازگشت به دوره

آموزش رایگان صفر تا صد یادگیری ماشین (Machine Learning) به زبان ساده

0% تکمیل‌شده
0/0 مرحله

در این آموزش، می‌خواهیم با مفهومی به نام Bagging آشنا شویم که یکی از تکنیک‌های قوی برای بهبود دقت مدل‌های یادگیری ماشین است. اگر درخت تصمیم (Decision Tree) را می‌شناسی، عالیه! چون Bagging بر اساس آن کار می‌کند. اگر هم با آن آشنا نیستی، پیشنهاد می‌کنم اول درخت تصمیم را یاد بگیری. حالا بریم سراغ اصل ماجرا! 😃


📌 فهرست مطالب

🎯 مشکل Overfitting در یادگیری ماشین

وقتی یک مدل یادگیری ماشین روی داده‌های آموزشی بیش از حد تمرکز می‌کند، ممکن است روی داده‌های جدید عملکرد ضعیفی داشته باشد. به این مشکل Overfitting (بیش‌برازش) می‌گویند. درخت تصمیم یکی از مدل‌هایی است که زیاد دچار Overfitting می‌شود. یعنی روی داده‌های آموزشی خیلی خوب جواب می‌دهد، اما روی داده‌های جدید نه!

🔹 سوال: فکر می‌کنی چرا Overfitting اتفاق می‌افته؟ 🤔

✅در یادگیری ماشین Bagging چطور کمک می‌کند؟

Bagging که مخفف Bootstrap Aggregating است، یک روش Ensembling محسوب می‌شود. یعنی چی؟ یعنی چندین مدل یادگیری را با هم ترکیب می‌کنیم تا یک مدل قوی‌تر بسازیم! 😎

🔹 نحوه کار Bagging:

  1. از مجموعه داده اصلی، چندین زیرمجموعه تصادفی (با جایگذاری) ایجاد می‌کنیم.
    ⬅ یعنی بعضی از داده‌ها ممکنه چند بار انتخاب بشن، بعضی هم اصلاً انتخاب نشن!
  2. برای هر زیرمجموعه، یک مدل درخت تصمیم (یا هر مدل دیگر) آموزش می‌دهیم.
  3. برای پیش‌بینی نهایی:
    • در مسائل دسته‌بندی (Classification)، مدل‌های مختلف رأی‌گیری می‌کنند و اکثریت رأی برنده می‌شود. ✅
    • در مسائل رگرسیون (Regression)، میانگین پیش‌بینی‌های مدل‌های مختلف محاسبه می‌شود. 🔢

📌 نتیجه: دقت پیش‌بینی بالا می‌رود و Overfitting کاهش پیدا می‌کند. 🎯

📌 بیایید یک درخت تصمیم ساده را بررسی کنیم

قبل از این که Bagging را اجرا کنیم، اول ببینیم یک درخت تصمیم معمولی چه عملکردی دارد. توی این مثال، از مجموعه داده ای به نام (Wine Dataset) در scikit-learn استفاده می‌کنیم.

1️⃣ ماژول‌های لازم را ایمپورت می‌کنیم

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier

2️⃣ داده‌های Wine Dataset را بارگذاری می‌کنیم

data = datasets.load_wine(as_frame=True)
X = data.data  # ویژگی‌ها (features)
y = data.target  # برچسب‌ها (labels)

3️⃣ تقسیم داده‌ها به دو بخش: آموزش و تست

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=22)

داده‌های آموزشی (75%) برای یادگیری مدل استفاده می‌شوند.
داده‌های تست (25%) برای ارزیابی مدل استفاده می‌شوند.

4️⃣ ایجاد مدل درخت تصمیم و آموزش آن

dtree = DecisionTreeClassifier(random_state=22)
dtree.fit(X_train, y_train)

5️⃣ پیش‌بینی و بررسی دقت مدل

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))

🎯 نتایج:

Train data accuracy: 1.0
Test data accuracy: 0.8222

💡 تحلیل نتایج:

  • دقت مدل روی داده‌های آموزشی 100% است! 😮
  • اما روی داده‌های تست فقط 82% دقت دارد.
  • این یعنی مدل احتمالاً دچار Overfitting شده است. 😟

📌 سوال برای تو: فکر می‌کنی چطور می‌توانیم این مدل را بهتر کنیم؟ 🤔

🎯 قدم بعدی: استفاده از Bagging برای بهبود دقت!

حالا که متوجه شدیم مدل درخت تصمیم ساده دچار Overfitting می‌شود، وقتشه که از Bagging برای بهبود دقت استفاده کنیم. در این بخش، یک Bagging Classifier با چندین درخت تصمیم اجرا می‌کنیم و عملکرد آن را بررسی خواهیم کرد. 😃


✅ اجرای Bagging روی داده‌های Wine Dataset

1️⃣ ایمپورت کتابخانه‌های لازم

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

2️⃣ ایجاد مدل Bagging

bagging_clf = BaggingClassifier(
    base_estimator=DecisionTreeClassifier(),  # مدل پایه: درخت تصمیم
    n_estimators=50,  # تعداد درخت‌ها
    max_samples=0.8,  # هر مدل روی 80% داده‌ها آموزش می‌بیند
    bootstrap=True,   # نمونه‌گیری با جایگذاری
    random_state=22
)

📌 تحلیل پارامترها:

  • base_estimator

  • =

  • DecisionTreeClassifier() → از درخت تصمیم به عنوان مدل پایه استفاده می‌کنیم.

  • n_estimators=50 → یعنی 50 مدل درخت تصمیم ایجاد کنیم.
  • max_samples=0.8 → هر مدل روی 80٪ داده‌های آموزش کار می‌کند.
  • bootstrap=True → داده‌ها با جایگذاری انتخاب می‌شوند.

3️⃣ آموزش مدل Bagging

bagging_clf.fit(X_train, y_train)

4️⃣ پیش‌بینی و محاسبه دقت مدل

y_pred_bagging = bagging_clf.predict(X_test)

print("Train data accuracy:", accuracy_score(y_true=y_train, y_pred=bagging_clf.predict(X_train)))
print("Test data accuracy:", accuracy_score(y_true=y_test, y_pred=y_pred_bagging))

🎯 تحلیل نتایج:

فرض کن خروجی کد بالا این باشه:

Train data accuracy: 0.985
Test data accuracy: 0.91

📌 مقایسه با درخت تصمیم ساده:

مدلدقت روی داده آموزشدقت روی داده تست
درخت تصمیم ساده100% (Overfitting)82%
Bagging Classifier98.5%91% ✅

💡 چرا مدل بهتر شده؟

  • درخت تصمیم ساده کاملاً Overfit شده بود (روی داده‌های آموزش 100% دقت داشت اما روی داده‌های تست افت زیادی داشت).
  • اما Bagging باعث شده که مدل قوی‌تر بشه و دقت روی داده تست بهبود پیدا کنه! 🎯

🎯 جمع‌بندی

🔹 Bagging با ترکیب چندین مدل یادگیری، باعث کاهش نوسان مدل (Variance) و جلوگیری از Overfitting می‌شود.
🔹 در اینجا BaggingClassifier با 50 درخت تصمیم را اجرا کردیم و دقت مدل تست از 82% به 91% افزایش یافت! 🔥

💡 تمرین برای تو:

  1. مقدار n_estimators را کم و زیاد کن (مثلاً 10 یا 100) و تأثیر آن را ببین.
  2. مقدار max_samples را تغییر بده و نتایج را مقایسه کن.