Decision Tree - Bagging

2021. 10. 19. 22:39머신러닝

반응형

Bagging은 Bootstrap방법을 활용하는 방법으로, Decision Tree 모델의 최적의 성능을 이끌어내는데 많은 기여를 하고 있는 개념입니다.

앞서 정리한 것 처럼 Decision Tree는 상당히 과적합 문제에 취약하게 됩니다.  Bagging을 활용하면 이와 같은 문제점을 다소 감소시킬 수 있습니다.

Bagging은 Bootstrap aggregation의 약자인데, 이름에서 보는 것과 같이 Bootstrpa을 통해 Sample들을 만들고 여러 모델들의 결과 값을 집계하는 것입니다. 이를 통해 결과값의 안정성 확보를 도모합니다.

예시적으로, n개의 독립된 Sample들 $Z_1$,...,$Z_n$이 있다고 했을 때 이 Sample들의 평균의 Varicance는 $\sigma^2/n$이 되면서 하나의 Sample만 가지고 측정했을 때보다 변동성이 줄어들게 됩니다. 이를 통해 과적합 문제(High-variance)를 감소시키게 됩니다.

즉, Bootstrap으로 만든 Sample $S_1$,...,$S_B$에 대해서 모델 $\widehat{f}(x)_1$, ...$\widehat{f}(x)_B$을 생성한다고 할때, Bagging을 통한 예측값은 아래와 같습니다.

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