본문 바로가기

데이터와 함께 탱고를/머신러닝

Catboost 주요 개념과 특징 이해하기

비교적 가장 최근에 등장한 Catboost 에 대해 관심이 생기던 찰나, 최근에 Medium Article 로 Catboost 를 잘 정리해놓은 글이 있어, 이를 참고하여 Catboost 에 관한 내용들을 정리해본다. (참고가 아니라 사실상 거의 번역일 거 같다...)
Catboost 하면 그냥 데이터에 범주형 변수 많을 때 유용한 모델 정도로만 알고 있었는데, 이 Article 에서 개념부터 특징까지 잘 설명해주고 있으니, Catboost 에 대해 관심이 있으셨던 분들도 같이 읽어보시면 좋을 것 같다.
글의 구성은 Catboost 이 기존 부스팅 기법과 다른점 위주로 설명하면서, 이러한 다른점으로 인한 특징과 장점을 설명하는 방식이 되겠다.


1. 기존의 부스팅 기법

1.1. 방법

기존의 부스팅 기법을 간략히 설명하면 다음과 같다. (Regression 기준)

1. 실제 값들의 평균과 실제 값의 차이인 잔차(Residual)를 구한다.
2. 데이터로 이 잔차들을 학습하는 모델을 만든다.
3. 만든 모델로 예측하여, 예측 값에 Learning_rate 를 곱해 실제 예측 값(평균 + 잔차예측 값*lr) 을 업데이트 한다.
4. 1~3 반복

보다 쉽고 자세한 내용은 이전에 포스팅한 Gradient Booost 을 읽어보면 알 수 있다.

1.2. 문제점

기존 부스팅 모델은 크게 다음 두 가지의 문제가 있다.

1) 느린 학습 속도

부스팅 모델이 아닌 배깅과 비교했을 때, 훨씬 느린 속도를 보인다.
이유는, 뭐 당연하다. 배깅의 경우 여러 트리들이 병렬적으로 모델학습을 수행하고 부스팅의 경우 순차적으로 모델학습을 수행해나가니, 당연히 부스팅이 느릴 수 밖에.
그래서 새롭게 나오는 부스팅 모델들(XGBoost, Light GBM, Catboost 등)의 알고리즘에는 이런 속도문제 해결도 포함한다. 애초에 느리면 사용할 수 없기 때문이다.

2) 오버피팅

속도 문제는, 샘플링이나 알고리즘 최적화로 어느정도 개선이 되었다면, 다음 진짜 문제는 오버피팅이다.
이는 부스팅이라는 개념 자체가 가지고 있는 문제인데, 위에서 설명한 부스팅 과정만 보더라도 왜 오버피팅이 일어나는지 알 수 있다.
애초에 부스팅 자체가 '잔차'를 줄여나가기 위해 학습하는 모델이기 때문에 굉장히 High Variance 한 모델일 수 밖에 없다.
그래서 새롭게 나오는 부스팅 모델들의 대부분은 이 오버피팅을 해결하기 위한 기법들을 알고리즘에 포함시킨다.


2. Catboost 의 특징

2.1. Level-wise Tree

XGBoost 와 더불어 Catboost 는 Level-wise 로 트리를 만들어나간다. (반면 Light GBM 은 Leaf-wise 다)
Level-wise 와 Leaf-wise 의 차이는, 그냥 직관적으로 말하면 Level-wise 는 BFS 같이 트리를 만들어나가는 형태고, Leaf-wise 는 DFS 같이 트리를 만들어나가는 형태다. 물론 max_depth = -1 이면 둘은 같은 형태지만, 대부분의 부스팅 모델에서의 트리는 max_depth != -1 이기 때문에 이 둘을 구분하는 것이다.
자세한 내용은 아래 링크를 참고하자.

 

Decision trees: leaf-wise (best-first) and level-wise tree traverse

Issue 1: I am confused by the description of LightGBM regarding the way the tree is expanded. They state: Most decision tree learning algorithms grow tree by level (depth)-wise, like the

datascience.stackexchange.com

2.2. Orderd Boosting

Catboost 는 기존의 부스팅 과정과 전체적인 양상은 비슷하되, 조금 다르다.
기존의 부스팅 모델이 일괄적으로 모든 훈련 데이터를 대상으로 잔차계산을 했다면, Catboost 는 일부만 가지고 잔차계산을 한 뒤, 이걸로 모델을 만들고, 그 뒤에 데이터의 잔차는 이 모델로 예측한 값을 사용한다.
말로 들으면 좀 어려울 수 있는데, 아래 예를 보자.

기존의 부스팅 기법은 모든 데이터(x1 ~ x10) 까지의 잔차를 일괄 계산한다.
반면, Catboost 의 과정은 다음과 같다.

1.  먼저 x1 의 잔차만 계산하고, 이를 기반으로 모델을 만든다. 그리고 x2 의 잔차를 이 모델로 예측한다.
2.  x1, x2 의 잔차를 가지고 모델을 만든다. 이를 기반으로 x3, x4 의 잔차를 모델로 예측한다.
3.  x1, x2, x3, x4 를 가지고 모델을 만든다. 이를 기반으로 x5, x6, z7, x8 의 잔차를 모델로 예측한다.
4.  ... 반복

이렇게 순서에 따라 모델을 만들고 예측하는 방식을 Ordered Boosting 이라 부른다.

2.3. Random Permutation

위에서 Ordered Boosting 을 할 때, 데이터 순서를 섞어주지 않으면 매번 같은 순서대로 잔차를 예측하는 모델을 만들 가능성이 있다. 이 순서는 사실 우리가 임의로 정한 것임으로, 순서 역시 매번 섞어줘야 한다. Catboost 는 이러한 것 역시 감안해서 데이터를 셔플링하여 뽑아낸다. 뽑아낼 때도 역시 모든 데이터를 뽑는게 아니라, 그 중 일부만 가져오게 할 수 있다. 이 모든 기법이 다 오버피팅 방지를 위해, 트리를 다각적으로 만들려는 시도이다.

2.4. Ordered Target Encoding

Target Encoding, Mean Encoding, Response Encoding 이라고 불리우는 기법 (3개 다 같은 말이다.)을 사용한다.
범주형 변수를 수로 인코딩 시키는 방법 중, 비교적 가장 최근에 나온 기법인데, 간단한 설명을 하면 다음과 같다.

위 데이터에서 time, feature1 으로 class_label 을 예측해야한다고 해보자.
feature1 의 cloudy 는 다음과 같이 인코딩 할 수 있다.

cloudy = (15 +14 +20 + 25)/4 = 18.5

즉, cloudy 를 cloudy 를 가진 데이터들의 class_label 의 값의 평균으로 인코딩 하는 것이다.
이 때문에 Mean encoding 이라 불리기도 한다.

그런데 위는 우리가 예측해야하는 값이 훈련 셋 피처에 들어가버리는 문제, 즉 Data Leakage 문제를 일으킨다. 이는 오버피팅을 일으키는 주 원인이자, Mean encoding 방법 자체의 문제이기도 하다.

그래서, Catboost 는 이에대한 해결책으로, 현재 데이터의 인코딩하기 위해 이전 데이터들의 인코딩된 값을 사용한다.
예를 들면 다음과 같다.

- Friday 에는, cloudy = (15+14)/2 = 15.5 로 인코딩 된다.
- Saturday 에는, cloudy = (15+14+20)/3 = 16.3 로 인코딩 된다.

즉, 현재 데이터의 타겟 값을 사용하지 않고, 이전 데이터들의 타겟 값만을 사용하니, Data Leakage 가 일어나지 않는 것이다.
범주형 변수를 수로 인코딩하는 할 때, 오버피팅도 막고 수치값의 다양성도 만들어 주는.. 참 영리한 기법이 아닐 수 없다.
이러한 시도는 Smoothing, Expanding 등이 있어왔는데, 이 시도 역시 이런 종류 중 하나라고 볼 수 있겠다.
(이에 대한 자세한 내용은 Categorical Value Encoding 과 Mean Encoding 참고)

2.5. Categorical Feauture Combinations

먼저 다음의 예부터 보자.

country만 봐도 hair_color feature가 결정되기 때문에, class_label 을 예측하는데 있어, 두 feature 다 필요없이 이 중 하나의 feature 만 있으면 된다. Catboost 는 이렇게, information gain 이 동일한 두 feature 를 하나의 feature 로 묶어버린다. 결과적으로, 데이터 전처리에 있어 feature selection 부담이 조금 줄어든다고 할 수 있다.

2.6. One-hot Encoding

사실 범주형 변수를 항상 Target Encoding 하는 것은 아니다. Catboost 는 낮은 Cardinality 를 가지는 범주형 변수에 한해서, 기본적으로 One-hot encoding 을 시행한다. Cardinality 기준은 one_hot_max_size 파라미터로 설정할 수 있다.
예를 들어, one_hot_max_size = 3 으로 준 경우, Cardinality 가 3이하인 범주형 변수들은 Target Encoding 이 아니라 One-hot 으로 인코딩 된다.
아무래도 Low Cardinality 를 가지는 범주형 변수의 경우 Target Encoding 보다 One-hot 이 더 효율적이라 그런 듯 하다.

2.7. Optimized Parameter tuning

Catboost 는 기본 파라미터가 기본적으로 최적화가 잘 되어있어서, 파라미터 튜닝에 크게 신경쓰지 않아도 된다고 한다. (반면 xgboost 나 light gbm 은 파라미터 튜닝에 매우 민감하다.) 사실 대부분 부스팅 모델들이 파라미터 튜닝하는 이유는, 트리의 다형성과 오버피팅 문제를 해결하기 위함인데, Catboost 는 이를 내부적인 알고리즘으로 해결하고 있으니, 굳이.. 파라미터 튜닝할 필요가 없는 것이다.
굳이 한다면 learning_rate, random_strength, L2_regulariser 과 같은 파라미터 튜닝인데, 결과는 큰 차이가 없다고 한다.


3. Catboost 의 한계

다음과 같은 한계를 지닌다.

  • Sparse 한 Matrix 는 처리하지 못한다.
  • 데이터 대부분이 수치형 변수인 경우, Light GBM 보다 학습 속도가 느리다. (즉 대부분이 범주형 변수인 경우 쓰라는 말)

4. Catboost 를 언제 사용해야할까?

음.. 이거는 정말 케이스 바이 케이스가 참 많은데, 대략적으로만 말하자면 파라미터 조정을 통해 여기저기 적용 가능하다.
사실 파라미터 수정해서 적용할 수 있는 상황이 많아서, 그냥 참고 링크 첫 번째 사이트를 들어가 보는게 나을 듯하다.
(귀찮아서 더 안 적는거 아님...)


5. 참고

 

What’s so special about CatBoost?

CatBoost is based on gradient boosting. A new machine learning technique developed by Yandex that outperforms many existing boosting…

medium.com

 

Catboost

1. Introdunction Gradient boosting은 weak learner를 loss function상에서 gradient descent라는 최적화 기법으로 기울기가 가장 큰 (greedy procedure) 방향으로 sub tree들을 반복적으로 추가하여 결합하는 방..

gentlej90.tistory.com

 

'데이터와 함께 탱고를 > 머신러닝' 카테고리의 다른 글

Word2Vec 과 Doc2Vec  (0) 2020.01.29
코사인 vs 유클리디안 유사도, 케이스로 이해하기  (0) 2019.12.11
Categorical Value Encoding 과 Mean Encoding  (3) 2019.09.07
Gradient Boost  (3) 2019.08.09
AdaBoost  (5) 2019.08.07