بگینگ (Bootstrap Aggregation)
بگینگ یک روش «تجمیع (Ensemble)» است. هدف، کم کردن بیش برازش و بالا بردن دقت است. ایده ساده است: چند مدل روی نمونه های تصادفیِ داده آموزش می دهیم، سپس پیش بینی ها را تجمیع می کنیم.
گام 1: ارزیابی درخت تصمیم پایه
اول ببینیم «مدل پایه (Base Classifier)» چقدر خوب است. داده wine اسکیکیت را می گیریم و یک درخت تصمیم می سازیم.
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))
گام 2: ساخت BaggingClassifier و تنظیم n_estimators
حالا چند مدل می سازیم. هر مدل روی نمونه برداریِ با جایگزینی آموزش می بیند. سپس دقت را برای تعداد مدل های مختلف می بینیم.
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:
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))
)
plt.plot(estimator_range, scores)
plt.xlabel("n_estimators")
plt.ylabel("score")
plt.show()
گام 3: ارزیابی Out-of-Bag (OOB)
در بگینگ، بعضی نمونه ها در آموزش جا می مانند. به آن ها «خارج ازکیسه (OOB)» می گوییم. می توانیم برای تخمین سریع دقت از آن ها استفاده کنیم.
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_)
گام 4: دیدن درخت های تجمیع شده
می توانیم یکی از درخت های داخل بگینگ را رسم کنیم. این کار فهم تصمیم ها را راحت تر می کند.
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
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
)
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)
گام های عملی سریع
- یک مدل پایه آموزش بده و دقتش را بسنج.
- BaggingClassifier را با مقادیر مختلف n_estimators تست کن.
- بهترین n_estimators را از روی نمودار انتخاب کن.
- در صورت نیاز، oob_score را بررسی کن.
- برای درک بهتر، یکی از درخت ها را رسم کن.
جمع بندی سریع
- بگینگ، نوسان مدل را کم می کند.
- رأی گیری برای طبقه بندی استفاده می شود.
- میانگین برای رگرسیون استفاده می شود.
- OOB تخمین سریع دقت می دهد.
- n_estimators را تجربه محور انتخاب کن.
نکته: برای تنظیم پارامترها از جست وجوی شبکه ای کمک بگیر. برای ارزیابی پایدارتر هم اعتبارسنجی متقابل را ببین.