ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ML] Catboost train & valid metric
    인공지능 2022. 4. 15. 01:31
    728x90

     

    부스트캠프를 진행하며, Catboost를 추천시스템에 활용할 기회가 생겼다. 

    Catboost는 ML 라이브러리인 sklearn과 같은 방식으로 학습과 예측을 실행하면 됐는데 한가지 아쉬운점이 있었다.

    학습(training)과정을 반복(iteration) 할때마다 validition metric을 보고 몇번의 itertation이 최적인지, 그 값을 wandb에 업로드를 하고 싶었지만, 설정을 따로 해줘야 했는데, 어떻게 코드를 짜야하는지 알지 못했다.

    열심히 공식 문서를 뒤져봐도 확실한 예제를 못찾았지만, 공식 github의 가이드문서로 사용법을 알게 됐고, 이를 정리하게 되었다.

    catboost의 Classifier를 기준으로 설명하겠다.

    sklearn과 마찬가지로, 우선 Catboost의 객체를 생성해줘야 하는데, 이때 CatboostClassifier는 기본 metric으로 Logloss 만 측정한다. 

    model = CatBoostClassifier(iterations=2,
                               task_type="GPU",
                               devices='0:1',
                               random_seed=42)
    fit_model = model.fit(X_train,
              y_train,
              cat_features,
              verbose=True) # True로 바꿔줘야 학습 결과가 모두 출력됨

    이때 출력되는 learn은 Logloss 를 출력하고 있다. 이제 loss function을 "CrossEntropy"로 바꾸고, 학습중 validation dataset을 통해 결과를 출력해보자.

    model = CatBoostClassifier(iterations=10,
                               task_type="GPU",
                               devices='0:1',
                               loss_function="CrossEntropy", # Loss를 CrossEntorpy로 변경
                               random_seed=42,
                               # Binary Classification에 해당하는 metric들 추가
                               custom_loss=["AUC" , "Accuracy", "Recall", "Precision"])
                               
    fit_model = model.fit(X = X_train,
              y = y_train,
              cat_features = cat_features,
              eval_set=(X_test, y_test), # train과 동시에 eval을 하기위해 valid set 지정
              verbose=True)

     

    custom_loss 옵션에 추가로 활용할 metric을 작성해주면 된다. 

    위의 코드의 경우, 이진분류의 상황이였고, 그애 따라서 AUC, Accuracy, Recall, Precision 과 같은 metric도 함께 측정하게 하였다.

    공식문서에는 이진분류 뿐만 아니라 다양한 경우(회귀, 랭킹)에서의 metric도 지원하므로 필요에 따라서 사용할 수 있다고 한다. 

    하지만 위의 캡쳐본처럼, Loss만 표시될뿐, 추가한 metric은 보이지 않는다. 이때 이하의 메서드를 실행하면 추가한 metric들이 나타난다.

    model.get_evals_result()

    metric은 dict 타입으로 나오는데, 이때 각각 ['learn', 'validation']을 적어주면 train 단계에서의 metric과, validation 단계의 metric이 출력된다.

    model.get_evals_result()['validation'] # validation set의 metric 출력

    Recall, Accuarcy만 보이게 캡쳐

    이제 원하는 지표를 얻어냈고, 이를 wandb에 올리는 작업을 할려고 한다.


    출처

    https://github.com/catboost/catboost/blob/master/catboost/tutorials/classification/classification_tutorial.ipynb

    '인공지능' 카테고리의 다른 글

    [ML] Catboost wandb에 로그 올리기  (0) 2022.05.22

    댓글

Designed by Tistory.