본문 바로가기
네이버클라우드/AI

AI 7일차 (2023-05-16) 인공지능 기초 _머신러닝 - Bagging(배깅)

by prometedor 2023. 5. 16.

Bagging(배깅)

 

ㄴ Bootstrap Aggregation의 약자
ㄴ 배깅은 샘플을 여러 번 뽑아(Bootstrap) 각 모델을 학습시켜 결과물을 집계 (Aggregration) 하는 방법
ㄴ 데이터로부터 부트스트랩 한 데이터로 모델을 학습시키고 학습된모델의 결과를 집계하여 최종 결과값을 도출

 

from sklearn.ensemble import BaggingRegressor
from xgboost import XGBRegressor

model = BaggingRegressor(XGBRegressor(),
			n_estimators=100,
			n_jobs=-1,
			random_state=72
			)

 

 

ml16_bagging_iris.py

import numpy as np
from sklearn.model_selection import train_test_split, StratifiedKFold	# Stratified : 일반적으로 분류모델에서 사용(분류 문제에서는 클래스별로 데이터가 골고루 분포되지 않을 수 있음)
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.datasets import load_iris
from sklearn.preprocessing import MinMaxScaler
import time

# 1. 데이터
datasets = load_iris()
x = datasets.data
y = datasets.target

x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, shuffle=True, random_state=42
)


# Scaler
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)


# KFold
n_splits = 5
kfold = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)


# param
param = {
    'n_estimators' : [100],
    'random_state' : [42, 62, 72],
    'max_features' : [3, 4, 7]
}


# 2. 모델 (Bagging)
bagging = BaggingClassifier(DecisionTreeClassifier(),
                            n_estimators=100,	# 100개의 복제된 결정 트리 분류기가 생성되며, 각각의 분류기는 부트스트래핑된 샘플 데이터에 대해 독립적으로 학습
                            n_jobs=-1,	# 모든 CPU 코어를 사용하여 작업을 병렬화 --> 훈련 속도 향상
                            random_state=42)                        

model = GridSearchCV(bagging, param, cv=kfold, refit=True, n_jobs=-1)
# refit=True: 최적의 매개변수로 모델을 재학습 시킴


# 3. 훈련
start_time = time.time()
model.fit(x_train, y_train)
end_time = time.time() - start_time


# 4. 평가, 예측
result = model.score(x_test, y_test)

print('최적의 매개변수 : ', model.best_estimator_)
print('최적의 파라미터 : ', model.best_params_)
print('걸린 시간 : ', end_time, '초')
print('Bagging 결과 : ', result)


# 최적의 파라미터 찾기 전 배깅 --> model = BaggingClassifier(DecisionTreeClassifier() 
# 걸린 시간 :  1.3898603916168213 초
# Bagging 결과 :  1.0
 
# 최적의 파라미터 찾은 후 배깅
# 최적의 매개변수 :  BaggingClassifier(estimator=DecisionTreeClassifier(), max_features=4,
#                   n_estimators=100, n_jobs=-1, random_state=42)
# 최적의 파라미터 :  {'max_features': 4, 'n_estimators': 100, 'random_state': 42}
# 걸린 시간 :  2.2870166301727295 초
# Bagging 결과 :  1.0

 

ㄴ model.best_estimator_  :  최적의 매개변수
ㄴ model.best_params_  :  최적의 파라미터  --> 최적의 모델에 대한 최적의 하이퍼파라미터를 딕셔너리 형태로 반환
= > scikit-learn의 그리드 서치(GridSearchCV)나 랜덤 서치(RandomizedSearchCV) 등의 하이퍼파라미터 튜닝을 수행한 후, 최적의 모델과 그에 대한 최적의 하이퍼파라미터를 확인

 

ml16_bagging_cancer.py

import numpy as np
from sklearn.model_selection import train_test_split, StratifiedKFold
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import MinMaxScaler
import time

# 1. 데이터
datasets = load_breast_cancer()
x = datasets.data
y = datasets.target

x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, shuffle=True, random_state=42
)


# Scaler
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)


# KFold
n_splits = 5
kfold = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)


# param
param = {
    'n_estimators' : [100],
    'random_state' : [42, 62, 72],
    'max_features' : [3, 4, 7]
}


# 2. 모델 (Bagging)
bagging = BaggingClassifier(DecisionTreeClassifier(),
                            n_estimators=100,
                            n_jobs=-1,
                            random_state=42)

model = GridSearchCV(bagging, param, cv=kfold, refit=True, n_jobs=-1)
# refit=False 일 경우, 적용은 안 되고 최적의 파라미터만 찾아짐
# refit=True 일 경우, 적용하여 훈련 시킴


# 3. 훈련
start_time = time.time()
model.fit(x_train, y_train)
end_time = time.time() - start_time


# 4. 평가, 예측
result = model.score(x_test, y_test)

print('최적의 매개변수 : ', model.best_estimator_)
print('최적의 파라미터 : ', model.best_params_)
print('걸린 시간 : ', end_time, '초')
print('Bagging 결과 : ', result)

# 최적의 파라미터 찾기 전 배깅 --> model = BaggingClassifier(DecisionTreeClassifier() 
# 걸린 시간 :  1.883936882019043 초
# Bagging 결과 :  0.956140350877193

# 최적의 파라미터 찾은 후 배깅
# 최적의 매개변수 :  BaggingClassifier(estimator=DecisionTreeClassifier(), max_features=7,
#                   n_estimators=100, n_jobs=-1, random_state=42)
# 최적의 파라미터 :  {'max_features': 7, 'n_estimators': 100, 'random_state': 42}
# 걸린 시간 :  3.334315776824951 초
# Bagging 결과 :  0.9649122807017544

 

ml16_bagging_wine.py

import numpy as np
from sklearn.model_selection import train_test_split, StratifiedKFold
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.datasets import load_wine
from sklearn.preprocessing import MinMaxScaler
import time

# 1. 데이터
datasets = load_wine()
x = datasets.data
y = datasets.target

x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, shuffle=True, random_state=42
)


# Scaler
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)


# KFold
n_splits = 5
kfold = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=42)


# param
param = {
    'n_estimators' : [100],
    'random_state' : [42, 62, 72],
    'max_features' : [3, 4, 7]
}


# 2. 모델 (Bagging)
bagging = BaggingClassifier(DecisionTreeClassifier(),
                            n_estimators=100,
                            n_jobs=-1,
                            random_state=42)

model = GridSearchCV(bagging, param, cv=kfold, refit=True, n_jobs=-1)


# 3. 훈련
start_time = time.time()
model.fit(x_train, y_train)
end_time = time.time() - start_time


# 4. 평가, 예측
result = model.score(x_test, y_test)

print('최적의 매개변수 : ', model.best_estimator_)
print('최적의 파라미터 : ', model.best_params_)
print('걸린 시간 : ', end_time, '초')
print('Bagging 결과 : ', result)

# 최적의 파라미터 찾기 전 배깅 --> model = BaggingClassifier(DecisionTreeClassifier() 
# 걸린 시간 :  1.7651467323303223 초
# Bagging 결과 :  0.9722222222222222

# 최적의 파라미터 찾은 후 배깅
# 최적의 매개변수 :  BaggingClassifier(estimator=DecisionTreeClassifier(), max_features=3,
#                   n_estimators=100, n_jobs=-1, random_state=42)
# 최적의 파라미터 :  {'max_features': 3, 'n_estimators': 100, 'random_state': 42}
# 걸린 시간 :  2.6730213165283203 초
# Bagging 결과 :  1.0

 

ml16_bagging_california.py

import numpy as np
from sklearn.model_selection import train_test_split, KFold
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import BaggingRegressor
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import MinMaxScaler
import time

# 1. 데이터
datasets = fetch_california_housing()
x = datasets.data
y = datasets.target

x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, shuffle=True, random_state=42
)


# Scaler
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)


# KFold
n_splits = 5
kfold = KFold(n_splits=n_splits, shuffle=True, random_state=42)


# param
param = {
    'n_estimators' : [100],
    'random_state' : [42, 62, 72],
    'max_features' : [3, 4, 7]
}


# 2. 모델 (Bagging)
bagging = BaggingRegressor(DecisionTreeRegressor(),
                            n_estimators=100,
                            n_jobs=-1,
                            random_state=42)

model = GridSearchCV(bagging, param, cv=kfold, refit=True, n_jobs=-1)


# 3. 훈련
start_time = time.time()
model.fit(x_train, y_train)
end_time = time.time() - start_time


# 4. 평가, 예측
result = model.score(x_test, y_test)

print('최적의 매개변수 : ', model.best_estimator_)
print('최적의 파라미터 : ', model.best_params_)
print('걸린 시간 : ', end_time, '초')
print('Bagging 결과 : ', result)

# 최적의 파라미터 찾기 전 배깅 --> model = BaggingRegressor(DecisionTreeRegressor() 
# 걸린 시간 :  3.9007744789123535 초
# Bagging 결과 :  0.8042348744721923

# 최적의 파라미터 찾은 후 배깅
# 최적의 매개변수 :  BaggingRegressor(estimator=DecisionTreeRegressor(), max_features=7,
#                  n_estimators=100, n_jobs=-1, random_state=42)        
# 최적의 파라미터 :  {'max_features': 7, 'n_estimators': 100, 'random_state': 42}
# 걸린 시간 :  49.98332118988037 초
# Bagging 결과 :  0.822087951242456