배깅 (Bagging)은 부트스트랩 (Bootstrap)과 어그리게이팅 (Aggregating)의 의미를 결합한 단어로서 부트스트랩 샘플링 기법과 각 모형이 예측한 값을 결합하는 어그리게이팅 기능이 통합된 앙상블 기법을 의미한다. 부트스트랩이란 데이터의 중복을 허용하는 무작위 샘플링 방식을 통해 여러 개의 하위 학습 데이터 세트를 생성하고, 이에 대해 동일한 모형을 반복 적용하는 분할 방식을 의미한다.
[그림 1] 부트스트랩 분할 방식
위 그림에서 원래의 학습 데이터 세트에서 데이터가 중복된 상태로 학습 데이터 세트 1~3이 생성된 것을 볼 수 있는데, 이와 같이 여러 개의 학습용 데이터 세트를 통해 학습이 이루어지면 모형의 분산 (Variance)을 낮추어 결과적으로 최종 모형이 과잉적합 될 가능성을 낮출 수 있다.
배깅 앙상블은 이러한 부트스트랩과 어그리게이팅을 기능을 바탕으로 분류 예측의 경우 개별 단위 모형들이 가장 많이 분류한 최빈값을 최종 분류 예측 결과로 산출하고, 수치 예측의 경우 보팅 앙상블과 마찬가지로 각 모형이 산출한 출력치의 평균값을 활용하게 된다.
랜덤 포레스트
랜덤 포레스트 (Random Forest)는 배깅 앙상블 모형의 대표적인 모형으로서 부트스트랩 방식으로 생성한 다수의 학습용 데이터 세트마다 의사결정 나무 모형을 생성하여 최종 예측값을 도출하는 모형이다.
[그림 2] 랜덤 포레스트 모형의 개념적 표현
단일 의사결정나무 모형이 하나의 나무라면 랜덤 포레스트는 다수의 작은 나무들로 이루어진 숲 (Forest)을 의미하는데, 여기에서 랜덤 포레스트 모형은 여러 개의 의사결정나무 간의 상관도를 줄이기 위해 각 의사결정나무 모형을 생성할 때 모든 변수를 고려하지 않고, 변수의 일부분만 랜덤하게 추출하여 개별 나무를 생성한다. 이러한 과정을 랜덤 서브스페이스 (Random Subspace) 또는 특성 배깅 (Feature Bagging)이라고 한다.
[표 1] 랜덤 서브스페이스
입력 변수 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 |
선택 변수 | x2 | x5 | x7 |
위 표는 랜덤 서브스페이스의 개념을 도식화한 것인데, 원래 총 9개의 가능한 입력변수가 존재한다고 했을 때 개별 의사결정나무 모형은 랜덤 서브스페이스 과정을 통해 이 중 일부의 독립변수만을 가지고 학습하게 된다. 이렇게 랜덤 포레스트의 각 의사결정나무는 모든 변수를 고려하지 않지만, 여러 나무의 예측 결과를 종합하기 때문에 상대적으로 우수한 예측 성능을 도출하게 된다. 랜덤 서브스페이스 과정에서 선택되는 변수의 개수에 대한 명확한 가이드라인은 없지만, 총 p개의 변수가 있다고 할 때, 일반적으로 분류 문제의 경우 p개만큼, 수치 예측의 경우는 p3개만큼 랜덤 서브스페이스로 사용하는 것을 권장하고 있다.
랜덤 포레스트 내의 개별 의사결정나무 모형에서도 사전 가지치기를 할 수 있으나, 일반적으로 가지치기를 하지 않아도 우수한 성능을 보이기 때문에 기본 옵션만을 적용하여 구축하는 경우가 많다. 랜덤 포레스트 내의 개별 의사결정나무 모형은 모든 투입변수를 동시에 고려하는 것이 아닌 랜덤 서브스페이스를 통해 특정 변수만을 다루는 일종의 특화된 모형이므로 원천적으로 과잉적합 될 소지가 적기 때문이다.
실습은 랜덤 포레스트 모형으로 수치 예측을 해보겠다.
1) 변수 선택 및 전처리
#1. 변수 선택(독립변수/종속변수)
X = df[['a', 'b', 'c', 'd', 'e']]
Y = df['S']
#2. 데이터 분할(학습용/평가용 데이터 세트)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
2) 모형 학습 및 예측
#1. 모듈 및 함수 불러오기
from sklearn.ensemble import RandomForestRegressor
#2. 모형 생성
model = RandomForestRegressor(random_state=0, n_estimators= 100, max_depth = 4)
#3. 모형 학습 및 예측
model.fit(X_train, Y_train)
Y_pred = model.predict(X_test)
print('평가용 데이터 세트에 대한 예측값\n', Y_pred)
RandomForestRegressor( ) 함수의 자세한 설명은 아래 URL에서 확인할 수 있다.
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
3) 모형 평가
• 결정계수 평가
print(‘학습용 데이터 세트 결정계수: {:.3f}’.format(model.score(X_train, Y_train)))
print(‘평가용 데이터 세트 결정계수: {:.3f}’.format(model.score(X_test, Y_test)))
• RMSE 평가
rmse= sqrt(mean_squared_error(Y_test, Y_pred))
print(‘RMSE:{:.3f}’.format(rmse))
This post was written based on what I read and studied the book below.
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747
댓글