2021. 10. 19. 22:39ㆍ머신러닝
Bagging은 Bootstrap방법을 활용하는 방법으로, Decision Tree 모델의 최적의 성능을 이끌어내는데 많은 기여를 하고 있는 개념입니다.
앞서 정리한 것 처럼 Decision Tree는 상당히 과적합 문제에 취약하게 됩니다. Bagging을 활용하면 이와 같은 문제점을 다소 감소시킬 수 있습니다.
Bagging은 Bootstrap aggregation의 약자인데, 이름에서 보는 것과 같이 Bootstrpa을 통해 Sample들을 만들고 여러 모델들의 결과 값을 집계하는 것입니다. 이를 통해 결과값의 안정성 확보를 도모합니다.
예시적으로, n개의 독립된 Sample들
즉, Bootstrap으로 만든 Sample

Python을 활용하여 Bagging을 구현해보겠습니다. 데이터를 Sampling해서 적용하는 방법과 간단히 sklearn에서 제공해주는 method를 이용하는 방법에 대해서 정리해 보겠습니다.
from sklearn.datasets import make_regression
from sklearn.utils import resample
from sklearn.ensemble import BaggingRegressor
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
import pandas as pd
import numpy as np
X, y = make_regression(n_samples=10000, n_features=10, bias=0, noise=0, random_state=0)
X = pd.DataFrame(X)
y = pd.DataFrame(y)
train_idx = np.random.choice(X.index, size = round(len(X)*0.7), replace= False).tolist()
test_idx = list(set(X.index)-set(train_idx))
X_train, y_train = X.iloc[train_idx], y.iloc[train_idx]
X_test, y_test = X.iloc[test_idx], y.iloc[test_idx]
먼저, make_regression을 통해서 가상 데이터를 생성하고 train과 test 데이터넷으로 구분을 합니다.
## Fitting
idx = [i for i in X_train.index]
model_list = {}
num_bootstrap = 10
for i in range(num_bootstrap):
bst_index = resample(idx, replace= True, n_samples = len(X_train))
X_bst = X_train.loc[bst_index]
y_bst = y_train.loc[bst_index]
tree = DecisionTreeRegressor().fit(X_bst, y_bst)
model_list[i] = tree
## Prediction
prediction_list = []
for i in range(num_bootstrap):
pred = model_list[i].predict(X_test)
prediction_list.append(pred)
bst_result = np.array(prediction_list)
fin_result = np.mean(bst_result , axis= 0)
## Result
np.sum((fin_result - y_test.values[:,0])**2)/len(X_test) ## 2015.3973761904153
mean_squared_error(fin_result, y_test) ## 2015.3973761904153
mean_squared_error(model_list[0].predict(X_test), y_test) ## 5306.94585117431
먼저 Dict를 이용하여 Bootstrap을 한만큼의 모델을 저장하고, Predcition 단계에서 각 모델의 결과값들을 평균을 해줍니다. 결과에서 확인할 수 있는 것처럼 Bootstrap을 활용하는 것이 하나의 모델만 활용하는 것보다 MSE가 더 낮았습니다.
마지막으로 sklearn method를 활용해 보겠습니다.
## https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingRegressor.html
tree_ = DecisionTreeRegressor()
bagging_clf = BaggingRegressor(base_estimator=tree_, n_estimators=10, random_state=7)
bagging_clf.fit(X_train, y_train)
mean_squared_error(bagging_clf.predict(X_test), y_test) ##2021.2196715762755
간단하게 Bagging을 수행할 수 있습니다.
'머신러닝' 카테고리의 다른 글
Decision Tree - Boosting (1) | 2022.01.02 |
---|---|
Decision Tree Model (0) | 2021.10.15 |
Tree-Based Model (0) | 2021.10.06 |
Generalized Additive Models(GAM) (0) | 2021.08.15 |
모델 평가 및 선정 > Bootstrap Method (0) | 2021.06.28 |