여러 개의 classifier를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법이다.
비정형 데이터의 분류는 딥러닝이 뛰어난 성능을 보이고 있지만, 대부분의 정형 데이터 분류 시에는 앙상블이 뛰어난 성능을 나타낸다.
앙상블 유형은 보팅(Voting), 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking) 등 다양한 방법이 존재한다.
위의 그림은 voting과 bagging을 쉽게 이해할 수 있는 그림이다.
voting과 bagging 두개 다 여러 개의 classifier가 투표를 통해 최종 예측 결과를 결정하는 방식인데, voting은 서로 다른 알고리즘을 가진 classifier를 결정하는 방식이고 bagging은 서로 같은 알고리즘 기반이지만 Data Sampling을 서로 다르게 가져가면서 학습을 수행해 voting을 수행합니다.
bagging의 Data sampling 방식은 Bootstrapping 분할 방식입니다. subset의 data 건수는 전체 data건수와 동일하지만, 개별 data가 중첩되어 만들어집니다.
즉, 정리하자면 sampling한 data의 개수는 전체 data의 개수와 같지만 data의 중복을 허용하게 됩니다. sampling data는 각 estimator마다 data는 다릅니다.
boosting은 여러 개의 classifier가 순차적으로 학습을 수행하되, 앞에서 학습한 classifier가 예측이 틀린 data에 대해서는 올바르게 예측할 수 있도록 다음 classifier에게는 weight를 부여하면서 학습과 예측을 수행합니다.
Gradient Boost, XGBoost, LightGBM이 있습니다.
Bagging과 Boosting은 DecisionTree기반이기 때문에 overfitting이 쉽게 발생하지만, 매우 많은 classifier를 결합해 다양한 상황을 학습하게 함으로써 극복한다.
Stacking은 여러 가지 다른 classfier의 예측 결과값을 다시 학습 데이터로 만들어서 다른 모델로 재학습시켜 결과를 예측하는 방법입니다.
Hard Voting : 예측한 결괏값들 중 다수의 classifier가 결정한 예측값을 최종 voting 결과값으로 선정한다.
Soft Voting : Classifier들의 label값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 label값을 최종 voting 결과값으로 선정한다.(Default 값)
일반적으로 Hard Voting보다 Soft Voting이 예측 성능이 좋아서 더 많이 사용된다고 합니다.
전반적으로 voting이 좋은 성능을 내지만 데이터의 특성과 분포 등 다양한 요건에 다라 오히려 기반 classifier 중 가장 좋은 classifier의 성능이 voting을 했을 때보다 더 나을 수 있다.
ML 모델의 성능은 다양한 test data에 의해 validation되므로 어떻게 높은 유연성을 가지고 현실에 대처할 수 있는가가 중요한 ML 모델의 평가요소가 된다.
이러한 관점에서 Bias-Variance TradeOff는 ML 모델이 극복해야 할 중요한 과제이다.
bagging의 대표적인 알고리즘은 RandomForest 알고리즘이다.
RandomForest의 기반 알고리즘은 DecisionTree로서 쉽고 직관적인 장점을 가지고 있습니다.
CPU 병렬 처리도 효과적으로 수행이 가능하다. 인자로 n_jobs = -1로 설정하면 cpu core를 모두 사용할 수 있다.(GridSearchCV도 가능하다.)
Hyperparameter가 너무 많다.
튜닝을 위한 시간이 많이 소모된다.
튜닝 후, 예측 성능이 크게 향상되는 경우가 많지 않다.
n_estimators : decisiontree의 개수, Default = 10
max_features : 참조하는 Feature 개수
max_depth : tree의 최대 깊이, Default : None(완벽하게 class 결정 값이 될 때까지 깊이를 계속 키우며 split하거나 min_samples_split보다 작아질 때까지 계속 깊이를 증가시킨다. overfitting이 날 수 있으니 적절한 제어가 필요하다.)
min_samples_leaf : 분할이 될 경우 branch node에서 가져야 할 최소한의 sample data 수
min_samples_split : 노드를 분할하기 위한 최소한의 sample data 수, Default = 2
여러 개의 약한 학습기를 순차적으로 학습-예측하면서 잘못 예측한 data에 weight 부여를 통해 오류를 개선해 나가면서 학습하는 방식이다.
AdaBoost, GradientBoost가 있다.
AdaBoost는 오류 data에 weight를 부여하는 알고리즘이다.
GradientBoost는 weight update를 gradient descent를 이용한다.
GBM는 CART 기반의 알고리즘으로 분류와 회귀도 가능하다.
수행 시간이 오래걸린다는 단점이 존재한다.
DecisionTree의 hyperparameter를 가지고 있다.
loss : gradient descent에서 사용할 loss함수 지정, default = 'deviance'
learning_rate : 학습률
n_estimators : 약한 학습기 개수, default = 100
subsample : 약한 학습기가 학습에 사용하는 데이터의 sample ratio이다. default는 1이며 이는 전체 학습 데이터를 기반으로 학습한다는 의미이다. 0.5면 학습데이터의 50%, overfitting이 염려되는 경우에는 1보다 작은 값을 설정하면 된다.
boosting 기반의 다양한 알고리즘들은 decisiontree 알고리즘을 기반 알고리즘으로 채택하고 있습니다.
GBM에 기반하지만, GBM의 단점인 느린 수행 시간, 과적합 규제 부재등의 문제를 해결한다.
XGBoost 자체에 과적합 규제 기능으로 과적합에 좀 더 강한 내구성을 지닌다고 합니다.
병렬 CPU환경에서 병렬 학습이 가능하다.
Tree Pruning : 더 이상 긍정 이득이 없는 분할을 가지치기 해서 분할 수를 더 줄인다
자체 내장된 교차 검증을 수행한다.
조기 중단 기능이 있다.
결손값을 자체 처리할 수 있는 기능을 가진다.(NaN 처리)
booster : gbtree(tree based model) or gblinear(linear model), default = gbtree
silent : 0 : 메시지 출력, 1 : 메세지 출력 x
nthread : CPU의 실행 스레드 개수를 조정하며, default = CPU의 전체 스레드를 다 사용
learning_rate : 학습률
n_estimators : 약한 학습기 개수
min_split_loss : tree의 leaf 노드를 추가적으로 나눌지를 결정할 최소 손실 감소 값이다. 해당 값보다 큰 loss가 감소된 경우에 leaf 노드를 분할합니다. 값이 클수록 overfitting 감소 효과가 있습니다.
max_depth : tree기반의 max_depth와 같다. 3~10 사이의 값을 적용, default = 깊이에 제한 없음
subsample : 데이터를 sampling하는 ratio, 0.5 ~ 1사이의 값을 사용한다.
colsample_bytree : tree 생성에 필요한 column을 임의로 sampling하는데 사용된다. default = 1
scale_pos_weight : 특정 값으로 치우친 비대칭한 class로 구성된 data set의 균형을 유지하기 위한 parameter
objective : 최솟값을 가져야 할 loss function을 정의한다.
eval_metric : 검증에 사용되는 함수를 정의한다. default는 rmse, 분류일때는 error
XGBoost보다 학습에 걸리는 시간이 훨씬 적고 메모리 사용량도 상대적으로 적다.
적은 data set에 적용할 경우 overfitting이 발생하기 쉽다는 단점이 있다. 일반적으로 10,000건 이하의 data set정도라고 LightGBM의 공식 문서에서 기술하고 있다.
GBM 계열의 tree 분할 방법과 다르게 leaf 중심 tree 분할 방식을 사용한다.
대부분의 tree기반 알고리즘은 균형 트리 분할 방식을 사용하는데, 이는 최대한 균형 잡힌 tree를 유지하면서 분할하기 때문에 tree의 깊이가 최소화될 수 있다.
이렇게 균형 잡힌 tree를 유지하면서 분할하기 때문에 tree의 깊이가 최소화될 수 있는데 이는 overfitting에 보다 더 강한 구조를 가질 수 있지만 균형을 맞추기 위한 시간이 필요하다는 상대적인 단점이 존재한다.
LightGBM의 leaf 중심 tree 분할 방식은 tree의 균형을 맞추지 않고, 최대 손실 값을 가지는 leaf node를 지속적으로 분할하면서 tree의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성되는데, 최대 손실값을 가지는 leaf 노드를 지속적으로 분할해 생성된 규칙 트리는 학습을 반복할수록 결국은 균형 트리 분할 방식보다 예측 오류 손실을 최소화할 수 있게 된다.
즉 요약하자면,
더 빠른 학습과 예측 수행 시간
더 작은 메모리 사용량
category feature의 자동 변환과 최적분할(category feature를 최적으로 변환하고 이에 따른 node 분할 수행)
병렬 컴퓨팅 기능을 제공하고, 최근에는 GPU가지 지원하고 있다고 한다.
num_iterations : 반복 수행하려는 tree의 개수, default = 100
learning_rate : 학습률
max_depth : tree기반 알고리즘의 max_depth와 같다. leaf wise 기반이므로 깊이가 상대적으로 더 깊다.
min_child_samples : 리프 노드가 되기 위해서 최소한으로 필요한 record 수, default = 20
num_leaves : 1개의 tree가 가질 수 있는 최대 leaf 개수, default = 3
boosting : 부스팅의 트리를 생성하는 알고리즘을 기술한다.(default = gbdt)
gbdt = 일반적인 gradient boosting decision tree, rf : randomforest
subsample : data를 sampling하는 비율, default = 1.0
colsample_bytree : 개별 tree를 학습할 때마다 무작위로 선택하는 feature의 비율
objective : 최솟값을 가져야 할 loss function 정의한다