본문 바로가기
[파이썬]/머신러닝

[머신러닝] 앙상블 모델과 학습방법(배깅, 부스팅)+랜덤 포레스트 모델 구축 및 성능 평가

by sung min_Kim 2024. 1. 8.

 이번 글에서는 "앙상블(Ensemble) 모델에 대한 개념부터 이를 적용한 랜덤 포레스트 모델 구축 및 성능 평가"에 대한 내용들을 살펴보려 한다. 차례와 사용 툴 및 라이브러리는 아래와 같다.


 [차례]
 첫 번째, 앙상블(Ensemble) 모델이란?
 두 번째, 앙상블 모델을 사용하는 이유
 세 번째, 앙상블 모델의 학습 방법 - 배깅(Bagging)
 네 번째, 앙상블 모델의 학습 방법 - 부스팅(Boosting)
 다섯 번째, 랜덤 포레스트(Randomforest) - 모델 구축 및 성능 평가


 [사용 툴]

- Jupyter notebook(웹 기반 대화형 코딩 환경


 [사용 라이브러리 및 모듈]

  • 이터 분석 라이브러리: pandas
  • 연산 라이브러리: numpy
  • 머신러닝 라이브러리 및 모델: scikit-learn
    sklearn.preprocessing.StandardScaler: 데이터 정규화(표준화)
    - sklearn.model_selection.train_test_split: 데이터 분리(훈련:검증:테스트)
    sklearn.ensembleRandomForestClassifier: 랜덤 포레스트 모델 생성
    - sklearn.metrics.accuracy_score, precision_score, recall_score, f1_score: 분류 모델 성능 평가지표
    - sklearn.metrics.confusion_matrix: 오차행렬 생성

 


앙상블(Ensemble) 모델이란?

 

 

 앙상블 모델은 여러 개의 학습 알고리즘을 결합하여 최적의 예측 성능을 달성하는 방식을 말한다. 이는 다수의 독립적인 모델이 각각의 예측을 수행하고, 이들의 결과를 통합해  최종 예측을 도출하는 원리에 기반한다. 이 과정에서 모델은 결정 트리를 비롯해 다양한 유형될 수 있다.

 랜덤 포레스트(rf)는 대표적인 앙상블 방식의 모델로, 여러 개의 결정 트리를 결합하여 사용하는 방법을 채택한다. 각 트리(Tree)는 독립적으로 학습하고 예측을 수행한 후, 이들의 예측값들을 평균 내어 최종 예측값을 생성한다. 이렇게 결정 트리를 앙상블(결합)하여 사용함으로써, 단일 결정 트리가 가진 과적합 문제를 완화하고 예측 성능을 향상시킬 수 있다.

 이처럼, 앙상블 모델은 여러 모델을 결합함으로써 각 모델의 장점을 취하고 단점을 보완한다. 이를 통해 전체적으로 더 안정적이며 강력한 예측 성능을 달성하는 것이 앙상블 모델의 주요 목표이다.

 앙상블 모델을 이해하는데 도움이 되는 트리 구조와 용어에 대해서는 [머신러닝] 트리(Tree) 구조의 이해를 참고하시길 바란다.

 


앙상블 모델을 사용하는 이유

 

 

 앙상블 모델은 성능 향상, 과적합 방지, 일반화 능력 향상 등의 이유로 널리 사용된다.

  • 성능 향상
    - 단일 모델을 사용하는 것보다 여러 모델을 조합하면, 데이터의 다양한 특성을 각기 다른 방식으로 학습함으로써 더 나은 성능을 얻을 수 있다.

  • 과적합 방지
    - 각 모델은 랜덤 하게 나누어진 훈련 데이터셋을 기반으로 학습하기 때문에 단일 모델이 훈련 데이터를 과도하게 학습하는 과적합(overfitting)을 방지할 수 있다. 여러 모델을 사용하면 각 모델의 과적합 경향을 상쇄시킬 수 있다.

  • 일반화 능력 향상
    - 앙상블 모델은 여러 모델의 예측을 결합함으로써 데이터의 다양한 특성을 더 잘 반영할 수 있다. 이를 통해 모델의 일반화 능력이 향상될 수 있다.

 


앙상블 모델의 학습 방법

배깅(Bagging)

 


 앙상블 모델은 여러 개의 트리를 사용하며, 훈련 데이터를 여러 모델(트리)에 적용하는 방식에 따라 '배깅(Bagging)'과 '부스팅(Boosting)', '스태킹(Stacking)' 등으로 구분된다. 본 글에서는 이 중, 배깅과 부스팅 방식을 중점으로 살펴보고자 한다.

배깅(Bagging)

 

배깅 방식(출처: https://towardsdatascience.com/ensemble-learning-bagging-boosting-3098079e5422)


 배깅(Bagging) 방식은 여러 개의 독립적인 모델을 훈련시키는 방법이다. 각 모델은 원본 훈련 데이터셋에서 무작위로 선택된 데이터셋을 바탕으로 훈련(학습)한다. 이렇게 각 모델이 서로 다른 데이터셋으로 학습하게 되면, 모델 간의 상관관계가 줄어들고, 이를 통해 과적합을 방지할 수 있다.

 예를 들어, 동물을 분류하는 문제를 풀고 있다고 가정해 보자. 이 동물은 강아지일 수도, 고양이 일 수도, 또는 다른 종류의 동물일 수도 있다. 그리하여 동물의 특징(ex. 크기, 꼬리 길이, 다리 길이 등)을 기반으로 어떤 동물인지를 예측하고자 한다.

 배깅 방식을 사용하면, 여러 개의 독립적인 모델을 만들 수 있다. 각 모델은 동일한 특징을 바탕으로 학습하지만, 각각 다른 부분집합의 데이터를 사용한다. 즉, 첫 번째 모델은 강아지와 고양이에 관한 데이터를, 두 번째 모델은 강아지와 기타 동물에 대한 데이터를, 세 번째 모델은 고양이와 기타 동물에 대한 데이터를 사용하여 학습하게 된다.

 모든 모델의 학습이 완료되면, 새로운 동물에 대한 예측을 수행할 때는 모든 모델의 예측 결과를 종합하여 최종 예측값을 도출한다. 즉, 가장 많이 예측된 동물을 최종적으로 선택한다. 예를 들어, 첫 번째와 두 번째 모델이 '강아지'라고 예측하고, 세 번째 모델만 '고양이'라고 예측했다면, 최종 예측 결과는 '강아지'가 된다.

 이처럼 배깅은 여러 모델의 예측을 종합함으로써 모델의 예측 성능을 향상시키고, 과적합을 방지한다. 최종적으로, 회귀 문제의 경우 모든 모델의 예측값을 평균내거나, 분류 문제의 경우 가장 많은 투표를 받은 클래스(종속변수)를 최종 예측 결과로 선택함으로써, 개별 모델의 예측 성능을 뛰어넘는 안정적이고 강력한 예측 성능을 달성할 수 있다.

 배깅을 활용한 앙상블 모델의 예로는 랜덤 포레스트와 엑스트라트리 등이 있다

 


앙상블 모델의 학습 방법

부스팅(Boosting)

 

 

부스팅(Boosting)

 

부스팅 방식(출처: https://towardsdatascience.com/ensemble-learning-bagging-boosting-3098079e5422)


 부스팅(Boosting)은 모델 간에 연관성이 있는 앙상블 방법이다. 이 방식에서 각 모델은 이전 모델의 오차를 보완하는 역할을 한다. 즉, 모델들은 순차적으로 학습되며, 각 단계에서는 이전 모델이 잘못 예측한 데이터에 더 많은 가중치를 부여하여, 다음 모델이 해당 부분을 더 정확하게 예측하도록 한다.

 동물 분류에 대한 문제를 다시 예로 들어보도록 하자. 첫 번째 모델이 강아지와 고양이를 잘 구분하지 못했다고 가정해 보자. 예를 들어, 꼬리가 짧은 강아지를 고양이로 잘못 분류했다면, 부스팅 방식에서는 이 잘못 분류된 강아지 데이터에 더 큰 가중치를 부여한다. 그다음, 이 가중치를 반영하여 두 번째 모델을 학습시키며, 꼬리가 짧은 강아지를 고양이로 잘못 분류하는 문제를 해결하도록 한다.

 이런 방식으로, 그다음 모델은 이전 모델이 실수한 부분(오차)을 보완하면서 학습을 진행한다. 이 과정을 반복하면서, 각 모델의 예측값을 가중치를 고려하여 결합해 최종 예측값을 얻게 된다.

 즉, 부스팅 방식은 모델 간의 오차를 보완하면서 성능을 향상시키는 방법이다. 이처럼 부스팅은 각 모델이 서로 다른 부분을 학습하도록 하여, 여러 모델을 조합함으로써 전체적인 성능을 향상시키는 효과가 있다. 

 부스팅을 활용한 앙상블 모델의 예로는 그래디언트 부스팅, 히스토그램 그래디언트 부스팅, 엑스지부스팅 등이 있다.

 


랜덤 포레스트(Randomforest)

모델 구축 및 성능 평가

 

1. 데이터 수집


 와인 데이터셋을 활용하여 'alcohol', 'sugar', 'pH'의 수치를 기반으로 와인의 종류를 예측하는 랜덤 포레스트 모델을 구축하려 한다.

 와인의 종류를 나타내는 'class(종속변수)'가 0과 1로 이루어져 있는 것으로 보아, 이진 분류 문제를 나타내는 범주형 데이터임을 알 수 있다. '0'을 레드와인으로, '1'을 화이트와인으로 가정하겠다.

import pandas as pd
import numpy as np

wine = pd.read_csv("./data/08_wine.csv")

wine, print(np.unique(wine["class"]))

 

2. 데이터 전처리
 2.1 독립변수, 종속변수 생성


 와인의 종류를 나타내는 종속변수 'class'를 제외한, 나머지 특성(열)을 독립변수로 설정한다.

# 독립변수 정의 : alcohol, sugar, pH
input = wine.iloc[:, :-1]

# 종속변수 정의 : class
target = wine["class"]

input.shape, target.shape

 

2.2 데이터 스케일링(정규화 또는 표준화)

 
 독립변수의 범위(스케일)를 균등하게 하기 위한 데이터 스케일링을 수행한다.

from sklearn.preprocessing import StandardScaler

# 정규화 클래스 호출
ss = StandardScaler()

# 정규화 학습
ss.fit(input)

# 정규화 진행
input_scaled = ss.transform(input)

 

2.3 훈련·검증·테스트 데이터 생성


 모델 학습(훈련)을 위한 훈련 데이터셋과, 훈련 성능을 검증하기 위한 검증 데이터셋, 그리고 최종 성능을 평가 또는 검증하기 위한 테스트 데이터셋을 생성한다.

from sklearn.model_selection import train_test_split

X_train, X_temp, y_train, y_temp = train_test_split(input_scaled, target,
                                                    test_size=0.4,
                                                    random_state=42)

X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp,
                                                test_size=0.5,
                                                random_state=42)

print(X_train.shape, y_train.shape)
print(X_val.shape, y_val.shape)
print(X_test.shape, y_test.shape)

 

3. 모델 구축
3.1 랜덤 포레스트 모델 생성 및 훈련


 RandomForestClassifier 클래스를 호출하여 랜덤 포레스트 모델(rf)을 생성한다. 이때, 두 가지 파라미터를 사용하였다.

 'n_jobs'는 훈련 과정에서 사용할 CPU 코어의 수를 지정하는 파라미터이고, '-1'은 컴퓨터의 CPU를 전부 사용하겠다는 의미이다.

 'random_state=42'는 랜덤 포레스트 모델에서 무작위 값을 생성할 때 기준이 되는 시작 숫자를 정의하는 파라미터이다. 같은 시드값을 사용하면, 같은 패턴이 생성되므로 실험의 결과를 재현할 수 있다. 

 이 외, 'n_estimators(사용할 결정 트리의 수)', 'max_depth(각 트리의 최대 깊이)', 'min_samples_split(노드를 분할하기 위한 최소한의 샘플 수)', 'min_samples_leaf(결정 노드가 되기 위한 최소한의 샘플 수)' 등의 하이퍼파라미터를 클래스의 인자로 전달하여 트리 기반 모델의 성능을 높이기 위한 튜닝을 진행할 수도 있다. 관련 내용은 [머신러닝] GridSearchCV를 활용한 하이퍼파라미터 튜닝 이해하기를 참고하시길 바란다.

from sklearn.ensemble import RandomForestClassifier

# 랜덤 포레스트 모델 생성
rf = RandomForestClassifier(n_jobs=-1, random_state=42)

# 모델 훈련
rf.fit(train_std_scaler, train_target)

랜덤 포레스트 모델

 

4. 모델 훈련 성능 검증


 score 함수를 사용하여, 학습한 모델의 훈련 성능을 검증하였다. 

train_score = rf.score(train_mm_scaler, train_target)
test_score  = rf.score(test_mm_scaler, test_target)

train_score, test_score


 훈련 데이터와 검증 데이터의 정확도 차이가 0.1 이상 나타난 것으로 보아, 해당 랜덤 포레스트 모델(rf)은 훈련 데이터에 과도하게 학습되어 과적합(overfitting)이 발생한 것으로 판단된다. 이를 해결하기 위해서는 데이터의 양 확대, 하이퍼파라미터 튜닝, 그리고 복잡도 증가 등의 방법이 고려된다.

5. 모델 예측


 모델의 최종 성능을 평가하기 위해, 'class' 종속변수(와인의 종류)에 대한 예측값을 생성한다. 이 예측값은 predict 함수를 사용해 생성하며, 이를 실제값과 비교함으로써 모델의 최종 성능을 판단할 수 있다. 

y_pred = rf.predict(X_test)
y_pred

 

6. 최종 성능 평가


 분류 모델의 최종 성능을 측정하기 위해 다양한 평가 지표들을 활용한다.

  • 정확도(acuuracy): 모델이 올바르게 예측한 샘플의 비율을 나타낸다. 전체 샘플 중에서 올바르게 예측된 샘플의 수를 계산하며, 값이 높을수록 모델의 성능이 좋다고 판단된다.

  • 정밀도(precision): 모델이 '1(True)'로 예측한 데이터 중, 실제로 '1(True)'인 데이터의 비율을 나타낸다. 값이 높을수록 False Positive(실제는 'False'인데 True라고 잘못 예측한 경우)가 적다는 것을 의미한다.

  • 재현율(recall): 실제 '1(True)'인 데이터 중, 모델이 '1(True)'라고 정확하게 예측한 데이터의 비율을 나타낸다. 값이 높을수록 False Negative(실제는 'True'인데 False로 잘못 예측한 경우)가 적다는 것을 의미한다.

  • F1-Socre: 정밀도와 재현율의 조화 평균을 나타낸다. 즉, 정밀도와 재현율이 모두 높을 때 F1 스코어가 높아진다.

  • 오차행렬(Confusion Matrix): 모델의 성능을 분류문제에 대해 시각적으로 표현한 표이다. 이 행렬은 True Positive, False Positive, True Negative, False Negative의 4가지 경우를 보여준다. 이를 통해 모델이 각 클래스를 얼마나 잘 분류하는지 확인할 수 있다.

오차 행렬

 

from sklearn.metrics import accuracy_score   
from sklearn.metrics import precision_score  
from sklearn.metrics import recall_score     
from sklearn.metrics import f1_score         
from sklearn.metrics import confusion_matrix 

# 정확도
acc = accuracy_score(y_test, y_pred)

# 정밀도
pre = precision_score(y_test, y_pred)

# 재현율
rec = recall_score(y_test, y_pred)

# F1-score
f1 = f1_score(y_test, y_pred)

# 오차행렬
cm = confusion_matrix(y_test, y_pred)

acc, pre, rec, f1, cm


 출력 결과를 보면, 랜덤 포레스트 모델의 정확도는 0.87로 높게 나타났다. 더불어 정밀도, 재현율, F1-score는 모두 0.91 이상으로 매우 높게 측정되었다.

 오차 행렬을 보면, '1'을 '1'로, '0'을 '0'으로 예측하는 데 있어 큰 오류가 없는 것으로 나타났으며, 부정에 대한 오류는 상대적으로 미미해 보인다.

 이러한 결과들은 랜덤 포레스트 모델이 실제 값을 예측하는 데 있어 매우 훌륭한 성능을 보여주고 있음을 나타낸다. 따라서, 이 랜덤 포레스트 모델은 실제 문제 해결에 충분히 활용 가능한 모델로 판단된다.