PYTHON
20221123 = 강의자료정리 (Boosting)
K.Y.PARK
2022. 11. 23. 16:51
개념정리
Boosting
부스팅 기법은 여러 얕은 트리를 연결하며 편향과 분산을 줄여 트리를 생성하는 기법.
이전 트리에 틀렸던 부분에 가중치를 주며 지속적으로 학습을 반복함.
GBM (Gradient Boosting Machine)
→ 회귀 또는 분류 분석을 수행할 수 있는 예측모형
→ 앙상블 방법론 중 부스팅 계열에 속하는 알고리즘
→ GBM은 계산량이 상당히 많이 필요한 알고리즘이기에, 하드웨어를 효율적으로 구현하는 것이 필요
Gradient Boosting Tree의 특징
1. 무작위성이 없다
2. 매개변수를 잘 조정해야 하고 훈련시간이 길다
3. 데이터의 스케일에 구애받지 않는다
4. 고차원의 희소한 데이터에 잘 작동하지 않는다.
Gradient Boosting Tree의 주요 파라미터
→ loss = 최적화시킬 손실 함수
→ learning_rate = 각 트리의 기여도를 제한하는 파라미터
→ n_estimators = 부스팅 단계를 지정하는 파라미터
→ subsample = 개별 기본 학습자를 맞추는데 사용할 샘플의 비율
XGBoost
→ 정규화 그래디언트 부스팅 프레임워크를 제공하는 오픈소스 소프트웨어 라이브러리
→ XGBoost는 GBT에서 병렬 학습을 지원하여 학습 속도가 빨라진 모델
→ 기본 GBT에 비해 더 효율적이고, 다양한 종류의 데이터에 대응할 수 있다.
XGBoost의 장점
→ GBM 대비 빠른 수행시간 (병렬처리)
→ 과적합 규제
→ Early Stopping 조기종료 기능
XGBoost의 단점
→ 학습시간이 느림
→ Hyper parameter 수가 많아 튜닝을 하게되면 시간이 오래걸림
→ 모델의 Overfitting
XGBoost 주요 매개변수
→ learning_rate (기본값 : 0.3) = rate가 높을수록 과적합되기 쉬움
→ n_estimators (기본값 : 100) = 생성할 weaker learner 수
learning_rate가 낮을 때, n_estimators를 높여야 과적합이 방지됨
→ max_depth (기본값 : 6) = 트리의 maximum depth
→ min_child_weight (기본값 : 1) = 관측치에 대한 가중치 합의 최소를 의미
→ gamma (기본값 : 0) = 리프노드의 추가분할을 결정할 최소손실 감소값
→ subsample (기본값 : 1) = weak learner가 학습에 사용하는 데이터 샘플링 비율
→ colsample_bytree (기본값 : 1) = 각 tree별 사용된 feature의 퍼센테이지
XGBoost 일반 파라미터
→ booster (기본값 : gbtree) = 어떤 부스터 구조를 쓸지 결정
→ n_jobs = XGBoost를 실행하는 데 사용되는 병렬 스레드 수
XGBoost 과적합 방지를 위해 조정해야하는 변수
→ n_estimators 높이기
→ learning_rate 낮추기
→ max_depth 낮추기
→ min_child_weight 높이기
→ gamma 높이기
→ subsample, colsample_bytree 낮추기
lightgbm
→ Light Gradient Boosting Machine의 약자, Microsoft에서 개발한 머신러닝을 위한 오픈소스
분산 그래디언트 부스팅 프레임워크.
→ 결정트리 알고리즘을 기반으로 하고, 순위지정, 분류 및 기타 머신러닝 작업에 사용
→ 개발 초점은 성능과 확장성이다.
→ 균형을 맞추지 않고 최대손실 값을 가지는 리프 노드를 지속적으로 분할하여 트리가 깊어지고
비대칭적인 트리 구조 생성하여 예측 오류 손실을 최소화함
CatBoost
→ Yandex에서 개발한 오픈소스 소프트웨어 라이브러리
→ 기존 알고리즘과 비교하여 순열 기반 대안을 사용하여 범주형 기능을 해결하려고 시도하는
그래디언트 부스팅 프레임워크를 제공
CatBoost의 장점
→ 범주형 기능에 대한 기본처리
→ 빠른 GPU 훈련
→ 모델 및 기능 분석을 위한 시각화 및 도구
→ 과적합을 극복하기 위해 순서가 있는 부스팅 사용
CatBoost의 단점
→ CatBoost는 희소행렬을 지원하지 않음
→ 수치형 타입이 많을 경우 LightGBM보다 훈련하는데 상대적으로 시간이 더 소요됨
GBM 계열의 트리 분할 방식
→ 일반적인 GBM 계열의 트리 분할 방식은 균형 트리 분할방식을 이용
장점 : 최대한 균형잡힌 트리를 생성하며, 트리의 깊이를 최소화할 수 있음
단점 : 과적합 문제에 더 강한 구조를 갖게 되지만 균형을 맞추기 위한 시간이 필요하다
============================================================================================
실습
OneHotEncoder 사용하기
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(handle_unknown="ignore")
train_ohe = ohe.fit_transform(train.drop(columns="y"))
test_ohe = ohe.transform(test)
# 위 코드를 사용하여 OneHotEncoder를 할 수 있으며,
# fit_transform을 이용하여 train을, transform을 이용하여 test를 각각 나눌 수 있음
train_test_split 사용하여 X, y를 나누기
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.1, random_state=42)
# train_test_split를 이용하여 X, y 의 valid를 나눠줄 수 있고, test_size으로
# train과 test의 비율을 조정할 수 있음
XGBoost 사용해보기
import xgboost as xgb
xgb.XGBRegressor(random_state=42, n_jobs=-1)
# 위 코드로 import 할 수 있으며, XGBRegressor로 불러올 수 있음
fit 시키기
model.fit(X_train, y_train)
# X_train, y_train을 각 모델에 맞게 fit(학습) 시켜줌
feature_importances_ 확인하기
model.feature_importances_
# 각 모델에 맞게 fit한 데이터를 각 피쳐의 중요도를 확인할 수 있음
Lightgbm 사용해보기
import lightgbm
# 위 코드로 lightgbm을 실행시킬 수 있음
CatBoost 사용해보기
import catboost
# 위 코드로 catboost 라이브러리를 불러온다
# catboost에는 다양한 변수가 있으므로 꼭 살펴보기
# https://catboost.ai/en/docs/references/training-parameters/common#grow_policy
출처 : 멋쟁이사자처럼 AI 7기 강의자료