활동/2024 LG Aimers

[LG Aimers] 4기 Phase2 AI 해커톤 후기

김evelyn 2024. 3. 9. 18:49

✏️ LG Aimers란?

https://www.lgaimers.ai/

LG Aimers는 LG의 청년 AI 인재 양성 프로그램으로,
이론 교육뿐 아니라 산업 현장에서 발생하는 실제 데이터와 문제를 활용해 해결 능력을 키울 수 있는 기회를 제공합니다.

 

지난 12월에 신청해서 1월에는 AI 강의를 듣고(Phase1), 2월에는 한 달간 온라인 해커톤을 진행했다(Phase2). 신청 때에는 다른 지원서가 필요하지 않다. 간단한 인적사항만 작성하면 지원 완료가 되고, 교육대상에 위배되지 않는 이상 모두 합격하는 것 같다. 

 

나는 이번 기회에 처음 AI 해커톤에 참여해보았다. 해커톤 주제에 대한 기본적인 지식을 영상을 통해 설명을 들었다. 이해가 잘 되었고, 외주 받는 기분이었다! '이런저런 사항을 고려해 이런 고객을 찾는 AI 모델을 만들어 주세요~'하고 외주 받는 것 같았다. 우테코 때에도 느꼈지만 이렇게 주어진 문제상황을 해결하는 문제는 정말 재밌다.😉

 

Phase2는 예선 같은 단계로, 이 한달간의 해커톤에서 상위 30위권의 팀들이 3월에 진행되는 Phase3, 오프라인 해커톤에 참여할 수 있다. Baseline 점수는 0.52이고 Phase2 수료만이 목표라면 이 baseline만 넘으면 된다.

 

주최 측에 블로그 게시에 대해 문의한 결과 해커톤 문제는 업로드를 삼가 달라고 하셔서 문제나 구체적인 접근 방식을 올리기보다는 후기 형식으로 업로드하려 한다. 코드는 깃허브에 업로드해 놓을 예정이다.

 

✏️  한달간 진행된 해커톤

 

사실 지난 한 달간 내내 이 해커톤만 보고 있었다고 해도 과언이 아닐 만큼 빠져서 진행했었다. AI 해커톤이 처음이라 머신러닝 모델을 처음 조합해 보았다. 이전까지 딥러닝 모델만 구현해 봤던 나로서는 간단하면서도(스킷런 라이브러리만 가져다 썼으니..) 예민한 머신러닝 모델에 흥미를 가지게 되었다. (그래서 돌아오는 학기에 기계학습 전공을 수강하기로 했다ㅎㅎ) 결측치 처리하는 부분부터 데이터를 분석하고 모델을 구현하고, 파라미터를 조정하는 일련의 과정에서 너무 많은 것들을 배웠다. 

 

2023 회고에서 작성했던 것처럼

여름방학 동안 AI 부트캠프에서 공부하면서 선형대수학 지식이 부족함을 알게됨 -> 돌아오는 학기에 선형대수학 전공을 수강함 -> 겨울방학 동안 AI 해커톤 진행했는데 머신러닝 모델을 더 공부하고 싶음 -> 돌아오는 학기 기계학습 전공을 수강함

 

위와 같은 사이클이 반복될 때마다 너무 즐겁다. 내가 직접 코드로 먼저 부딪혀보고 이후 전공지식을 통해 더 견고하게 만들어가는 과정이!

 

✏️  혼자 진행하면서 나아간 부분

 

로지스틱 회귀부터 시작해서 이것저것 트리 기반 모델까지 적용시켜봤다. 가장 성능이 좋았던 모델은 트리 기반 모델들이었다. 해당 데이터셋이 데이터 불균형이 심해서 트리 기반 모델 중에서도 RandomForestClassifier를 사용해 성능을 올리려 노력했다. 데이터 불균형 때문에 샘플링도 진행해보려 했지만 그렇게 하니 오버피팅이 너무 심했다. 이후에는 RandomForestClassifier에 GradientBoostingClassifier를 Voting 기반의 앙상블 모델 구현해 Public Score 0.67까지 올릴 수 있었다.

 

일단 여기서의 문제점은 데이터 전처리를 아예 진행하지 않았다는 것이었다.

모델들을 대강 구현해놓고 성능을 확인한 다음에 데이터 전처리를 하려 했는데.. 모델 구현이 재밌어서 바로 앙상블 모델 구현부터 시작했ㄷ..ㅏ.. 처음 진행한 AI 해커톤이라 그런가 이런 부분에서 많이 부족했던 것 같다. 

 

✏️  팀빌딩 이후 팀원과 발전한 부분

 

데이터 분석, 처리 등을 아예 진행하지 않은 상태에서 팀빌딩을 진행했다. 이후 팀원과 데이터 전처리를 진행하며 점수가 크게 상승했다!

8~9일 정도는 내내 데이터를 보면서 데이터 전처리만 했었다. 결론적으로는 팀원분이 만들어주신 LightGBM 모델과 앙상블 위에 나의 AdaBoostClassifier와 CatBoostClassifier 모델을 결합해 좋은 점수를 낼 수 있었다. 

 


🏆 결과

Public 22위, Private 37위를 기록했다..!😢

최종적으로 상위 4.38%를 기록했다. 정말 아쉽게 Phase 3 진출이 가능한 30위 안에 들지 못했다.

 

🧐 아쉬웠던 점

 

당연히 Public에서는 30위권 내였는데, Private에서는 30위권 밖으로 나온 것이 많이 아쉽다. 문제점을 찾아봤다.

 

1. B2B 마케팅에 대한 전공적인 공부를 따로 진행하지 않았다는 점. 

해커톤 주제 설명 영상에서 B2B 마케팅에 대해 공부해보라는 힌트가 있었던 것 같은데, 모델 만드는 데에만 급급해서 따로 공부하지 않았다. 공부를 진행했다면 피처 엔지니어링에서 좋은 시각을 얻었을 수도 있을 것 같은데.. 이 부분이 일차적으로 정말 아쉽다. 

 

실제로 피처 엔지니어링의 정의는 '머신러닝 알고리즘을 작동하기 위해 데이터의 도메인 지식을 활용해 특징(feature)을 만드는 과정'인데 정의와는 다르게 나는 데이터의 도메인 지식을 활용하지 않았다. 

 

2. Public과 Private 리더보드 순위에 대해.

 

- 데이터 전처리에서의 미숙함

 

Public 보다 Private 리더보드에서 사실 점수가 많이 상승했다. 그럼에도 불구하고 22위에서 37위로 밀려난 것은 오버피팅 때문이 아닐까 생각이 든다. 더 Robust한 모델을 만들었어야 했는데. 오버피팅이 발생했던 이유는 데이터 전처리가 미숙했어서가 아닐까 싶다.

피처 엔지니어링을 시도했는데 이상한 값이랑 같이 묶였을수도 있고.. 너무 지엽적으로 묶였을 수도 있고..

 

- 오버피팅!?

 

다른 팀들보다도 일반화에 처참하게 실패했다고 생각한다. 처음에는 train_test_split의 비율에서 문제가 있었다고 생각했다. 이후 교수님께 자문을 구하니 split한 비율보다도, train 셋과 validation 셋을 모델을 돌렸을 때, train 셋의 성능은 좋아지는데 validation 셋의 성능은 낮아지는 그 지점을 확실하게 확인해야 한다는 답변을 받았다. 그 지점이 오버피팅 시작점이라고 한다. 이후 챌린지들에서는 이 부분을 더 유심히 보려 한다!

 

🧐 개선해야 할 점 & 배운 점

결측치 확인하고

결측치 처리 방법론들을 모두 적용해보면서 가장 성능 좋은 방법을 찾고

데이터셋을 분석하고 (시각화도 이것저것 시도해 보고)

중요도가 낮은 피처는 삭제하고

피처 엔지니어링을 통해 피처를 깔끔하게 정리하고

이진 분류 모델을 이것저것 적용해 보고

하이퍼파라미터를 조정하는 GridSearchCV를 사용해 보고

Cross-Validation과 KFold도 적용시켜 보고 

팀원의 모델과 내 모델을 앙상블로 결합해 보고

이후에도 다른 모델들도 결합하고

하이퍼파라미터를 또 다르게 조절해 보는 과정에서

정말 너무 많이 배운 것 같다. 

 

이 경험으로 AI 해커톤에도 관심이 생겼고, 현재는 DACON과 Kaggle도 찾아보고, 참여해보고 있다.

 

사실 수치로만 확인했을 때 Public 점수보다 Private 점수가 0.07 정도 더 높았다.

사실 종료 직전에 Public 등수가 항상 10위권이던 팀이 Public Score 리더보드 40위권으로 떨어져 있는 것을 보았다. 해당 팀은 대회 내내 상위권을 차지하고 있었기 때문에 더욱 의문스러웠다. 제출이 완료되고 Private Score 점수를 확인해 보니 그 이유를 알 수 있었다. 그 팀이 Private 리더보드 10위권에 위치해 있었다. Private Score를 높이기 위한 전략이 있었던 것 같다. 어떻게 그렇게 Robust한 모델을 만들었는지 아직도 의문이다. 메일 보내서 여쭙고 싶을 정도..

 

test 데이터셋에서도 강건한 모델을 만들기 위해 노력해야 함을 절실히 깨달았다. 다음에 기회가 있다면 이 부분에 더 집중해야겠다. 

어제부로 Phase2 코드 검증 기간이 끝나 팀원과 마지막 인사를 나눴다. 오히려 내가 배운 것이 훨씬 많은데도 좋은 말씀해주셔서 너무 감사했다. 또 다시 달릴 힘을 충전했다!! 🏃‍♀️