자기계발/Python

[빅데이터분석기사] 22 앙상블 부스팅

호등 2022. 6. 23. 21:21
반응형

앙상블 부스팅

부스팅(Boosting)은 여러 개의 약한 학습기(weak learner)를 순차적으로 학습시켜 예측하면서 잘 못 예측한 데이터에 가중치를 부여하여 오류를 개선해 나가며 학습하는 앙상블 모델이다. (배깅은 한 번에 여러 개의 데이터셋에서 학습한 결과를 종합하는 병렬식 앙상블, 부스팅은 직렬식이라고 볼 수 있다.)

 

scikit-learn

부스팅은 ensemble 안에 있다.

사이킷런에서는 AdaBoosting과 GradientBoosting을 지원하고 있다.

 

AdaBoosting

AdaBoosting은 AdaBoostingClassifier(분류)와 AdaBoostingRegressor(회귀) 알고리즘이 있다.

두 방식의 기본 옵션은 동일하며, base_estimator와 n_estimator가 핵심 하이퍼파라미터다.

(실습에선 base_estimator는 건드리지 않았다.)

 

GradientBoosting

GradientBoosting 역시 분류와 회귀의 기본 옵션이 동일하다.

다만 GradientBoosting의 알고리즘 방식은 학습률(learning_rate)을 설정하여 오차(loss)를 줄이는 방향으로 찾아나가는 방식을 취하기 때문에 옵션 설정이 다소 복잡하다.


Part1. 분류(Classification)

AdaBoosting 앙상블 모델 적용

#Part1. 분류(Classification)
#AdaBoosting 앙상블 모델 적용

from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(n_estimators=100, random_state = 0)
model.fit(X_scaled_train, y_train)

pred_train=model.predict(X_scaled_train)
model.score(X_scaled_train, y_train)

실습 예제와 같이 나도 데이터셋 분리, 정규화 작업은 생략하였다.

AdaBoostClassifier 라이브러리를 사용했고, base_estimator는 설정하지 않았다.

모델 수행횟수(n_estimators)는 100번으로 설정했더니 정확도가 100%가 나왔다. (과대적합 가능성 큼)

 

오차행렬과 분류예측 레포트

from sklearn.metrics import confusion_matrix
confusion_train = confusion_matrix(y_train, pred_train)
print("훈련데이터 오차행렬:\n", confusion_train)

from sklearn.metrics import classification_report
cfreport_train = classification_report(y_train, pred_train)
print("분류예측 레포트:\n", cfreport_train)

오차행렬은 모두 정분류로 나타났으며, 분류예측 레포트에선 95%의 정확도를 보였다. 

테스트데이터 오차행렬은 정상 5, 환자 3명이 오분류 되었으며, 훈련데이터와 비슷하게 95% 정확도를 보였다.

 

GradientBoosting 앙상블 모델 적용

#GradientBoosting 앙상블 모델 적용
from sklearn.ensemble import GradientBoostingClassifier
model = GradientBoostingClassifier(n_estimators = 100, learning_rate = 0.1, max_depth=1, random_state=0)
model.fit(X_scaled_train, y_train)

pred_train=model.predict(X_scaled_train)
model.score(X_scaled_train, y_train)

GradientBoosting에서도 base_estimator는 설정하지 않고 모델 수행횟수는 100번으로 설정했다.

학습률(learning_rate=0.1, max_depth=1)을 설정한 후 결과를 실행했더니 98% 정확도를 보였다.

 

오차행렬

from sklearn.metrics import confusion_matrix
confusion_train = confusion_matrix(y_train, pred_train)
print("훈련데이터 혼동행렬:\n", confusion_train)

pred_test = model.predict(X_scaled_test)
model.score(X_scaled_test, y_test)

혼동행렬을 확인해보니 교재와 다르게 오분류된 데이터 몇 개를 확인할 수 있었다.


Part2. 회귀(Regression)

AdaBoosting 앙상블 모델 적용

#Part2. 회귀(Regression)
#AdaBoosting 앙상블 모델 적용
from sklearn.ensemble import AdaBoostRegressor
model = AdaBoostRegressor(random_state=0, n_estimators=100)
model.fit(X_scaled_train, y_train)

pred_train = model.predict(X_scaled_train)
model.score(X_scaled_train, y_train)

pred_test = model.predict(X_scaled_test)
model.score(X_scaled_test, y_test)

AdaBoostingRegressor로 100회 모델 개선 과정을 거치는 실습을 해보았다.

훈련데이터 정확도 43.5%, 테스트 데이터 정확도 43.6% 정도 나타내었다.

 

RMSE 오차 확인

#RMSE (Root Mean Squared Error)
import numpy as np
from sklearn.metrics import mean_squared_error

MSE_train = mean_squared_error(y_train, pred_train)
MSE_test = mean_squared_error(y_test, pred_test)

print("훈련데이터 RMSE: ", np.sqrt(MSE_train))
print("테스트데이터 RMSE: ", np.sqrt(MSE_test))

 

GradientBoosting 앙상블 모델 적용

#GradientBoosting 앙상블 모델 적용
from sklearn.ensemble import GradientBoostingRegressor
model = GradientBoostingRegressor(random_state=0)
model.fit(X_scaled_train, y_train)

pred_train = model.predict(X_scaled_train)
model.score(X_scaled_train, y_train)

주택가격 회귀 예측 진행 결과 61.8%의 높은 정확도를 보였다.

테스트데이터 역시 59.7%로 다른 개별 알고리즘보다 좋은 편이다.

 

RMSE 오차 확인

#RMSE(Root Mean Squared Error)
import numpy as np
from sklearn.metrics import mean_squared_error

MSE_train = mean_squared_error(y_train,pred_train)
MSE_test = mean_squared_error(y_test, pred_test)
print(np.sqrt(MSE_train))
print(np.sqrt(MSE_test))

 

반응형