본문 바로가기

Activity/네이버 부스트캠프 5기 (AI Tech)

[Naver Boostcamp AI Tech 5기] 6,7주차 Level1 Project Book Rating Prediction 회고

728x90
반응형

[팀 회고 요약]

프로젝트 주제

영상, 기사같은 다른 콘텐츠와는 달리 책은 한 권을 다 읽기까지 적지 않은 시간을 필요로 하고 구매를 위해 이용할 수 있는 정보가 한정적이라 소비자들은 책을 고르는데 신중을 가하게 된다.

그렇기에 이번 프로젝트에서는 소비자들의 책 구매에 도움을 줄 수 있도록 책, 소비자의 정보를 바탕으로 소비자가 특정 책에 줄 평점을 예측하도록 한다.

 

팀 목표

  • 배운 내용을 프로젝트에 적용해보기
  • 우리 팀에 적합한 협업 문화 고민해보기 - 지속가능한 협업 문화 수립하기

 

프로젝트 협업 문화

  • 깃헙을 통한 프로젝트 버전 관리
  • 노션을 통한 프로젝트 진행 상황 공유
  • 게더타운을 통한 실시간 인사이트 공유

 

프로젝트 수행 과정

1. 탐색적 데이터 분석 (EDA)

  • 가능한 모든 데이터셋의 모든 컬럼데 대하여 EDA를 진행하였음

 

2. 데이터 전처리

  • category 결측치 전처리: 휴리스틱한 방법으로 뽑아낸 상위 카테고리 43개를 활용하여 결측치 채움
  • age 결측치 전처리: 다양한 방법으로 age 필드의 결측치를 채움
  • location field split 전처리: location 필드 값을 , 로 분할하여 서로 다른 3개의 필드로 저장
  • api 활용: 외부 api를 사용하여 location 결측값을 3%까지 줄였으나, 대회 치팅이라고 판단하여 제거

 

3. 다양한 모델 탐색 : 모델 구조 변경 및 새로운 모델 도입

  • 기존 baseline에 제공되는 모델들의 구조 등을 변경 (FFDCN, DeepCoNN_CNN, 3 layer CNN_context_FM 등)
  • 범주형 필드가 많음을 고려하여 범주형 데이터 처리에 용이한 tree-based model 도입 (Catboost, LGBM)
  • 모든 모델에 대해서 sweep을 이용한 하이퍼 파라미터 튜닝을 통해서 최적의 성능 탐색

 

4. 최종 모델 선정 및 절차

  1. 각 모델에 대해서 파인 튜닝 과정을 거침
  2. 파인 튜닝 후 일반적으로 좋은 성능을 보인 모델들을 내부 기준에 따라 선정
  3. 선정한 모델들을 다양한 경우의 수로 조합하여 성능 추이 확인
  4. 다양한 모델들을 하나씩 추가 및 제출해가며 성능 추이 확인
  5. 가장 좋은 성능을 낼 수 있는 경우에 대하여 최종 앙상블 
    + 종종 ML 기반 모델을 사용할 때, 정상 rating(1~10) 범주 외의 값을 예측하는 경우가 있어, 이를 Scaling 함

 

5. 프로젝트 결과

val_score public_score final_score (public + private_
2.1214 2.1151 2.1077
  • 최종 제출한 모델의 팀에서 내부적으로 구현한 val_score은 2.1214
  • 대회 홈페이지에 submit 파일을 제출한 후에 확인한 public score는 2.1151 (당시 기준 5등)
  • 대회 종료 이후에 공개된 final_score는 2.1077로, loss가 약 0.0074만큼 줄어듦 (최종 3등)

 

프로젝트 코드 및 랩업 리포트 저장소

https://github.com/boostcampaitech5/level1_bookratingprediction-recsys-01

 

GitHub - boostcampaitech5/level1_bookratingprediction-recsys-01: level1_bookratingprediction-recsys-1 created by GitHub Classroo

level1_bookratingprediction-recsys-1 created by GitHub Classroom - GitHub - boostcampaitech5/level1_bookratingprediction-recsys-01: level1_bookratingprediction-recsys-1 created by GitHub Classroom

github.com

(코드는 저작권 이슈 때문에 모든 코드가 올라가있지 않은점 양해 부탁드립니다)

 

 

[개인 회고]

1. 내 학습목표를 달성하기 위해 한 노력

  • 이전 기수 및 다른 대회의 회고 자료, 강의 자료 등을 적극적으로 참고하여 본 프로젝트에 반영 및 팀원에게 공유 및 아이디어 내기 
  • 부드러운 팀 분위기와 협업을 위해, 팀원들의 의견을 적극적으로 경청하고 공감 및 수용, 개선할 수 있는 피드백/의견 전달하기

 

2. 내가 모델을 개선하기 위해 한 노력

  • EDA 및 피처 엔지니어링: EDA를 수행함으로써 여러 가설을 세웠고 그 중 하나가, FM과 FFM 같은 content-based recommendation 모델에서 책의 장르 정보를 고려하면 성능이 더 오를 것이라는 것이었다. 하지만 기존에 카테고리 데이터에는 이상치가 많이 포함되어있었고, 결측치도 46퍼센트에 육박했다. 따라서 기존 카테고리 값을 토대로 43개의 값으로 이루어진 상위 카테고리 컬럼을 생성하였고, 유사한 책 이름끼리 묶어서 결측치인 상위 카테고리 값을 채우도록 하였다. 그 결과, 상위 카테고리의 결측치는 0.00023%까지 낮출 수 있었고, FM, FFM 모델에서 약 0.02의 성능 향상을 보였다.
  • 전이학습 도입: CNN_FM 모델의 CNN 파트에 많이 알려져있는 저명한 모델을 사용하면, 일반적으로 성능이 오를 것이라고 예측하였다. 따라서 baseline에서 제공되었던 CNN_FM에서 CNN을 Vgg16 모델로 교체하여 성능을 높이고자 하였다. 하지만 오히려 과적합으로 인해 성능이 떨어졌다. 이는 모델의 규모가 너무 큼으로 인해 발생한 현상이라고 생각하여 모델의 크기를 줄여서 다시 시도하였다.하지만 두 차례나 큰 폭으로 규모를 줄인 모델을 적용해보았지만, 여전히 과적합으로 인해 성능이 잘 나오지 않음을 확인하였다.
  • 모델 구조 변경: CNN_FM에서 전이학습을 도입하려고 하였고, 모델 규모를 아주 작은 것으로도 바꾸어 보았지만 과적합으로 인해 성능이 제대로 나오지 않았다. 따라서 이러한 상황에서는 모델 교체가 아닌 기존 모델에서 약간의 구조 개선만 있어도 성능이 올라갈 수 있을 것이라고 가정하였다. 그에 따라 기존에 2 layer 이었던 CNN에 레이어를 추가하여 3 layer CNN으로 변경하였다. 그 결과, 기존 모델에 비하여 더 낮은 loss에 적은 epoch수로 도달할 수 있었다.
  • 하이퍼파라미터 최적화: DeepCoNN, CNN_FM, WDN 등 다양한 모델에 대해서 성능을 최대한 끌어올리기 위해 Sweep을 이용하여 하이퍼파라미터 최적화를 시도했다. 그에 따라 각 모델들에 대해서 최적의 성능을 내주는 하이퍼파라미터 옵션을 찾아 저장해 팀원들에게 공유하여 앙상블 때 활용하였다.

 

3. 내가 한 행동의 결과로 달성한 것 및 얻은 깨달음

  • 알고 있는 것과 해본 것은 다르다: 머리로 알고있는 다양한 모델과 성능 개선의 기법이 있지만, 이를 실제로 구현 및 도입해본 경험이 많지 않았다. 그래서 코드로 구현했을 때 어떤 오류와 허점과 실수가 있었는지 잘 알지 못한 것이 아쉽다. 이제는 머리로 알고 있는 것들을 코드로 구현하여 실체화해보는 것을 연습하도록 해야겠다.

 

4. 내가 새롭게 시도한 변화와 효과

  • 실험의 논리성과 타당성 확인: 각종 실험의 내용을 배경 및 가정, 가설, 결과 및 분석 내용을 하나의 문서로 정리함으로써 각 실험과 행위에 대한 논리성과 타당성을 쉽게 확인할 수 있어서 좋았고, 이를 통해 어떤 점을 개선해볼 수 있을 지 비교적 쉽게 파악할 수 있었다.
  • 보다 적극적인 Git 활용: Git의 적극적인 활용이 절실한 상황이었고, 특강 때 배운 것들을 포함해서 팀원들이 올린 pr에 대해서 코드 리뷰도 최대한 많이하려고 노력했다. 프로젝트 이전에 비해서 확실히 Git과 더 친숙해졌고, Git이 무서운게 아니라 오히려 고마운 도구라는 것에 대해서 공감하게 되었다.

 

5. 마주한 한계와 아쉬웠던 점

  • 리더보드 순위: 리더보드 순위를 신경쓰지 않기로 해놓고서는, 신경을 많이 쓰다보니까 이를 올리기 위해서 공부한 것을 복습 및 도입해보는 것 보다 성능 개선을 위한 파라미터 튜닝 실험 위주의 시간을 보냈던 것이 아쉽다. 
    -> 다음 프로젝트에서는 리더보드의 순위는 최대한 신경쓰지 않고, 공부한 것을 적용하고, 도전해보고 싶은 것들을 사용해보는데 초점을 맞춰야 겠다!
  • 체력적 한계: 체력적인 한계로 인해 더 시도 및 도입해볼 것들을 하지 못했던 것이 아쉽다. 운동을 안하고 앉아서 공부하는 것보다, 잠깐이라도 운동을 다녀오는게 더 장기적으로 오래, 많이 공부할 수 있는 길인 것 같다.
    -> 다음 프로젝트에서는 못해도 일주일에 한 두번은 헬스장에 가서 등운동과 가벼운 유산소나 산책을 해야겠다

 

6. 다음 프로젝트에서 시도해볼 것

  • 프로젝트 측면 >> 모델 및 파일 버전 관리: 프로젝트를 할 수록 다양한 버전의 모델과 파일들이 생겨나 이를 구분하고 찾는 것이 어려워졌다. 따라서 모델 및 파일 버전 관리를 자동화 및 간소화할 수 있는 방안을 탐색하여 다음 프로젝트에 적용해보고자 한다.
  • 개인적인 측면 >> 기능 구현: 이번 프로젝트에서는 EDA와 피처 엔지니어링, 모델 구조 개선, 그리고 하이퍼파라미터 최적화 파트에 주로 참여하였다. 그래서 팀원들이 만들어준 기능을 자주 사용하면서도, 이를 직접 내가 구현하여 참여해볼 생각과 시간을 가지지 못했던 것이 아쉽다. 따라서 다음 프로젝트에서는 기능 구현에 좀 더 적극적으로 참여하고자 한다!

 

 

 

본 포스트는 팀 랩업 리포트를 토대로 작성되었고,

랩업 리포트는 팀원들과 함께 작성하였기 때문에 본 포스트에리포트의 전체 내용을 담지 않았습니다

728x90
반응형