jjinyeok 성장일지

머신 러닝 #5 - Ensemble 기법 2022/08/22~2022/08/29 본문

[KT AIVLE School]

머신 러닝 #5 - Ensemble 기법 2022/08/22~2022/08/29

jjinyeok 2022. 9. 12. 00:32

  지금까지 Linear Regression, Logistic Regression, KNN, Decision Tree, SVM 등 하나의 모델을 사용해 모델링을 진행했다. 이제부터 Ensemble이라는 기법을 사용해 여러 모델을 종합 판단하는 방법을 정리하겠다. 앙상블은 크게 Bagging, Boosting, Stacking으로 나뉘어지지만 강의에서는 Bagging, Boosting만을 다루었기에 두개만 정리하고 Stacking은 나중에 혼자 공부해서 정리해보겠다.

 

1. Bagging

  Bagging의 과정은 다음과 같다. 먼저 Train Data를 기준으로 복원추출을 통해 Bootstrap Sample들을 여러개 만든다. 즉 하나의 Train Data를 통해 Train Set이 여러 개인 양 만드는 것이다. 다음으로 각각의 Sample Data를 기반으로 모델을 생성한다. 이전 Sample Data가 100개였다면 모델 또한 100개가 생길 것이다. 마지막으로 모델을 통해 얻은 결과를 Aggregating 즉 집계한다. Bootstrap과 Aggregating의 B와 Agg, ing를 따 이런 기법을 Bagging이라 한다.

Bagging = Bootstrap Sample + Aggregating

 

2. Random Forest

  Random Forest는 대표적인 Bagging 기법 모델이다. Random Forest는 두 Random을 사용하는 Decision Tree모델의 집합 (Forest) 모델이다. 첫번째 Random은 row이다. row을 랜덤하게 데이터를 샘플링해 Sample Data를 만든다. 두번째 Random은 feature이다. 모델을 만들 때 각 Decision Tree에서 가지를 나눌때 기준이 되는 feature를 랜덤하게 선정한다. 이처럼 두 Random을 이용해 서로 다른 Decision Tree 모델을 Sample Data 개수만큼 만들고 각 모델의 값을 집계해 평균을 구해서 전체 Random Forest의 값으로 사용한다.

 

3. Random Forest : 구현 & Hyperparameter

  sklearn.ensemble의 RandomForestClassifer와 RandomForestRegressor 모델을 사용해 분류와 회귀 문제를 풀 수 있다. 이전 단일 모델과 구현 방식은 동일하며 다음과 같다.

'Data: 핸드폰 가입 이탈 여부 데이터'
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

model = RandomForestClassifier() # Random Forest 모델 선언
model.fit(x_train, y_train) # 학습
pred = model.predict(x_val) # 예측
print(accuracy_score(y_val, pred)) # 평가
# 0.7033333333333334

    Random Forest도 hyperparameter가 존재하고 그 중 2개가 중요하다. 첫번째는 n_estimators이다. n_estimators는 트리의 개수를 조절하는 hyperparameter로 default 값은 100이며 강사님께서는 보통 100에서 200 사이를 추천한다고 하셨다. 이때 트리의 개수가 많다고 모델 복잡도가 늘어나지는 않고 오히려 overfitting을 방지한다. 두번째는 max_features이다. 각 Decision Tree에서 가지를 나눌때 기준이 되는 feature의 개수를 조절한다. max_features의 default는 전체 feature를 제곱근한 값이다. 강사님께서는 Random Forest만큼은 hyperparameter 튜닝 없이 default 값을 사용해도 좋다고 하셨다.

 

4. Boosting

  Boosting이란 여러 트리 모델을 결합해서 오차를 줄이는 모델을 구성하는 방식이다. 즉 처음에 train_x와 train_y를 통해 모델을 만들고 모델의 결과와 train_y를 비교해 오차를 찾는다. 이후 train_x와 오차를 통해 모델을 만들고 다시 오차를 구하고 train_x와 비교하기를 반복한다. 결국 모델 전체의 예측값은 지난 모델들의 결과의 합이 된다.

 

5. Xgboost : 구현 & Hyperparameter

  Xgboost는 대표적인 Boosting 기법 모델이다. 기존 사용하던 sklearn이 아닌 xgboost의 XGBClassifier() 모델을 사용한다는 점에서 차이가 있지만 이전 단일 모델과 구현 방식은 동일하며 다음과 같다.

'Data: 핸드폰 가입 이탈 여부 데이터'
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score

model = XGBClassifier() # Random Forest 모델 선언
model.fit(x_train, y_train) # 학습
pred = model.predict(x_val) # 예측
print(accuracy_score(y_val, pred)) # 평가
# 0.6853333333333333

  Xgboost도 hyperparameter가 존재하고 그 중 2개가 중요하다. 첫번째는 n_estimators이다. 앞선 Random Forest와 같이 트리 개수를 의미하지만 Xgboost에서의 n_estimators는 값이 커질수록 모델이 복잡해질 수 있다는 것에 유의하자. 두번째는 learning_rate이다. 0과 1 사이의 값으로 트리를 결합할 때 반영하는 비율을 의미한다. 강사님께서는 0.2 이하로 잡으면 보통 최적값이 나온다고 추천하셨다. Xgboost는 지난 정리의 Random Search와 Grid Search를 통해 최적의 hyperparameter 값을 찾아 사용해야 한다.

Comments