2023.10.15 ~ 2023.10.24 약 9일 동안 참여한 대회에 대한 회고이다.
원래는 대회별로 깃허브에 기록 남기기를 지향했지만 캐글 노트북에서만 진행하다 보니 일일이 버전기록을 남기는 게 쉽지 않았다. 백준 허브처럼 자동으로 커밋되면 좋을 것 같아서 찾아봤지만 그런 것은 없었다.
그러던 중 이것이 정책위반이 될 수도 있다는 놀라운 사실을 알게 됐다...!
진행 중인 대회의 풀 코드를 공유할 시 위반이라는 것.
그래서 어떻게든 깃허브에 올릴 생각은 쏙 넣어두고 대회에만 집중하기로 했다.
그냥 나중에 대회 끝나고 이렇게 정리하는게 훨씬 나은듯하다.
■ 개인 목표 및 동기
지난 캐글 대회에서 쓰라린 shakedown을 당하고 캐글에 대한 공부가 좀 더 필요함을 느꼈다.
그리하여 Playground Episode 23이 진행되는 동안 폐관수련을 거듭하기로 결정했고 다음 대회에서는 구글 부트캠프의 수료조건뿐만 아니라 특별 추가 선물(Top 5% 이내)을 받는 것을 목표로 설정하는 등, 비장한 자세로 대회에 임했다.
아래 글도 폐관 수련 기간에 작성한 것이다.
2023.10.07 - [머신러닝/캐글캐글] - [캐글] 문과 학부생이 캐글 그랜드마스터가 되기까지
그리하여 쓰게 된 모집글.
이전에 했던 팀원들에게 먼저 제안을 했었지만 회신이 돌아오지 않았었기에...
■ 대회 소개
Binary Classification with a Software Defects Dataset | Kaggle
이진분류 문제로, 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이 넘어가기도 하고 -(마이너스) 값도 존재해서 뭔가 이상하긴 했다.
어찌됐든 그리하여 이룩한 점수는 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 매우 많이 해봄)
아쉬운 것은 항상 있지만 이번 대회는 캐글에 대한 자신감을 심어준 대회로, 나의 캐글은 이 대회를 전후로 달라진다고 해도 과언이 아닐듯하다. 앞으로도 캐글 많이 애용해야지😎
'AI 배우기 > 캐글캐글' 카테고리의 다른 글
캐글 대회 회고: Binary Prediction of Smoker Status using Bio-Signals (with GMB) (1) | 2024.01.31 |
---|---|
캐글 대회 회고: Improve a Fixed Model the Data-Centric Way! (with GMB) (1) | 2024.01.06 |
첫 캐글 대회 회고: ICR - Identifying Age-Related Conditions (with 풀잎스쿨) (1) | 2023.11.26 |
[캐글] 문과 학부생이 캐글 그랜드마스터가 되기까지 (1) | 2023.10.07 |