일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 이기적
- 이것이 취업을 위한 코딩테스트다 with 파이썬
- 데이터베이스
- 오라클
- 기초다지기
- r
- 인공지능기초다지기
- 정보처리기사
- 빅데이터분석기사
- 데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- 빅분기
- boostcourse
- 프로그래머스
- Ai
- Oracle
- 빅데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- python
- 네이버부스트캠프
- 부스트코스
- PY4E
- AI 플랫폼을 활용한 데이터 분석
- 코딩테스트
- 코딩테스트 python
- Machine Learning
- DB
- 파이썬
- 난생처음 R코딩&데이터 분석 저서
- SQL
- boostcoures
- [멀티잇]데이터 시각화&분석 취업캠프(Python)
- Today
- Total
매일공부
[Machine Learning] Boost(AdaBoost, GBM, XGBoost, LightGBM, Catboost, Stacking) 본문
[Machine Learning] Boost(AdaBoost, GBM, XGBoost, LightGBM, Catboost, Stacking)
aram 2022. 11. 11. 00:00
앙상블 모델중 Boosting ?
- 약분류기를 순차 학습/예측하면서, 잘못된 데이터에 대해 가중치를 부여하면서 학습을 진행하는 성능 좋은 강분류기
- 오분류된 데이터에 초점을 맞추어 더 많은 가중치를 주는 방식
- 복원 추출 시 가중치 분포 고려
- 장점: 과적합에 강함
- 단점: Noise가 많은 데이터에는 별로 좋은 결과를 얻지 못할 수 있음
Adaptive Boost; AdaBoost
- 학습 Round마다 학습 데이터에서 오차가 크거나 오분류된 데이터의 가중치를 크게 하며, 오차가 작거나 정분류된 데이터의 가중치를 낮게 해서, 가중치에 비례하여 새로운 학습 데이터를 복원 추출하여 새로운 학습 데이터를 만들고 모형을 적합
- 분류문제(Classification), 회귀 문제(Regression)에 모두 적용 가능
- AdaBoostClassifier - 예측할 때 각 학습기에 부여된 가중치를 더하여 가장 높은 점수의 클래스가 예측 결과가 됩니다.
- AdaBoostRegressor - 개별 학습기의 결과를 정렬하여 예측기 가중치의 누적값이 중간 지점에 있는 결과를 사용
- 하이퍼파라미터
= learning_rate (가중치 정도)
= n_estimators (몇개의 분류기를 학습할 것 인지)
= max_depth (최적의 분할을 위해 고려할 최대 feature 개수(AdaBoostClassifier에만 해당))
= loss (가중치를 업데이트할 때 사용하는 손실 함수를 지정 (AdaBoostRegressor에만 해당))
#AdaBoost Classifier 하이퍼파라미터
- n_estimators: int, default=50
- learning_rate: float, default=1.0
예시코드]
from sklearn.ensemble import AdaBoostClassifier, AdaBoostRegressor
hyperparameters = {
'n_estimators' : [10, 50, 100, 500],
'learning_rate' : [0.001, 0.01, 0.1, 1.0]
}
Gradient Boost Machine(GBM)
- 학습 Round마다 학습 데이터에서 오차가 크거나 오분류된 데이터에 경사하강법을 사용하여 잔차를 계속 줄여 오차(손실함수)가 최소가 되도록 학습
- 분류 수행 모델
- 장점
: 예측 성능 높음
: 원하는 Loss function을 사용가능 - 단점
: Greedy Algorithm(탐욕 알고리즘; 현재만 봄)으로 과적합이 빠르게 됨
: 시간이 오래 걸림(병렬 처리가 지원되지 않음) - 하이퍼파라미터
= learning_rate : 학습을 진행할 때마다 적용하는 학습률(0~1)
= n_estimators : 생성할 트리의 갯수를 지정 ( Default = 100)
= max_depth : 트리의 최대 깊이 ( default = 3)
= min_samples_split : 노드를 분할하기 위한 최소한의 샘플 데이터수( Default = 2 )
= min_samples_leaf : 리프노드가 되기 위해 필요한 최소한의 샘플 데이터수 ( default = 1 )
= max_features : 최적의 분할을 위해 고려할 최대 feature 개수
= max_leaf_nodes : 리프노드의 최대 개수
= subsample : 개별 트리가 학습에 사용하는 데이터 샘플링 비율(0~1) ( default=1 전체 데이터 학습)
= loss : 경사하강법에서 사용할 cost function 지정
#‘deviance’ : 확률 값이 나오는 로지스틱 회귀모형의 손실함수
# ‘exponential’ : Adaboost 모형과 동일한 exponential error function
# GradientBoostingClassifier 하이퍼파라미터
- loss: {‘deviance’, ‘exponential’}, default=’deviance’
- learning_rate: float, default=0.1
- n_estimators: int, default=100
- subsample: float, default=1.0
- max_depth: int, default=3
예시코드]
from sklearn.ensemble import GradientBoostingClassifier
hyperparameters = {
'loss' : ['deviance', 'exponential'],
'learning_rate' : [0.01, 0.1, 0.2, 0.3],
'n_estimators' : [50, 100, 200],
'subsample' : [0.1, 0.2, 0.5, 1.0],
'max_depth' : [2, 3, 4, 5]
}
estimator = GradientBoostingClassifier(random_state=1)
best_model_gbc = get_best_model(estimator, hyperparameters)
XGBoost (Extreme Gradient Boosting)
- base learner - 의사결정나무 (의사결정나무의 깊이는 보통 6을 사용)
- Gradient Tree Boosting 알고리즘에 과적합 방지를 위한 기법을 추가하여 개선
- Regularization term을 추가시킴으로써 복잡한 모델에 패널티를 부여해서, 모델이 과적합되는 것을 방지
- 경사하강법을 이용하여 잔차를 줄여 이전 모형의 약점을 보완하는 방식
- 트리 분할 방식 = level-wise : 옆으로 확장하는 방식(수평 확장)
- 미분가능한 손실함수 L, 개별 모형의 최대 개수 M, 학습률 l, 감마 γ, 람다 λ 교차 검증을 통해 설정
- 분류의 회귀 영역에서 뛰어난 예측 성능을 발휘
- 일반매개변수
: 부스터(트리 또는 선형 모델)을 수행하는 데 사용하는 부스터 관련
= booster (gbtree : 트리 기반 모델 / gblinear : 선형 모델)
= verbosity (출력 메시지를 나타내고 싶지 않을 경우 1로 설정)
= mthread (CPU이 실행 스레드 개수를 조정 [default = 전체 다 사용] ) - 부스터 매개변수
: 트리 최적화, 부스팅, regularization 등과 관련 파라미터 등을 설정
= n_estimators [default = 100]
= early_stopping_rounds (조기 중단 횟수)
= learning_rate [default = 0.1]
= eta (learning rate [0, 1], 값이 작을 수록 이전 단계의 결과물 적게 반영)
= max_depth [default = 6]
= subsample [default = 1] (=sub_sample : 파이썬 래퍼에서 적용) 각 트리마다 데이터 샘플링 비율
= gamma [default = 0] (트리에서 추가적으로 가지를 나눌지를 결정할 최소 손실 감소 값)
= colsample_bytree, lambda, alpha, scale_pos_weight, min_child_weight - 학습 작업 매개변수
: 학습 수행 시의 객체 함수, 평가를 위한 지표 등을 설정하는 파라미터
= objective [default = reg:linear]
(최솟값을 가져야할 손실 함수를 정의
binary:logistic : 이진 분류
multi:softmax : 다중 클래스 분류
multi:softprob : softmax와 같지만 각 클래스에 대한 예상 확률 반환)
= eval_metric [목적 함수에 따라 디폴트 값이 다름(회귀-rmse / 분류-error)] (조기 중단을 위한 평가 지표)
#XGBClassifier 하이퍼파라미터
- eta [default=0.3, alias: learning_rate]
- gamma [default=0, alias: min_split_loss]
- max_depth [default=6]
- lambda [default=1, alias: reg_lambda]
- alpha [default=0, alias: reg_alpha]
예시코드]
from xgboost import XGBClassifier
hyperparameters = {
'learning_rate' : [0.3, 0.4, 0.5],
'gamma' : [0, 0.4, 0.8],
'max_depth' : [2, 3, 4],
'reg_lambda' : [0, 0.1, 1],
'reg_alpha' : [0.1, 1]
}
fit_params = {
'verbose' : False,
'early_stopping_rounds' : 40,
'eval_metric' : 'logloss',
'eval_set' : [(val_X, val_y)]
}
LightGBM
- 연속적인 특징(속성) 값을 이산 빈으로 버킷화하는 히스토그램 기반 알고리즘 사용
- 많은 데이터 양에 사용하는 Tree기반 알고리즘을 수직적(leaf-wise)으로 확장을 하는 방식의 학습하는 머신러닝 모델
- leaf-wise : 최대 델타 손실이 있는 leaf 분할, 밑으로의 확장하는 방식
>> 비대칭적 규칙 트리 생성 - 범주형 특성변수의 자동 변환과 최적 분할
- 히스토그램 기반 알고리즘 사용 장점
: 각 분할에 대한 이득 계산 비용 절감
: 추가 속도 향상을 위해 히스토그램 뺄셈 사용
: 메모리 사용량 감소
: 병렬 학습을 위한 통신 비용 절감 - 적은(10,000건 이하)의 데이터 셋에 적용할 경우 과적합 발생 쉬움
- 회귀, 목적 함수: L2 손실
- 이진 분류 목적 함수 : logloss
- multi classification
- cross-entropy 목적 함수 : logloss,
- lambdarank 목적 함수 : NDCG
#LGBMClassifier 하이퍼파라미터
- boosting_type: (str, optional (default='gbdt'))
- num_leaves: (int, optional (default=31))
- learning_rate: (float, optional (default=0.1))
- n_estimators: (int, optional (default=100))
- reg_alpha: (float, optional (default=0.))
- reg_lambda: (float, optional (default=0.))
예시코드]
from lightgbm import LGBMClassifier
hyperparameters = {
'boosting_type' : ['gbdt', 'dart', 'goss'],
'num_leaves' : [4, 8, 16, 32],
'learning_rate' : [0.01, 0.1, 1],
'n_estimators' : [25, 50, 100],
'reg_alpha' : [0, 0.1, 1],
'reg_lambda' : [0, 0.1, 1],
}
Catboost
- 속도 개선 로직과 정규화 방법을 보유하고 있는 Boosting
- 주어진 전체 데이터를 임의적으로 N개의 Fold로 나누어서 각 Fold에 속한 데이터셋들에 Ordered Boosting을 적용하여 부스팅 계열 알고리즘의 단점인 과적합 문제를 예방 알고리즘
예) x5에 대한 잔차를 계산하기 위해 x1, x2, x3, x4 데이터를 활용해 학습을 시켜 모델을 만들고, 학습한 모델을 가지고 x6에 대해 class label을 예측
예) x6에 대한 잔차를 계산하기 위해 x1, x2, x3, x4, x5 데이터를 활용해 학습을 시켜 모델을 만들고 x7에 대한 class label을 예측 - Response Encoding(=Mean Encoding = Target Encoding) 방법을 사용하여 범주형 변수를 수치형 변수로의 학습과정중에 변환하는 머신러닝 모델
- 일부만 가지고 잔차 계산을 한 뒤, 이걸로 모델을 만들고, 그 뒤에 데이터의 잔차는 이 모델로 예측한 값을 사용
- Category 즉 범주형 변수가 많은 데이터를 학습할 때 성능이 좋은 것으로 알려져 있다.
- 시계열 데이터를 효율적으로 처리하는 것으로 알려져있다.
GBM 계열 vs CatBoost
GBM 계열은 범주형 변수들이 포함된 데이터셋을 수치형 변수들로 변환 전처리 후 학습 수행
CatBoost 는 모델을 훈련(학습)시킬 때 범주형 변수의 개선된 전처리를 동시 수행
GBM 계열은 다음 스텝의 새로운 DecisionTree를 만들때 현재 모델에서 쓰여진 데이터를 Gradient estimate 하는데 사용하기 때문에 overfitting에 취약 (GBM은 tree structure를 고른 후 leaf value를 구하는 방식)
CatBoost 는 leaf value를 먼저 구하고 tree structure를 고르는 ordered principle개념을 적용하여 변형
Feature를 모두 동일하게 대칭적인 트리 구조로 형성 (예측 시간을 감소시킴)
Stacking
- 개별 모델이 예측한 데이터를 다시 meta dataset(최종모델의 학습데이터)으로 사용해서 학습하는 머신러닝 모델
- 메타 모델: 개별 모델의 예측된 데이터 세트를 다시 기반으로 학습하고 예측하는 방식
- 반드시 성능 향상 된다는 보장 없음
- 2개의 모델(learner)이 필요 - Base learner , meta learner
- 학습에 사용할 ML 알고리즘 모델은 모두 3개
1. 모델별로 각각 학습 시킨 뒤 예측을 수행하면 각각 M개의 로우를 가진 1개의 레이블 값을 도출할 것임
2. 모델별로 도출된 예측 레이블 값을 다시 합해서(스태킹) 새로운 데이터 세트를 만듦
3. 스태킹 된 데이터 세트에 대해 최종 모델을 적용해 최종 예측
* 내용참고&출처 : 태그의 수업을 복습 목적으로 정리한 내용입니다.
'IT > ML' 카테고리의 다른 글
[Machine Learning] Sampling (0) | 2022.11.11 |
---|---|
[sklearn] kNN(k-Nearest Neighbors) (0) | 2022.11.11 |
[sklearn] Naïve Bayes 나이브 베이즈 (0) | 2022.11.10 |
[sklearn] SVM(Support Vector Machine) (0) | 2022.11.09 |
[sklearn] 앙상블학습 > 랜덤 포레스트 (0) | 2022.11.07 |