캐글 대회 회고: Binary Classification with a Software Defects Dataset (with GMB)

2023.10.15 ~ 2023.10.24 약 9일 동안 참여한 대회에 대한 회고이다.

원래는 대회별로 깃허브에 기록 남기기를 지향했지만 캐글 노트북에서만 진행하다 보니 일일이 버전기록을 남기는 게 쉽지 않았다. 백준 허브처럼 자동으로 커밋되면 좋을 것 같아서 찾아봤지만 그런 것은 없었다.

 

그러던 중 이것이 정책위반이 될 수도 있다는 놀라운 사실을 알게 됐다...!

진행 중인 대회의 풀 코드를 공유할 시 위반이라는 것.

그래서 어떻게든 깃허브에 올릴 생각은 쏙 넣어두고 대회에만 집중하기로 했다.

그냥 나중에 대회 끝나고 이렇게 정리하는게 훨씬 나은듯하다.

 


 

■ 개인 목표 및 동기

지난 캐글 대회에서 쓰라린 shakedown을 당하고 캐글에 대한 공부가 좀 더 필요함을 느꼈다.

그리하여 Playground Episode 23이 진행되는 동안 폐관수련을 거듭하기로 결정했고 다음 대회에서는 구글 부트캠프의 수료조건뿐만 아니라 특별 추가 선물(Top 5% 이내)을 받는 것을 목표로 설정하는 등, 비장한 자세로 대회에 임했다.

아래 글도 폐관 수련 기간에 작성한 것이다.

2023.10.07 - [머신러닝/캐글캐글] - [캐글] 문과 학부생이 캐글 그랜드마스터가 되기까지

 

[캐글] 문과 학부생이 캐글 그랜드마스터가 되기까지

자료 출처: https://youtu.be/TwF2EB9UCsI?si=TSwClVyazRngfV_h ■ 발표자 소개 - 김윤수, 서울대 경제 / 인공지능 전공 학부생 캐글 그랜드마스터 캐글 최고 랭킹 22위 - 개인 공부법 인터넷을 통해서 최신 정보

refine-thinking.tistory.com

 

그리하여 쓰게 된 모집글.

이전에 했던 팀원들에게 먼저 제안을 했었지만 회신이 돌아오지 않았었기에...

 


 

■ 대회 소개

Binary Classification with a Software Defects Dataset | Kaggle

 

Binary Classification with a Software Defects Dataset | Kaggle

 

www.kaggle.com

이진분류 문제로, C언어로 구성된 프로그램의 코드를 정형 데이터로 수치화한 데이터셋을 이용하여 결함을 예측한 값을 제출하는 것이었다. 평가 지표는 예측값과 타겟 데이터 간의  area under the ROC curve로 점수를 매겼다. 

이 역시 Playground답게 원본 데이터셋이 있었지만 이때 당시엔 활용하진 않았었다.

Software Defect Prediction (kaggle.com)

 


 

■  진행 과정

베이스라인에 대한 힌트를 얻고 나서부터는 빠르게 달려 나갔다.

일단 간단한 버전의 베이스라인을 얻고 나니 그다음부터는 쉬웠던 것 같다.

베이스라인을 생성한다는 것은 이 대회에서 다루는 이진 분류 task의 방식을 이해하고 내가 쓰기 편한 상태의 노트북을 생성하는 것으로, 이후 다른 공유 노트북이나 disucussion의 방법들을 내 코드에 적용시키기에도 편했다. 

 

그리하여 시작된 엄청난 공방...!

가장 간단한 것에서 출발하다보니 점수 올리는 맛이 아주 달달했고,

이것저것 적용시켜보면서 캐글에 대한 재미가 붙기 시작했다.

 

게다가 팀원들 또한 매우 열정적이라 최소한 1일 1 제출로 내건 슬로건은 오히려 제한하는 정도에 이르렀다. 왜냐면 개인이어도 팀이어도 제출 횟수는 1일 5회로 일치하기 때문에 1명씩만 제출해도 2회밖에 남지 않는다. 다만 모두 열정 넘치다 보니 하루에도 여러 번 제출하여 다른 팀원이 제출할 기회를 앗아가 버리기도 했다.

그야말로 열정열정열정 팀원들...!

내 제출 횟수를 사수하기 위한 (?) 경쟁의식과 함께 굉장히 좋은 동기부여를 가져다주는 팀을 만나게 되어 행복했다.

(팀 병합을 나중에 하면 되지 않느냐 하겠지만 대회 참여 기간 동안 팀원들이 제출한 횟수가 팀이 제출할 수 있는 횟수를 넘기면 병합 자체가 되지 않는다)

열심히 디벨롭한 흔적

 

이때 당시 GridSearchCV, Optuna, K-Fold, Ensembel 등등의 방법들을 처음 써보면서 누가 떠먹여주는 것 없이 스스로 찾은 방법들이 하나하나 내 베이스라인에 쌓여나가는 게 그렇게 뿌듯할 수 없었다.

 

추가로 TabNet이라는 정형데이터에 쓰기 좋은 NN 모델도 사용해봤는데 결과는 뭐 그냥저냥😅

 


 

■ 결과 및 평가

최종 제출한 노트북은

총 10개의 모델을 각각에 맞는 스케일링과 파이프라인으로 묶은 다음 힐클라이밍 앙상블로 최종 예측값을 생성했다.

# 대충  요렇게 했다는 뜻
log_transformer = FunctionTransformer(np.log1p)
pipelines = {"Random Forest": make_pipeline(log_transformer,
                              MinMaxScaler(),
                              RandomForestClassifier(**opt_rf_params))}

 

힐클라이밍 앙상블은 모델 각각의 예측값을 이용하여 가중치를 조절하여 최적의 조합을 찾는 과정을 반복하는 방법으로, 원래는 각 모델의 예측값을 제출하면 RidgeClassifier라는 모델을 통해 모델별 가중치를 쉽게 뽑아내어 voting으로 soft 앙상블 하는 과정을 이용했었다. 하지만 나중에 힐클라이밍을 알게 된 후  fold별로 앙상블 하는 과정도 있는 힐클라이밍 앙상블이 더 안정적으로 성능을 보여 이것을 채택했다.

모델로 가중치 뽑는 방식은 각 가중치를 합치면 1이 넘어가기도 하고 -(마이너스) 값도 존재해서 뭔가 이상하긴 했다.

모델(RidgeClassifier)로 모델별 가중치를 생성하는 모습

 

어찌됐든 그리하여 이룩한 점수는 Private LB 0.79397을 기록하며 Top 10%에 랭킹 됐다.

특별 선물 조건은 충족하지 못했지만 처음으로 온전한 내 결과물을 평가받은 것 같아서 기분은 좋았다.

 

다만 하나 놀라웠던 것은 제출한 두 개 예측값의 Private LB가 역전됐다는 것이다.

비슷한 방식의 점수 1,2등 파일을 제출하기보다 일부러 방향성을 다르게 하기 위해 이렇게 제출했었는데

작은 shakeup이 일어나 팀에게 설명할 수 있는 좋은 교훈을 알려줄 수 있어서 뜻깊은 시간이었다.

 


 

■ 대회에서 얻은 인사이트

- random seed는 꼭 고정해서 쓰자

  • 랜덤으로 생긴 오차를 좋다고 픽하지 말자!
  • 동일한 seed에서 방법을 바꿔야 성능 향상을 믿을 수 있다!

- NN이 능사는 아니다

  • NN에 속아 트리 모델을 잃지 말자!

- 리더보드에 집착하지 말자

  • shakeup을 경계하고 있어도 현혹되는 게 리더보드
  • shakeup이 없을 것 같다고 해도 cv-public 상관관계를 보는 것은 중요

- 통계 공부는 필수

  • 겉핥기로 배운 통계도 엄청 도움이 됐다. (이때 패캠 Upstage AI에서 통계에 대해 공부하던 때였다)
  • 통계를 더욱 공부한다면... 이 대회... 리더보드에선 어떨까?

- Feature selection이 능사는 아니다

  • 상관관계를 줄이고 싶다면 PCA, t-SNE 등등 다른 방법도 생각해 보자!
  • 지금 생각해 보면 달리 생성한 feature도 없고 원래의 feature 수도 매우 적기에 Feature Selection은 그렇게 효율적이지는 않은 것 같다.

- Feature Engineering을 하자

  • 이번 대회에서 데이터셋 쪽은 해봤자 스케일링 정도만 건드렸다. 왜도 정도만 잡은 것..?
  • 하지만 여러 라이브러리를 활용하여 모델링을 화려히 해도 점수의 판가름은 FE에서 나온다는 중요한 사실  

 


 

■  후기 및 소감

막판에 밤을 새우며 UTC+0시 (한국시간 오전 9시)까지 달렸는데 막판에 타이밍을 놓쳐 제출하지 못한 게 아쉬웠다.

나중에 보니 Private LB 0.79402를 기록하며 미세한 성능 향상이 있긴 했지만 10등 정도 오르는 정도라 이 부분은 크게 아쉽진 않았다. 

하지만 제일 아쉬운 것은 Feature Engineering을 많이 못해본 것으로, 그때는 한창 모델링해보는 것에 빠져 EDA를 등한시했던 게 점수를 많이 올리지 못한 요인이었다. (살짝 스포 하자면 다음 대회는 Feature Engineering 매우 많이 해봄)

 

아쉬운 것은 항상 있지만 이번 대회는 캐글에 대한 자신감을 심어준 대회로, 나의 캐글은 이 대회를 전후로 달라진다고 해도 과언이 아닐듯하다. 앞으로도 캐글 많이 애용해야지😎