Machine Learning

Catboost

불굴의관돌이 2021. 4. 11. 21:44

비교적 가장 최근에 등장한 Catboost이다.

Catboost는 데이터에 범주형 변수가 많을 경우 유용한 모델이다 .

 

기존의 부스팅 기법

Method

1. 실제 데이터들의 mean과 residual를 구한다.

2. 데이터로 이 residual을 학습하는 모델을 만든다.

3. 만들어진 모델로 예측하여, 예측 값에 Learning_rate를 곱해 실제 예측 값(평균+잔차예측 값*lr)을 업데이트 한다.

4. 1~3 repeat.

 

문제점

느린 학습 속도

boosting model이 아닌 배깅과 비교했을 때 훨씬 느린 속도를 보인다. 배깅의 경우 여러 트리들이 병렬적으로 모델학습을 수행하고 부스팅의 경우 순차적으로 모델학습을 수행한다. 

그래서 새롭게 나오는 부스팅 모델들(XGBoost, Light GBM, Catboost 등)의 알고리즘에는 이런 속도 문제 해결도 포함한다. 

 

오버피팅

속도 문제는, 샘플링이나 알고리즘 최적화로 어느정도 개선되는 반면, 오버피팅은 그렇지 않다. 이는 부스팅이라는 개념 자체가 가지고 있는 문제인데, 위 과정만 보더라도 왜 오버피팅이 일어나는지 알 수 있다.

애초, 부스팅 자체가 'residual'을 줄여나가기 위해 학습하는 모델이기 때문에 굉장히 High Variance한 모델일 수 밖에 없다.

이에, 새롭게 나오는 부스팅 모델들의 대부분은 이 오버피팅을 해결하기 위한 기법들을 알고리즘에 포함시킨다.

 

Catboost의 특징

Level-wise Tree

XGBoost와 더불어 Catboost는 Level-wise로 트리를 만들어나가는 반면 Light GBM은 Leaf-wise이다.

Level-wise와 Leaf-wise의 차이는, 직관적으로 Level-wise는 BFS(너비 우선 탐색:Breath-first search)  같이 트리를 만들어나가는 형태이고,

Leaf-wise는 DFS(깊이 우선 탐색: Depth-first search) 같이 트리를 만들어나가는 형태이다. 물론 max_depth=-1이면 둘다 같은 형태지만, 대부분의 부스팅 모델에서는 트리는 max_depth!=-1이기 때문에 이 둘을 구분하는 것이다.

 

Ordered Boosting

Catboost는 기존의 부스팅 과정고 전체적 흐름은 비슷하되 약간 다르다. 

기존의 부스팅 모델이 일괄적으로 모든 훈련 데이터를 대상으로 잔차를 계산했다면, Catboost는 일부만 가지고 잔차계산을 한 뒤, 이것을 통해 모델을 만들고, 그 후, 데이터의 잔차는 이 모델로 예측한 값을 사용한다. 

다음 예를 확인해보자.

기존 부스팅 기법은 모든 datapoint(x1-x10)까지의 잔차를 일괄 계산한다.

반면, Catboost의 과정은 다음과 같다.

1. 먼저 x1의 잔차만 계산하고, 이를 기반으로 모델을 만든다. 그 후, x2의 잔차를 이 모델로 예측한다.

2. x1,x2의 잔차를 가지고 모델을 만든다. 이를 기반으로 x3,x4의 잔차를 모델로 예측한다.

3. x1,x2,x3,x4의 잔차를 가지고 모델을 만든다. 이를 기반으로 x5,x6,x7,x8의 잔차를 모델로 예측한다.

4. 이 과정을 반복한다.

 

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

 

Random Permutation

Ordering Boosting을 할 때, 데이터 순서를 randomize 하지 않으면 매번 같은 순서대로 예측하는 모델을 만들 가능성이 있다. 이 순서는 사실 우리가 임의로 정한 것이므로, 순서 역시 매번 섞어줘야 한다. Catboost는 이러한 것 역시 감안해서 데이터를 shuffling하여 뽑아낸다. 뽑아낼 때 역시 모든 데이터를 뽑는게 아니라, 그 중 일부만 가져오게 할 수 있다.

이 모든 기법이 다 Overfitting을 방지하기 위해, 트리를 다각적으로 만드려는 시도이다.

 

Ordered Target Encoding

Target Encoding, Mean Encoding, Response Encoding 이라고 불리는 기법을 사용한다. (모두 같은 말)

범주형 변수를 정수로 인코딩 시키는 방법 중, 가장 최근에 나온 기법인데, 간단히 설명하면 다음과 같다.

위 데이터에서 time, feature1로 class_label을 예측해야한다고 해보자.

feature1의 cloudy는 다음과 같이 인코딩 할 수 있다.

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

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

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

Catboost는 이에대한 해결책으로, 현재 데이터의 인코딩하기 위해 이전 데이터들의 인코딩된 값을 사용한다.

 

-Friday, cloudy=(15+14)/2=15.3 encoding

-Saturday, cloudy=(15+14+20)/3=16.3 encoding

 

즉, 현재 데이터의 타겟 값을 사용하지 않고, 이전 데이터들의 타겟 값만을 상요하니, Data Leakage가 일어나지 않는다.

범주형 변수를 정수 인코딩할 때, 오버피팅도 막고 수치 값의 다양성도 만들어주는 영리한 기법이다.

이러한 시도는 Smoothing, Expanding 등이 있었는데, 이 시도 역시 이런 종류 중 하나라고 볼 수 있다.

 

Categorical Feature Combinations

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

 

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이 더 효율적이기 때문이다.

 

Optimized Parameter tuning

Catboost는 디폴트 파라미터가 기본적으로 최적화가 잘 되어있어, 파라미터 튜닝에 크게 신경쓰지 않아도 된다고 한다.

반면 xgboost나 light gbm은 파라미터 튜닝에 매우 민감하다. 사실 대부분 부스팅 모델들이 파라미터 튜닝하는 이유는, 트리의 다형성과 오버피팅 문제를 해결하기 위함인데, Catboost는 이를 내부적인 알고리즘으로 해결하고 있으니 굳이 파라미터를 튜닝할 필요가 없다는 것이다.

굳이 해야한다면, learning_rate, random_strength, L2_regulariser과 같은 파라미터 튜닝인데 큰 차이는 없다고 한다.

 

 

Catboost의 한계

-Sparse한 Matrix는 처리하지 못한다.

-데이터의 대부분이 수치형 변수인 경우, Light GBM보다 학습 속도가 느리다. 즉, 대부분이 범주형 변수인 경우 쓰라는 것이다.