데이터분석 공부/DSBA 4기
21/03/24 TIL (앙상블 학습, Voting, Bagging, Boosting, Random Forest, GBM, XGBoost, LightGBM)
이삼오
2024. 3. 22. 09:04
3. 앙상블 학습
- knn 모델은 실제로 잘 사용되지 않음
- 요즘 자주 쓰이는 모델 : 앙상블
- 여러 개의 분류기를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법
- 이미지, 영상, 음성, 자연어 등 비정형 데이터의 분류는 딥러닝 모델이 뛰어난 성적을 얻고있지만, 대부분의 정형 데이터 분류에는 앙상블 모델이 뛰어난 성능을 보임
- 대표적으로 RandomForest, GradientBoost(GBM) 등이 있음
- 사용하기 쉬울뿐 아니라 성능 역시 뛰어남
- 앙상블 유형
- Voting (잘 사용 안함)
- Bagging - Decision Tree, Random Forest -> 둘의 하이퍼 파라미터는 거의 같음
- Boosting - AdaBoost, Gradient Boost, XGBoost(eXtra Gradient Boost), LightGBM(Light Gradient Boost)
-> Gradient Boost가 너무 느려서 XGBoost, LightGBM 등장
- Voting vs Bagging
- 공통점 : 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식
- Voting : 같은 데이터셋을 기반으로 서로 다른 알고리즘 모델이 학습하고 결합
- Bagging: 다른 학습 데이터셋을 기반으로 같은 알고리즘 모델이 학습하고 결합. 데이터셋 간 중첩 허용
- Voting - Hard/Soft
- Hard Voting : 다수의 classifier 예측 결과값 간 다수결로 최종 class 결정
- Soft Voting : 예측 결과값 간 확률을 평균하여 최종 class 결정
Voting Classifier
- 여러 모델을 하나로 묶고 하나의 결과를 도출하는 역할
import pandas as pd
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
cancer = load_breast_cancer()
data_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
# 개별 모델 로지스틱 회귀와 knn을 보팅 방식으로 결합하고 비교
# max_iter는 Gradient Descent 방식을 최대 몇 번 반복해서 수행할 것인가
# 기울기가 평평한 최저값을 찾으면 더 이상 반복하지 않음
lr_clf = LogisticRegression(max_iter=3000)
knn_clf = KNeighborsClassifier(n_neighbors=9)
# 개별 모델을 소프트 보팅 기반 앙상블 모델로 구현한 분류기
vo_clf = VotingClassifier(estimators=[('LR', lr_clf), ('KNN', knn_clf)],
voting='soft')
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target,
test_size=0.2, random_state=156)
# VotingClassifier 학습 예측 평가
vo_clf.fit(X_train, y_train)
pred = vo_clf.predict(X_test)
print(f'Voting 분류기 정확도: {accuracy_score(y_test, pred):.4f}')
Voting 분류기 정확도: 0.9474
- Voting도 GridSearchCV 를 이용해 파라미터 조정 가능
- 개별 학습 모델과 보팅 분류기를 사용했을 때의 정확도가 다르다
- 보팅보다는 배깅, 부스팅이 강세
- 배깅, 부스팅은 만들어진 알고리즘이 대부분
4. Random Forest
- 배깅의 대표적인 알고리즘
- 사이킷런의 랜덤포레스트는 기본적으로 100개의 DecisionTree 모델을 사용(n_estimators=100)
- 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 학습하고 최종적으로 모든 모델이 보팅을 통해 예측 결정
- Voting default=soft
- 전체 데이터에서 샘플을 랜덤하게 뽑아서 사용
- 개별 트리가 학습하는 데이터는 전체 데이터셋에서 일부가 중첩되게 샘플링된 데이터
- 여러 개의 데이터셋을 중첩되게 분리 : Bootstrapping 분할 방식 -> Random Forest 모델이 수행함
- k-fold는 데이터셋의 분포(학습/검증 데이터셋의 분포)가 겹치지 않지만 배깅은 샘플 데이터셋이 중첩될 수 있다
from sklearn.ensemble import RandomForestClassifier
import warnings
warnings.filterwarnings('ignore')
cancer = load_breast_cancer()
data_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
X_train,X_test, y_train, y_test = train_test_split(cancer.data, cancer.target,
test_size=0.2, random_state=156)
rf_clf = RandomForestClassifier(random_state=0)
rf_clf.fit(X_train, y_train)
pred = rf_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)
print(f'랜덤 포레스트 정확도 : {accuracy:.4f}')
5. GBM(Gradient Boosting Machine)
- 부스팅 알고리즘은 여러 개의 약한 학습기를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식
- 속도가 엄청나게 느림
- 대충 여러 번 공부
- 부스팅의 대표적인 알고리즘 AdaBoosting, GBM
- 요즘 트렌드로는 AdaBoosting 거의 사용하지 않음
- AdaBoosting는 오류 데이터에 가중치를 부여하면서 부스팅을 수행하는 대표적인 알고리즘
from sklearn.ensemble import GradientBoostingClassifier
import time
data_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
X_train, X_test, y_train, t_test = train_test_split(cancer.data, cancer.target,
test_size=0.2, random_state=156)
# GBM 수행 시간 측정을 위한 시작 시간 설정
start_time = time.time()
gb_clf = GradientBoostingClassifier(random_state=0)
gb_clf.fit(X_train, y_train)
gb_pred = gb_clf.predict(X_test)
gb_accuracy = accuracy_score(y_test, gb_pred)
GBM 파라미터
- loss : 경사하강법에서 사용할 비용함수 지정. default = deviance
- subsample : 학습에 사용하는 데이터의 샘플링 비율 0~1. default=1 -> 전체 학습 데이터 기반
- n_estimators : 기본값=100. 약한 학습기의 수. 그라디언트 부스팅은 과적합에 매우 강력하므로 일반적으로 숫자가 많을수록 성능이 향상되나 학습 시간이 길어짐
- lerning_rate : 약한 학습기가 순차적으로 오류값을 보정해나가는데 적용하는 계수. 너무 큰값을 지정하면 수행은 빠르지만 최소오류값을 못 찾고 지나쳐서 예측성능이 저하됨. 너무 작은값을 지정하면 수행시간이 오래걸릴 수 있고 반복이 완료되어도 최소오류값을 찾지 못할 수 있음
6. XGBoost(eXtra Gradient Boosting)
- 트리 기반의 앙상블 학습에서 가장 각광받는 알고리즘
- 뛰어난 예측 성능
- GBM 대비 빠른 수행 시간 : 병렬 수행 및 다양한 기능. GBM에 비해 빠르다는 것이지 다른 머신러닝 알고리즘에 비해 빠른 것은 아님
- 과적합 규제 : 자체 과적합 규제 기능. 완전 방지는 불가능
- Tree pruning
- 결손값 자체 처리
- 트리 기반이므로 피처 중요도 확인 가능
- train, eval logloss가 점점 줄어들다가 어느 순간부터 더 이상 줄어들지 않음을 알 수 있음
- 반복수(num_boost_round. 최대 부스팅 반복 횟수)가 많다고 해서 반드시 결과가 향상되는 것은 아니다
7. LightGBM
- XGBoost도 속도가 줄었지만 여전히 오래 걸림
- 이를 해결하기 위해 등장
- 단점 : 적은 데이터셋에서 과적합이 발생하기 쉬움
- 리프 중심의 트리 분할 방식을 사용