안녕하세요 헤오니입니다!
오늘은 분류 모델 CatBoost의 알고리즘에 대해 알아보고 또다른 부스팅 알고리즘인 LightGBM 과 간단하게 비교해보는 포스팅을 해보려고 합니다.
참고자료
https://hanishrohit.medium.com/whats-so-special-about-catboost-335d64d754ae
https://affine.ai/catboost-a-new-game-of-machine-learning/
1. 개요
CatBoost는 대부분이 범주형변수로 이루어진 데이터셋에서 예측 성능이 우수한 것으로 알려져있습니다.
CatBoost는 이름에서부터 알 수 있듯이 Boosting(부스팅) 기반의 모델입니다. Boosting은 한 줄로 요약하면 약한 분류기들을 결합하여 보다 더 강한 분류기를 만드는 알고리즘인데요, boosting 알고리즘은 예측값의 bias를 작게 만드는 장점을 갖고 있습니다.
하지만 머신러닝에서는 Bias-Variance Tradeoff 가 존재합니다. 이는 모델 학습 시 bias와 variance가 반비례 관계를 가진다는 것인데요, boosting 알고리즘의 경우 bias를 작게 하기 때문에 그만큼 variance가 커지게 되어 오버피팅이 발생하게 됩니다. CatBoost는 boosting의 장점을 가져가면서, 어떻게 오버피팅을 방지하는지 한 번 살펴보겠습니다.
2. CatBoost 알고리즘 특징
1) 특이한 Categorical feature(범주형 변수) 처리의 특징
CatBoost에서는 다른 boosting 기반 알고리즘과 달리 범주형 변수를 특별하게 처리합니다. 예를 들어 데이터가 다음과 같다고 가정합시다. Country에는 Korea, Norway, Eye color 변수에는 Black, Blue 가 있습니다.
그런데 Country와 Eye color의 조합은 항상 Korea - Black, Norway - Blue 로 되어있습니다. 이것은 곧 Country가 정해지면 Eye Color도 정해진다는 뜻이죠! 이러한 경우 Country, Eye color를 모두 사용할 필요 없이, 둘 중 한 변수만 사용해도 됩니다. 오히려 둘 다 사용한다면 dimension이 증가하기 때문에 이러한 변수가 많을 경우 오버피팅을 발생시킬 수 있습니다.
CatBoost는 이 과정을 알아서! 진행합니다. 아래와 같은 데이터가 있는 경우 모델링에 사용할 변수를 하나만 선택합니다. 이 과정을 Categorical feature combination 이라 합니다.
Country | Eye color |
Korea | Black |
Korea | Black |
Korea | Black |
Norway | Blue |
Norway | Blue |
Norway | Blue |
CatBoost는 범주형 변수를 One-hot Encoding, Label Encoding 등 encoding 작업을 하지 않고도 그대로 모델의 input으로 사용할 수 있다는 장점이 있습니다. (알아서 target encoding을 해주는데 뒷부분에서 설명하겠습니다!) 하지만 범주형 변수의 cardinality가 작은 경우에는 One-hot Encoding을 진행하기도 합니다. Python의 CatBoostClassifier 혹은 CatBoostRegressor의 one_hot_max_size를 설정하면 범주형 변수의 범주 수가 지정된 값보다 작으면 One-hot Encoding을 진행합니다.
2) Ordered Target Encoding
CatBoost에서는 범주형 변수를 그대로 모델에 넣어주면 알아서 Orderd Target Encoding을 진행합니다. Orderd Target Encoding은 말 그대로 target encoding의 아이디어를 가져온 것인데요, 데이터를 예시로 들고 살펴보겠습니다.
아래의 데이터는 범주형 변수 weather 을 포함하고 있습니다. Target은 우리가 예측하고자 하는 값을 말합니다.
만약 일반 Target Encoding을 사용한다면, weather 변수의 Cloudy는 해당 Target 값의 평균인 (15+14+20+25)/4 = 18.5 로 대체됩니다. Sunny는 데이터가 하나이므로 10으로 대체되겠죠! 하지만 이 경우 Target 값이 Weather 변수에 들어가기 때문에 data leakage 문제가 발생할 수 있습니다.
Weekday | Weather | Target |
Tues | Cloudy | 15 |
Wed | Cloudy | 14 |
Thurs | Sunny | 10 |
Fri | Cloudy | 20 |
Sun | Cloudy | 25 |
그래서 CatBoost에서는 data leakage를 방지하기 위해 Target Encoding 대신 Ordered Target Encoding을 사용합니다.
원리는 다음과 같습니다.
예를 들어 Friday에 해당하는 Cloudy를 인코딩할 때는 앞서 얻은 데이터 Tues, Wed에 해당하는 Target 값의 평균을 이용하여 인코딩합니다. 즉 Fri에 해당하는 Cloudy 대신, (15+14)/2=14.5를 이용하는 것입니다. 마찬가지로 Sun에 대한 Cloudy는 (15+14+20)/3=16.3 으로 대체됩니다. 요악하면 과거의 데이터를 이용해 현재의 데이터를 인코딩 하는 원리입니다. 이렇게 하면 data leakage 문제도 방지할 수 있습니다.
Tues 의 경우 Ordered Target Encoding을 적용하면 어떻게 될까요? 원래대로라면 0을 넣어야 합니다.(과거의 데이터가 0개이기 때문!) 하지만 이 경우 Laplace Smoothing 이라는 방법을 사용한다고 하는데, 이 부분에 대해서는 추후 포스팅에서 다루도록 하겠습니다.
2) Ordered Boosting
CatBoost에서는 일반적인 Boosting 대신 Orderd Boosting을 사용합니다.
먼저 Train set의 row 순서를 랜덤으로 섞는 Random Permutation 을 진행합니다. 이 때 Permuation으로 생성할 데이터셋의 개수는 default 값이 4개이고, 사용자가 몇 개의 permuted 데이터셋을 생성할지는 bagging_temperature 를 지정하여 정할 수 있습니다. Random Permutation을 하면 데이터셋의 순서를 랜덤으로 섞기 때문에 오버피팅을 방지할 수 있습니다.
그리고 Orderd Boosting을 각 permuted sample 에 적용합니다. Orderd Boosting의 대략적인 과정은 다음과 같습니다. 데이터포인트가 x1, x2, ..., x10, ... 이렇게 있다고 가정합시다.
- x1 를 학습한 후 x2 를 예측하고 잔차를 계산
- x1, x2 를 학습한 후, x3, x4의 잔차를 계산
- x1, x2, x3 를 학습한 후, x4, x5, x6의 잔차를 계산
- 1~3 반복
즉 순서(order)에 따라 모델을 학습시키고 순차적으로 잔차를 계산하는 과정을 반복합니다.
'Machine Learning' 카테고리의 다른 글
Cross Validation(교차검증)의 종류와 특징 파헤치기🎯 (0) | 2021.07.27 |
---|