[오늘의 공부]
오늘은 Gradient Boosting 중 범주형 변수가 많을 때 많이 사용하는 CatBoost에 대해 공부해보고자 한다.
▶ CatBoost란
Categorical Boosting의 약자로 2017년 4월에 배포되었고, 특정 회사에서 개발한 모델로 기업이 운영하여 사이트가 잘 되어 있음.
gbm의 2가지 큰 문제점을 보완하기 위해 개발함.
1) Prediction Shift
- train 데이터에 대한 조건부 확률과 test 데이터에 대한 조건부 확률이 달라 오버피팅이 발생한다는 것임.
2) Target Leakage
- 어떤 객체의 타겟 변수가 해당하는 객체의 피처 벨류를 계산하는데 사용되므로써 오버피팅이 발생할 수 있다는 것임.
- 간단하게 말하면 정답 값(y)가 피처 벨류를 계산하는데 사용된다는 말임.
- 위의 그림을 보면 Target Statistic을 계산할 때 y값 정답에 대한 정보가 들어가기 때문에 데이터 누수가 있다는 것임.
위와 같은 문제점을 보완하기 위한 대안이 각각 존재함.
- Prediction Shift -> Ordered Boosting
- Target Leakage -> Ordered Target Statistics
1) Ordered Target Statistics(TS)
목표는 Target Leakage 방지임.
특정 객체의 피처 벨류를 계산하는데 있어 y값을 안쓰고 어떻게 할 것인가에 대한 답은 Boosting에서의 베이직한 방법인 원핫인코딩이 있음.
- 값에 해당되는 것을 1로 변환하고 나머지에 대한 것은 더미변수를 생성하여 진행하기 때문에 데이터가 커지는 문제가 있음.
LGBM의 경우 피처 번들링을 통해 데이터를 줄임.
또다른 대표적인 방법론은 카테고리를 그룹핑을 통해 Target Statistic으로 변환하는 것이 있음.
- 각각의 카테고리에 있는 타겟 벨류의 평균으로 변환하는 것임.
TS 계산 시 위에 보이는 그림처럼 라벨의 노이즈가 존재할 때 smoothing 기법을 통해 처리함.
- smoothing을 통해 값을 계산하는 예제는 다음과 같음.(a, p를 사용)
Target Leakage로 인해 발생하는 문제점은 Conditional Shift임.
- Conditional Shift는 y라는 범주에 대해서 각각의 x, i 카테고리 조건부 분포가 학습 데이터와 테스트 데이터에 대해 달라짐.
- test 데이터 관점에서 봤을 때 새로운 데이터가 들어오면서 Ts를 계산하려고 하면 train을 사용하여 계산하므로 test 데이터 y를 사용하지 X
- train 관점에서는 새로운 데이터가 들어오면서 Ts를 계산하려고 하면 trian을 사용하여 계산함.
- 결론은 예측을 함에 있어서 train, test에 동일하게 자기 자신의 target 정보를 사용하지 않아야 Conditional Shift가 일어나지 않음.
○ Target Statistics의 바람직한 속성
- 학습 데이터와 테스트 데이터의 대해 해당하는 기대가 같아야 됨.
- 학습을 하는데 / TS를 계산하는데 가급적이면 학습 데이터를 효과적으로 써야 됨.
○ conditional shift 피하기 위한 방법론
Holdout TS(cross validation 같은 개념)
- 데이터 세트를 두 개 파트로 나누어 첫 번째 파트는 TS를 계산하는 데만 사용하고 두 번째 파트는 학습에 사용함.
leave-one-out-TS
- 학습 데이터에 대해서는 나 자신만 빼고 TS를 계산하고 테스트 데이터에 대해서는 모든 학습 데이터를 사용함.
- 이 방법을 사용하면 Target Leakage를 방지하지 못함.
catboost에서는 conditional shift를 방지하기 위해 Ordered TS를 제안함.
○ Ordered TS
학습 데이터가 시계열이 아닐지라도 가상의 시간을 도입하여 객체들을 Random Permutation = 랜덤하게 순열(순서가 부여된 임의의 집합을 다른 순서로 뒤섞는 연산)을 학습할 때마다 계속적으로 진행함.
2가지의 조건을 만족하여 Target Leakage를 방지함.
- k번째 객체의 피처 벨류를 계산함에 있어 k번째 객체의 타겟 정보를 사용하지 않음.
- 되도록 모든 데이터를 사용함.
2) catboost에서 Prediction Shift을 방지하기 위한 방법 Ordered Boosting
Random Permutation을 이용하여 데이터를 준비함.
첫 번째 객체만을 이용해 트리를 만들고, 두 번째 객체에 대한 잔차 계산시에는 첫 번째 모형의 결과물과 두 번째 객체의 y값을 가지고 계산함.
이 잔차를 통해 모델 업데이트를 진행함.
최종적으로 객체 한 개만 남겨두고 나머지 데이터 모두 사용하여 모형을 만듦.
▶ CatBoost 절차
초기화 단계에서는 (s+1)개의 독립적인 랜덤 permutation(순열) 학습 데이터로부터 생성함.
- s+1 사용하는 이유 1: s개는 스플릿을 평가하는데 사용함.
- s+1 사용하는 이유 2: 마지막에 만들어진 트리에 leaf value를 계산할 때 사용함.
이렇게 하는 이유는 Ordered Boosting을 하게 되면 Permutation을 어떻게 하냐에 따라서 차이가 많이 남. 이 의미는 약간에 변화에도 모델이 크게 변하는 Variance가 크다는 뜻임.
permutation을 한번만 쓰면 최종적인 모델의 variance가 크기 때문에 이것을 줄여주기 위해 permutation을 여러번 반복하겠다는 것임.
사용하는 트리 중에 하나가 oblivious tree임. oblivious tree를 만듦.
- oblivious tree: 모든 레벨의 트리에서 같은 스플릿 criterion(표준)을 사용함.
일반적인 트리는 왼쪽이며, 오른쪽은 같은 뎁스면 같은 스플릿 표준을 사용함. 그 밑으로 레벨 하나 더 내려가면 모든 경우에 대해서 male은 1이라는 것이 스플릿 표준이 됨. 오른쪽이 computation cost(계산 비용)이 적다는 장점이 있음.
학습이 완료되었다는 가정에서 최종적인 leaf node value를 계산하는 과정에서 마지막에 s+1개 하나 permutation 남긴다고 했는데 이 한 개를 이용하여 지금까지 사용했던 결과물 계산함.
제일 마지막에 남은 델타가 leaf node value가 됨.
ordered TS는 모든 트레이닝 데이터를 다 사용하여 계산함.
▶ CatBoost 장점
- 다른 GBM모델에 비해 과적합이 적음.
- 기본 파라미터 최적화가 잘 되어 있어 하이퍼파라미터 튜닝에 크게 신경 안씀.
- One-hot Encoding, Label Encoding 등 encoding 작업을 하지 않고도 그대로 모델의 input으로 사용할 수 있음.
- 범주형 변수에 대해 특정 인코딩 방식으로 인하여 모델의 정확도와 속도가 높음.
▶ CatBoost 하이퍼파라미터
파라미터 | default | 설명 |
num_boost_around | 10 | 학습에 활용될 weak learner의 반복 수를 뜻함. |
min_child_weight | 1 | - leaf node 에 포함되는 최소 관측치의 수를 의미함. - 작은 값을 가질수록 과적합 발생 가능성이 높음 과적합 조절 용도로 사용됨. |
gamma | 0 | leaf node 의 추가 분할을 결정할 최소 손실 감소값으로, 해당값보다 손실이 크게 감소할 때 분리 값이 클수록 과적합 감소효과가 있음. |
max_depth | 6 | - 트리의 최대 깊이를 설정 0을 지정하면 깊이의 제한이 없음. - 과적합에 가장 민감하게 작용하는 파라미터로, 과적합 조절 용도로 사용됨. |
sub_sample | 1 | - 학습 시 데이터 샘플링 비율을 지정하는 역할을 함. 과적합을 제어하는데 사용되며, 일반적으로 0.5~1 사이의 값을 사용함. - 범위는 0~1 사이의 값을 사용함. |
colsample_bytree | 1 | - 트리 생성에 필요한 feature의 샘플링에 사용하며, feature가 많을 때 과적합 조절에 사용됨. - 범위는 0~1 사이의 값을 사용함. |
lambda | 1 | - L2 Regularization 적용 값으로, feature 개수가 많을 때 검토하여 적용함. - 클수록 과적합 감소 효과 |
alpha | 0 | L1 Regularization 적용 값으로, feature 개수가 많을 때 검토하여 적용함. - 클수록 과적합 감소 효과 |
scale_pos_weight | 1 | 불균형 데이터셋의 균형을 유지하는데 사용됨. |
learning_rate | 0.1 | 최종 결과에 대한 각각의 Tree에 영향을 미치는 변수로, 초기의 추정값에서 시작하여 각각의 Tree 결과를 사용하여 추정값을 업데이트하여 이러한 추정에서 발생하는 변화의 크기를 컨트롤 함. |
iterations | 100 | 반복을 수행하는 횟수를 뜻함. |
eval_metric | object에 따라 바뀜 | 기본 값은 회귀 분석인 경우 ‘rmse’ 를, 클래스 분류 문제인 경우 ‘error’를 사용함. - rmse : Root Mean Squared Error - mae : mean absolute error - logloss : Negative log-likelihood - error : binary classification error rate - merror : multiclass clasification error rate - mlogloss : Multiclass logloss - auc : Area Under Curve |
▶ 이 글을 마치며...
내가 프로젝트를 진행 시 데이터에 범주형 데이터가 많은 경우, catboost를 우선적으로 사용한 경우가 많고, 결과가 괜찮았던 기억이 있다. 추가적으로 파라미터 튜닝도 다른 모델에 비해 크게 손대지 않아도 결과가 좋아서 편했던 것 같다.
불가 1~2년 전에는 여러 공모전에서도 많이 사용하기도 했지만, 요즘 AI 시장이 급변하는 만큼 더 좋은 모델들이 나와 최근 들어 많이 사용하지 않는 것 같지만, 프로젝트를 진행하게 되고, 데이터의 특성에 맞다면 종종 사용해보지 않을까라는 생각을 해본다.
다음에는 시계열에 대해 공부한 내용을 업로드해볼까 하며, 글귀 하나를 적으며 마무리하고자 한다.
"미래를 예측하는 가장 좋은 방법은 그것을 창조하는 것이다." 피터 드러커의 말로 미래를 예측하는 확실한 방법은 우리가 직접 미래를 만들어간다는 뜻으로, 직접 미래를 개척하기 위해, 나는 오늘도 열심히 달린다.
▶ 참고자료
'개발 관련 공부 > 머신러닝' 카테고리의 다른 글
자연어 처리에 대하여 (1) | 2025.01.09 |
---|---|
LGBM(Light Gradient Boosting Machine)이란? (1) | 2025.01.07 |
XGBoost(Extreme Gradient Boosting)란? (0) | 2025.01.06 |
Gradient Boosting Machine(gbm)란? (4) | 2025.01.04 |
Random Forest(랜덤포레스트)란? (0) | 2024.12.25 |