Catboosts
특징
1. Level-wise Tree
XGBoost와 더불어 Catboost는 Level-wise로 트리를 만들어나갑니다.
Level-wise와 Leaf-wise의 차이는, 직관적으로 Level-wise는 BFS같이 트리를 만들어 나가는 형태이며, Leaf-wise는 DFS같이 트리를 만들어나가는 형태이며, 물론 max_depth = -1 이면서 둘은 같은 형태지만, 대부분의 부스팅 모델에서의 트리를 max_depth ≠ -1 이기 때문에 이 둘을 구분하는 것이다.
2. Orderd Boosting
Catboost는 기존의 부스팅 과정과 전체적인 양상은 비슷하지만 다르다.
기존의 boosting 모델이 일괄적으로 모든 훈련 데이터를 대상으로 잔차 계산을 했지만, Catboost는 일부만을 가지고 잔차 계산을 한 후, 이걸로 모델을 만들고, 그 뒤에 데이터의 잔차는 이 모델로 예측한 값을 사용한다.
아래는 그의 예시이다.
데이터에 시간이 없으면 Catboost는 각 데이터 포인트에 대해 무작위로 가상시간을 생성합니다.
기존의 부스팅 기법의 모든 데이터( x1 ~ x10 ) 까지의 잔차를 일괄 계산한다.
반면에 , Catbost의 과정은 아래와 같다
- 먼저 x1의 잔차만 계산하고, 이를 기반으로 모델을 만든다. 그리고 x2의 잔차를 이 모델로 예측한다.
- x1, x2의 잔차를 가지고 모델을 만단다. 이를 기반으로 x3, x4의 잔차를 모델로 예측한다.
- x1, x2 , x3, x4를 가지고 모델을 만들며, 이를 기반으로 x5, x6, x7, x8의 잔차를 모델로 예측한다.
- 반복한다.
3. Random Permutation
Catboost는 데이터를 셔플링하여 뽑아내며, 뽑아낼 때도 역시 모든 데이터를 뽑는게 아니라, 그 중 일부만 가져오게 할 수 있으며, 이 모든 기법이 다 오버피팅 방지를 위해, 트리를 다각적으로 만들려고 시도한다.
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 등이 있어왔는데, 이 시도 역시 이런 종류 중 하나라고 볼 수 있겠다.
5. Categorical Feauture Combinations
아래와 같은 예를 들어서 볼 수 있다.
country만 봐도 hair_color feature가 결정되기 때문에, class_label 을 예측하는데 있어, 두 feature 다 필요없이 이 중 하나의 feature 만 있으면 된다. Catboost 는 이렇게, information gain 이 동일한 두 feature 를 하나의 feature 로 묶어버린다. 결과적으로, 데이터 전처리에 있어 feature selection 부담이 조금 줄어든다고 할 수 있다.
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 이 더 효율적이라 그런 듯 하다.
7. Optimized Parameter tuning
Catboost 는 기본 파라미터가 기본적으로 최적화가 잘 되어있어서, 파라미터 튜닝에 크게 신경쓰지 않아도 된다고 한다. (반면 xgboost 나 light gbm 은 파라미터 튜닝에 매우 민감하다.) 사실 대부분 부스팅 모델들이 파라미터 튜닝하는 이유는, 트리의 다형성과 오버피팅 문제를 해결하기 위함인데, Catboost 는 이를 내부적인 알고리즘으로 해결하고 있으니, 굳이.. 파라미터 튜닝할 필요가 없는 것이다.
굳이 한다면 learning_rate, random_strength, L2_regulariser 과 같은 파라미터 튜닝인데, 결과는 큰 차이가 없다고 한다
다양한 상황에서의 CatBoosts
하이퍼 파라미터 튜닝은 CatBoost에 중요한 측면은 아니지만 , 가장 중요한 것은 우리가 해결하고 있는 문제에 따라 올바른 파라미터를 설정하는 것입니다. 몇 가지 중요한 상황은 다음과 같습니다
1. 데이터가 시간 경과에 따라 변경되는 경우
우리는 데이터 분포가 시간이 지남에 따라 무모하게 변하는 21 세기 에 살고 있습니다 . 특히 대부분의 인터넷 회사에서 사용자 선호도는 시간이 지남에 따라 변합니다. 현실 세계에서는 데이터가 시간이 지남에 따라 변하는 상황이 많습니다. CatBoost는 has_time = True 매개변수를 설정하여 이러한 상황에서 매우 잘 수행할 수 있습니다 .
2. 낮은 대기 시간 요구 사항
고객 만족은 모든 사업에서 가장 중요한 측면입니다. 사용자는 일반적으로 웹사이트/모델에서 매우 빠른 서비스를 기대합니다. CatBoost는 예측 시간이 매우 짧은 유일한 부스팅 알고리즘입니다. 대칭 트리 구조 덕분에 예측하는 동안 XGBoost보다 비교적 8배 빠릅니다 .
3. 데이터 포인트 가중치
특정 데이터 포인트에 더 많은 중요성을 부여해야 하는 상황이 있습니다. 특히 시간적 학습-테스트 분할을 수행할 때 모델은 대부분 이전 데이터 포인트에서 학습해야 합니다. 데이터 포인트에 더 많은 가중치를 부여하면 무작위 순열에서 선택될 가능성이 높아집니다.
매개변수를 설정하여 특정 데이터 포인트에 더 많은 가중치를 부여할 수 있습니다.
예를 들어, 모든 데이터 포인트에 선형 가중치를 부여할 수 있습니다.
샘플 가중치 = [ x 범위 내 x에 대한 x(train.shape[0])]
4. 소규모 데이터 세트 작업
데이터 포인트가 적지만 손실을 최소화해야 하는 경우가 있습니다. 이러한 상황에서는 매개변수 fold_len_multiplier를 1 에 가깝게 (>1이어야 함) 설정 하고 approx_on_full_history =True로 설정할 수 있습니다 . 이러한 매개변수를 사용하면 CatBoost는 다른 모델을 사용하여 각 데이터 포인트에 대한 잔차를 계산합니다.
5. 대용량 데이터세트 작업
대규모 데이터 세트의 경우 매개변수 task_type = GPU를 설정하여 GPU에서 CatBoost를 훈련할 수 있습니다 . 또한 다중 서버 분산 GPU도 지원합니다. CatBoost는 Google Colabs에서 훈련할 수 있는 이전 GPU도 지원합니다.
6. 모니터링 오류/손실 기능
모든 반복에 대해 모델을 모니터링하는 것은 매우 좋은 관행입니다. 매개변수 custom_metric= ['AUC', 'Logloss']를 설정하여 최적화 손실 함수와 함께 선택한 모든 메트릭을 모니터링할 수 있습니다 .
모니터링하기로 선택한 모든 메트릭을 시각화할 수 있습니다. Jupyter Notebook에서 플롯을 시각화하기 위해 pip를 사용하여 ipywidgets를 설치 하고 매개변수 plot = True를 설정했는지 확인하세요.
7. 단계적 예측 및 축소 모델
이는 다시 CatBoost 라이브러리에서 구현한 강력한 방법 중 하나입니다. 모델을 학습했고 특정 반복에서 모델이 어떻게 예측하는지 알고 싶습니다. staged_predict ( ) 메서드를 호출하여 해당 단계에서 모델이 어떻게 수행되는지 확인할 수 있습니다. 특정 단계에서 모델이 최종 학습된 모델보다 더 나은 성능을 보이는 것을 확인하면 shrink ( ) 메서드를 사용하여 모델을 해당 단계로 축소할 수 있습니다. 자세한 내용은 설명서를 확인하세요.
8. 다양한 상황 처리
축제 시즌이든 주말이든 평범한 하루이든, 모델은 주어진 모든 상황에서 최상의 결과를 예측해야 합니다. 다양한 교차 검증 데이터 세트에서 다양한 모델을 훈련하고 sum_models ( )를 사용하여 모든 모델을 혼합할 수 있습니다.
Catboost의 한계
- Sparse한 Matrix는 처리하지 못한다.
- 데이터 대부분이 수치형 변수인 경우 , Light GBM보다 학습 속도가 느리다. ( 즉 대부분이 범주형 변수인 경우 쓰라는 것이다 )
참고 링크 : https://hanishrohit.medium.com/whats-so-special-about-catboost-335d64d754ae, https://dailyheumsi.tistory.com/136
1. Level-wise Tree
XGBoost와 더불어 Catboost는 Level-wise로 트리를 만들어나갑니다.
Level-wise와 Leaf-wise의 차이는, 직관적으로 Level-wise는 BFS같이 트리를 만들어 나가는 형태이며, Leaf-wise는 DFS같이 트리를 만들어나가는 형태이며, 물론 max_depth = -1 이면서 둘은 같은 형태지만, 대부분의 부스팅 모델에서의 트리를 max_depth ≠ -1 이기 때문에 이 둘을 구분하는 것이다.
2. Orderd Boosting
Catboost는 기존의 부스팅 과정과 전체적인 양상은 비슷하지만 다르다.
기존의 boosting 모델이 일괄적으로 모든 훈련 데이터를 대상으로 잔차 계산을 했지만, Catboost는 일부만을 가지고 잔차 계산을 한 후, 이걸로 모델을 만들고, 그 뒤에 데이터의 잔차는 이 모델로 예측한 값을 사용한다.
아래는 그의 예시이다.
데이터에 시간이 없으면 Catboost는 각 데이터 포인트에 대해 무작위로 가상시간을 생성합니다.
기존의 부스팅 기법의 모든 데이터( x1 ~ x10 ) 까지의 잔차를 일괄 계산한다.
반면에 , Catbost의 과정은 아래와 같다
- 먼저 x1의 잔차만 계산하고, 이를 기반으로 모델을 만든다. 그리고 x2의 잔차를 이 모델로 예측한다.
- x1, x2의 잔차를 가지고 모델을 만단다. 이를 기반으로 x3, x4의 잔차를 모델로 예측한다.
- x1, x2 , x3, x4를 가지고 모델을 만들며, 이를 기반으로 x5, x6, x7, x8의 잔차를 모델로 예측한다.
- 반복한다.
3. Random Permutation
Catboost는 데이터를 셔플링하여 뽑아내며, 뽑아낼 때도 역시 모든 데이터를 뽑는게 아니라, 그 중 일부만 가져오게 할 수 있으며, 이 모든 기법이 다 오버피팅 방지를 위해, 트리를 다각적으로 만들려고 시도한다.
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 등이 있어왔는데, 이 시도 역시 이런 종류 중 하나라고 볼 수 있겠다.
5. Categorical Feauture Combinations
아래와 같은 예를 들어서 볼 수 있다.
country만 봐도 hair_color feature가 결정되기 때문에, class_label 을 예측하는데 있어, 두 feature 다 필요없이 이 중 하나의 feature 만 있으면 된다. Catboost 는 이렇게, information gain 이 동일한 두 feature 를 하나의 feature 로 묶어버린다. 결과적으로, 데이터 전처리에 있어 feature selection 부담이 조금 줄어든다고 할 수 있다.
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 이 더 효율적이라 그런 듯 하다.
7. Optimized Parameter tuning
Catboost 는 기본 파라미터가 기본적으로 최적화가 잘 되어있어서, 파라미터 튜닝에 크게 신경쓰지 않아도 된다고 한다. (반면 xgboost 나 light gbm 은 파라미터 튜닝에 매우 민감하다.) 사실 대부분 부스팅 모델들이 파라미터 튜닝하는 이유는, 트리의 다형성과 오버피팅 문제를 해결하기 위함인데, Catboost 는 이를 내부적인 알고리즘으로 해결하고 있으니, 굳이.. 파라미터 튜닝할 필요가 없는 것이다.
굳이 한다면 learning_rate, random_strength, L2_regulariser 과 같은 파라미터 튜닝인데, 결과는 큰 차이가 없다고 한다
다양한 상황에서의 CatBoosts
하이퍼 파라미터 튜닝은 CatBoost에 중요한 측면은 아니지만 , 가장 중요한 것은 우리가 해결하고 있는 문제에 따라 올바른 파라미터를 설정하는 것입니다. 몇 가지 중요한 상황은 다음과 같습니다
1. 데이터가 시간 경과에 따라 변경되는 경우
우리는 데이터 분포가 시간이 지남에 따라 무모하게 변하는 21 세기 에 살고 있습니다 . 특히 대부분의 인터넷 회사에서 사용자 선호도는 시간이 지남에 따라 변합니다. 현실 세계에서는 데이터가 시간이 지남에 따라 변하는 상황이 많습니다. CatBoost는 has_time = True 매개변수를 설정하여 이러한 상황에서 매우 잘 수행할 수 있습니다 .
2. 낮은 대기 시간 요구 사항
고객 만족은 모든 사업에서 가장 중요한 측면입니다. 사용자는 일반적으로 웹사이트/모델에서 매우 빠른 서비스를 기대합니다. CatBoost는 예측 시간이 매우 짧은 유일한 부스팅 알고리즘입니다. 대칭 트리 구조 덕분에 예측하는 동안 XGBoost보다 비교적 8배 빠릅니다 .
3. 데이터 포인트 가중치
특정 데이터 포인트에 더 많은 중요성을 부여해야 하는 상황이 있습니다. 특히 시간적 학습-테스트 분할을 수행할 때 모델은 대부분 이전 데이터 포인트에서 학습해야 합니다. 데이터 포인트에 더 많은 가중치를 부여하면 무작위 순열에서 선택될 가능성이 높아집니다.
매개변수를 설정하여 특정 데이터 포인트에 더 많은 가중치를 부여할 수 있습니다.
예를 들어, 모든 데이터 포인트에 선형 가중치를 부여할 수 있습니다.
샘플 가중치 = [ x 범위 내 x에 대한 x(train.shape[0])]
4. 소규모 데이터 세트 작업
데이터 포인트가 적지만 손실을 최소화해야 하는 경우가 있습니다. 이러한 상황에서는 매개변수 fold_len_multiplier를 1 에 가깝게 (>1이어야 함) 설정 하고 approx_on_full_history =True로 설정할 수 있습니다 . 이러한 매개변수를 사용하면 CatBoost는 다른 모델을 사용하여 각 데이터 포인트에 대한 잔차를 계산합니다.
5. 대용량 데이터세트 작업
대규모 데이터 세트의 경우 매개변수 task_type = GPU를 설정하여 GPU에서 CatBoost를 훈련할 수 있습니다 . 또한 다중 서버 분산 GPU도 지원합니다. CatBoost는 Google Colabs에서 훈련할 수 있는 이전 GPU도 지원합니다.
6. 모니터링 오류/손실 기능
모든 반복에 대해 모델을 모니터링하는 것은 매우 좋은 관행입니다. 매개변수 custom_metric= ['AUC', 'Logloss']를 설정하여 최적화 손실 함수와 함께 선택한 모든 메트릭을 모니터링할 수 있습니다 .
모니터링하기로 선택한 모든 메트릭을 시각화할 수 있습니다. Jupyter Notebook에서 플롯을 시각화하기 위해 pip를 사용하여 ipywidgets를 설치 하고 매개변수 plot = True를 설정했는지 확인하세요.
7. 단계적 예측 및 축소 모델
이는 다시 CatBoost 라이브러리에서 구현한 강력한 방법 중 하나입니다. 모델을 학습했고 특정 반복에서 모델이 어떻게 예측하는지 알고 싶습니다. staged_predict ( ) 메서드를 호출하여 해당 단계에서 모델이 어떻게 수행되는지 확인할 수 있습니다. 특정 단계에서 모델이 최종 학습된 모델보다 더 나은 성능을 보이는 것을 확인하면 shrink ( ) 메서드를 사용하여 모델을 해당 단계로 축소할 수 있습니다. 자세한 내용은 설명서를 확인하세요.
8. 다양한 상황 처리
축제 시즌이든 주말이든 평범한 하루이든, 모델은 주어진 모든 상황에서 최상의 결과를 예측해야 합니다. 다양한 교차 검증 데이터 세트에서 다양한 모델을 훈련하고 sum_models ( )를 사용하여 모든 모델을 혼합할 수 있습니다.
Catboost의 한계
- Sparse한 Matrix는 처리하지 못한다.
- 데이터 대부분이 수치형 변수인 경우 , Light GBM보다 학습 속도가 느리다. ( 즉 대부분이 범주형 변수인 경우 쓰라는 것이다 )
참고 링크 : https://hanishrohit.medium.com/whats-so-special-about-catboost-335d64d754ae, https://dailyheumsi.tistory.com/136
1. Level-wise Tree
XGBoost와 더불어 Catboost는 Level-wise로 트리를 만들어나갑니다.
Level-wise와 Leaf-wise의 차이는, 직관적으로 Level-wise는 BFS같이 트리를 만들어 나가는 형태이며, Leaf-wise는 DFS같이 트리를 만들어나가는 형태이며, 물론 max_depth = -1 이면서 둘은 같은 형태지만, 대부분의 부스팅 모델에서의 트리를 max_depth ≠ -1 이기 때문에 이 둘을 구분하는 것이다.
2. Orderd Boosting
Catboost는 기존의 부스팅 과정과 전체적인 양상은 비슷하지만 다르다.
기존의 boosting 모델이 일괄적으로 모든 훈련 데이터를 대상으로 잔차 계산을 했지만, Catboost는 일부만을 가지고 잔차 계산을 한 후, 이걸로 모델을 만들고, 그 뒤에 데이터의 잔차는 이 모델로 예측한 값을 사용한다.
아래는 그의 예시이다.
데이터에 시간이 없으면 Catboost는 각 데이터 포인트에 대해 무작위로 가상시간을 생성합니다.
기존의 부스팅 기법의 모든 데이터( x1 ~ x10 ) 까지의 잔차를 일괄 계산한다.
반면에 , Catbost의 과정은 아래와 같다
- 먼저 x1의 잔차만 계산하고, 이를 기반으로 모델을 만든다. 그리고 x2의 잔차를 이 모델로 예측한다.
- x1, x2의 잔차를 가지고 모델을 만단다. 이를 기반으로 x3, x4의 잔차를 모델로 예측한다.
- x1, x2 , x3, x4를 가지고 모델을 만들며, 이를 기반으로 x5, x6, x7, x8의 잔차를 모델로 예측한다.
- 반복한다.
3. Random Permutation
Catboost는 데이터를 셔플링하여 뽑아내며, 뽑아낼 때도 역시 모든 데이터를 뽑는게 아니라, 그 중 일부만 가져오게 할 수 있으며, 이 모든 기법이 다 오버피팅 방지를 위해, 트리를 다각적으로 만들려고 시도한다.
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 등이 있어왔는데, 이 시도 역시 이런 종류 중 하나라고 볼 수 있겠다.
5. Categorical Feauture Combinations
아래와 같은 예를 들어서 볼 수 있다.
country만 봐도 hair_color feature가 결정되기 때문에, class_label 을 예측하는데 있어, 두 feature 다 필요없이 이 중 하나의 feature 만 있으면 된다. Catboost 는 이렇게, information gain 이 동일한 두 feature 를 하나의 feature 로 묶어버린다. 결과적으로, 데이터 전처리에 있어 feature selection 부담이 조금 줄어든다고 할 수 있다.
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 이 더 효율적이라 그런 듯 하다.
7. Optimized Parameter tuning
Catboost 는 기본 파라미터가 기본적으로 최적화가 잘 되어있어서, 파라미터 튜닝에 크게 신경쓰지 않아도 된다고 한다. (반면 xgboost 나 light gbm 은 파라미터 튜닝에 매우 민감하다.) 사실 대부분 부스팅 모델들이 파라미터 튜닝하는 이유는, 트리의 다형성과 오버피팅 문제를 해결하기 위함인데, Catboost 는 이를 내부적인 알고리즘으로 해결하고 있으니, 굳이.. 파라미터 튜닝할 필요가 없는 것이다.
굳이 한다면 learning_rate, random_strength, L2_regulariser 과 같은 파라미터 튜닝인데, 결과는 큰 차이가 없다고 한다
다양한 상황에서의 CatBoosts
하이퍼 파라미터 튜닝은 CatBoost에 중요한 측면은 아니지만 , 가장 중요한 것은 우리가 해결하고 있는 문제에 따라 올바른 파라미터를 설정하는 것입니다. 몇 가지 중요한 상황은 다음과 같습니다
1. 데이터가 시간 경과에 따라 변경되는 경우
우리는 데이터 분포가 시간이 지남에 따라 무모하게 변하는 21 세기 에 살고 있습니다 . 특히 대부분의 인터넷 회사에서 사용자 선호도는 시간이 지남에 따라 변합니다. 현실 세계에서는 데이터가 시간이 지남에 따라 변하는 상황이 많습니다. CatBoost는 has_time = True 매개변수를 설정하여 이러한 상황에서 매우 잘 수행할 수 있습니다 .
2. 낮은 대기 시간 요구 사항
고객 만족은 모든 사업에서 가장 중요한 측면입니다. 사용자는 일반적으로 웹사이트/모델에서 매우 빠른 서비스를 기대합니다. CatBoost는 예측 시간이 매우 짧은 유일한 부스팅 알고리즘입니다. 대칭 트리 구조 덕분에 예측하는 동안 XGBoost보다 비교적 8배 빠릅니다 .
3. 데이터 포인트 가중치
특정 데이터 포인트에 더 많은 중요성을 부여해야 하는 상황이 있습니다. 특히 시간적 학습-테스트 분할을 수행할 때 모델은 대부분 이전 데이터 포인트에서 학습해야 합니다. 데이터 포인트에 더 많은 가중치를 부여하면 무작위 순열에서 선택될 가능성이 높아집니다.
매개변수를 설정하여 특정 데이터 포인트에 더 많은 가중치를 부여할 수 있습니다.
예를 들어, 모든 데이터 포인트에 선형 가중치를 부여할 수 있습니다.
샘플 가중치 = [ x 범위 내 x에 대한 x(train.shape[0])]
4. 소규모 데이터 세트 작업
데이터 포인트가 적지만 손실을 최소화해야 하는 경우가 있습니다. 이러한 상황에서는 매개변수 fold_len_multiplier를 1 에 가깝게 (>1이어야 함) 설정 하고 approx_on_full_history =True로 설정할 수 있습니다 . 이러한 매개변수를 사용하면 CatBoost는 다른 모델을 사용하여 각 데이터 포인트에 대한 잔차를 계산합니다.
5. 대용량 데이터세트 작업
대규모 데이터 세트의 경우 매개변수 task_type = GPU를 설정하여 GPU에서 CatBoost를 훈련할 수 있습니다 . 또한 다중 서버 분산 GPU도 지원합니다. CatBoost는 Google Colabs에서 훈련할 수 있는 이전 GPU도 지원합니다.
6. 모니터링 오류/손실 기능
모든 반복에 대해 모델을 모니터링하는 것은 매우 좋은 관행입니다. 매개변수 custom_metric= ['AUC', 'Logloss']를 설정하여 최적화 손실 함수와 함께 선택한 모든 메트릭을 모니터링할 수 있습니다 .
모니터링하기로 선택한 모든 메트릭을 시각화할 수 있습니다. Jupyter Notebook에서 플롯을 시각화하기 위해 pip를 사용하여 ipywidgets를 설치 하고 매개변수 plot = True를 설정했는지 확인하세요.
7. 단계적 예측 및 축소 모델
이는 다시 CatBoost 라이브러리에서 구현한 강력한 방법 중 하나입니다. 모델을 학습했고 특정 반복에서 모델이 어떻게 예측하는지 알고 싶습니다. staged_predict ( ) 메서드를 호출하여 해당 단계에서 모델이 어떻게 수행되는지 확인할 수 있습니다. 특정 단계에서 모델이 최종 학습된 모델보다 더 나은 성능을 보이는 것을 확인하면 shrink ( ) 메서드를 사용하여 모델을 해당 단계로 축소할 수 있습니다. 자세한 내용은 설명서를 확인하세요.
8. 다양한 상황 처리
축제 시즌이든 주말이든 평범한 하루이든, 모델은 주어진 모든 상황에서 최상의 결과를 예측해야 합니다. 다양한 교차 검증 데이터 세트에서 다양한 모델을 훈련하고 sum_models ( )를 사용하여 모든 모델을 혼합할 수 있습니다.
Catboost의 한계
- Sparse한 Matrix는 처리하지 못한다.
- 데이터 대부분이 수치형 변수인 경우 , Light GBM보다 학습 속도가 느리다. ( 즉 대부분이 범주형 변수인 경우 쓰라는 것이다 )
참고 링크 : https://hanishrohit.medium.com/whats-so-special-about-catboost-335d64d754ae, https://dailyheumsi.tistory.com/136