본문 바로가기
AI SCHOOL/TIL

[DAY 60] CatBoost, 하이퍼파라미터 튜닝

2023. 3. 22.

부스팅 알고리즘 중 CatBoost에 대해 배우고 이를 캐글 회귀 문제에 활용했다.

좋은 성능을 내기 위해 randomized search를 통해 하이퍼파라미터를 튜닝했다.

CatBoost

러시아의 Yandex에서 개발한 오픈소스 라이브러리
Decision Tree 기반의 부스팅 알고리즘
XGBoost와 LightGBM에 비해 최근에 발표되었다

catboost


장점
과적합을 극복하기 위해 부스팅 정렬
categorical 변수에 대한 처리 지원
Oblivious Trees 또는 Symmetric Trees 사용으로 처리 속도 향상

단점
희소 행렬을 지원하지 않는다
수치형 변수가 많은 데이터셋일 경우 많은 시간 소요

어제 XGBoost, LightGBM을 이용했던 메르세데스 벤츠 생산 공정 소요 시간 예측 경진대회를 CatBoost를 이용하여 경험해 본다.

데이터 준비

train = pd.read_csv('train.csv', index_col="ID")
test = pd.read_csv('test.csv', index_col="ID")
submission = pd.read_csv('sample_submission.csv', index_col="ID")

train.shape, test.shape, submission.shape

# 실행 결과
((4209, 377), (4209, 376), (4209, 1))

어제(DAY 59)와 중복된 과정인 데이터셋 특징 확인, EDA, 편향성 확인 등의 과정은 생략한다.

사용하지 않는 컬럼은 제거하고, 원핫인코딩을 완료하여 데이터를 확인하면 아래와 같다.

X = df_train_enc.copy()
y = train['y'].copy()
X_test = df_test_enc.copy()
X.shape, y.shape, X_test.shape

# 실행 결과
((4209, 533), (4209,), (4209, 533))

 

학습, 예측, 제출

라이브러리 로드

import catboost
from scipy.stats import randint
from sklearn.utils.fixes import loguniform


모델 생성

model_cat = catboost.CatBoostRegressor(eval_metric='R2')

catboost 회귀 알고리즘의 기본 metric인 RMSE가 아닌 R2를 사용

하이퍼파라미터 튜닝

param_grid = {
    'n_estimators': randint(100, 300),
    'depth': randint(1, 5),
    'learning_rate': loguniform(1e-3, 0.1),
    'min_child_samples': randint(10, 40),
    'grow_policy': ['SymmetricTree', 'Lossguide', 'Depthwise']
}

랜덤서치에 사용할 param_grid 정의

model_cat.randomized_search(param_grid,
                            X_train, y_train,
                            cv=3, n_iter=10)

사이킷런의 랜덤서치는 함수 안에 모델을 넣는 방식으로 동작하지만, CatBoost에서는 모델의 메소드로 동작하여 모델 자체가 랜덤서치를 통해 하이퍼파라미터 튜닝이 된 상태로 바뀐다.

모델 학습

model_cat.fit(X, y)

validation 과정을 거치지 않을 것이므로 train, valid로 분할하지 않은 전체 데이터를 학습시켰다.
모델의 성능이 더 좋게 나올 것을 기대했다.

예측과 제출

y_pred_cat = model_cat.predict(X_test)
submission["y"] = y_pred_cat
submission.to_csv('catboost.csv')

X_test에 대한 예측값 y_pred_cat을 얻어 submission의 y컬럼에 대입했다.
그 후 catboost.csv로 저장하여 파일을 캐글에 제출했다.

submisson
제출 결과

결과 Private Score 0.55003을 확인했다. 3823팀 중 1094등에 대응되는 점수로, 현재까지 해당 competition에서 얻은 점수 중 가장 높았다. randomized_search를 통한 하이퍼파라미터 튜닝과 분할하지 않은 데이터셋을 학습시킨 이유로 좋은 결과를 얻은 것 같다.


이후 LightGBM과 CatBoost에 category형 데이터를 인코딩하지 않고 그대로 학습시킬 수 있다는 사실을 확인했다. 두 방식의 모델은 데이터에 범주형 변수가 많을 때 유용하게 활용될 수 있을 것 같다.

반응형

댓글