1. 대회정보
- Overview
House Price Prediction 경진대회는 주어진 데이터를 활용하여 서울의 아파트 실거래가를 효과적으로 예측하는 모델을 개발하는 대회이다.
- Dataset
train : 200701 ~ 202306 까지의 아파트 정보 데이터 - 1118822개
test : 202307 ~ 202309 까지의 아파트 정보 데이터 - 9272개
- Timeline
2024년 7월 09일 (화) ~ 7월 15일 (월) - 온라인 수업
2024년 7월 15일 (월) - 회의 후, 회의 결과를 바탕으로 데이터 전처리
2024년 7월 16일 (화) - 각자 EDA 및 Feature Engineering
2024년 7월 17일 (수) - 최종 데이터셋 설정 및 Modeling
2024년 7월 18일 (목) - Feature Selection 및 Modeling Hyper-parameter tuning
2024년 7월 19일 (금) - 최고 성능 모델 추가 처리 및 최종 제출 기한
2. 나의 목표와 결과
결측치를 줄여보자.
대회에서 제공된 학습 데이터의 가장 큰 문제는 너무도 많은 결측치였다.
- 결과 :
- 결측치를 크롤링으로 채우기에는 전문적인 정보들이 많아서 데이터셋들을 제공하는 사이트들을 집중 검색했고, 적절한 외부데이터를 찾았다.
- 80만개의 결측치를 25만개정도까지 줄일수 있었다.
좌표에 대한 결측치는 0으로 만들자.
다른 수치형 변수들은 선형보간한다고 해도, 위도경도는 그렇게 하면 나중에 지하철과의 거리계산에서 큰 오류를 만들것이라고 생각하여 좌표 결측치를 0으로 만들도록 하였다.
- 결과 :
- 위의 자료를 통해서 이미 결측치는 25만개 정도로 줄어있었다.
- 여러 작업을 걸쳐 약 100개의 자료를 수동으로 수집하였다.
- 사람이 판단해야 하는 부분이기 때문에 자동화로 넘기기엔 어려움이 많다고 생각한다.
- 다만 100개가 아니고 1000개였다면 부분 자동화는 시도했을 것이다.
의미있는 변수를 찾자.
- 결과 :
- 이자율 : 이자율에 따라 사람들의 매매에 대한 생각이 변할 것이라는 생각에 한국은행데이터셋 사이트에서 대한 데이터를 찾았다.
- catboost로 계산한 변수 중요도에서 30개의 변수 중 9위로 꽤 높은 기여도를 보여주었다.
- LGBM으로 계산한 변수 중요도에서는 18위정도로 중간정도의 기여도를 보여주었다.
- subway_count : 1km 반경 안에 지하철의 갯수가 몇개인지 세어보는 변수를 만들었다.
- 변수 중요도가 30위가 넘으면서, 가격과는 상관없는 변수임을 확인했다.
여러가지 모델을 실험해보자
- 결과 :
- 다른 팀원들은 도전하지 않았던 catboost에 대해 도전하였고, 나의 결과와 LGBM을 실험한 데이터를 앙상블하여 좋은 결과를 얻을 수 있었다.
- optuna는 한번에 적은 trial을 해보면서 하이퍼파라미터의 값의 범위를 줄여나가는 것이 효율적임을 알았다.
- kfold, TimeSeriesSplit, Stratified KFold등 여러가지 시도를 하였고, kfold가 그 중 효과적이였으나, 전체적으로 rmse를 줄이는 데는 성공하지 못했다. 그 이유를 생각해보건데, 훈련데이터가 테스트데이터의 양에 비해 어마어마하게 크고 가격의 분포 또한 엄청 다양하여, 과적합을 염려할 상황은 아니였음으로 판단된다.
3. 나의 새로운 시도
wandb
- 새로운 것에 대한 도전이 쉽지 않았는데, 팀장님의 소스코드와 wandb결과물을 보면서 나름의 공부를 하였고, 지금은 한층 더 여유롭게 wandb를 내 코드에 녹여서 작업할 수 있게 되었다.
- 하이퍼파라미터의 최적화를 추적할 때 효과적인 툴이다.
서버 사용하기
- 서버 사용이 괜히 무서워서 사용하지 않고 있었는 데, 팀장님께서 하나도 어렵지 않다는 말에 도전하였고, 정말 빠르고 쾌적함을 느낄수 있었다. 좀더 빨리 사용했다면 좋았을 것이라는 아쉬움이 남는다.
4. 프로젝트 회고
아쉬운 점
- 역시 시간이다.
- 처음에 평수를 나누어서 모델을 만드려는 시도를 했었다. 20평 단위로 나눠서 계산했었는데, 생각보다 에러가 너무 커 실험을 중단하였다.
- 대회마감 전날에서야 데이터를 너무 잘게 나누면 나눈 데이터들의 경계의 에러가 커지기 때문에 규모의 데이터를 적당하게 나눠야함을 알았다.
- 이 대회를 앞으로 하실 분에게 힌트를 드리자면, 메타 모델을 사용한다.
- 데이터를 위와 같이 적절히 나눈후 각기 모델로 학습을 시켜서 나온 결과들을 그냥 모아서는 에러가 크고, 그 데이터들을 모아서 rigde 같은 선형모델에 한번 더 돌려주면 에러가 많이 감소함을 알 수 있다.
나만의 마무리
- 마지막날에 알아서 제대로 코딩하지 못했던 모델링을 대회후 주말에 열심히 만들어서 결과를 내었다.
- 여태것 catboost의 val rmse가 5900에서 6000초반 대였는데, 다시 만들어서 실험 한 결과 5060대가 나왔다!!!
- 이걸 꼭 리더보드에 한번 제출해보고 싶은데 그렇게는 안해주시려나.
5. 다음 대회에서 할 일
체계적인 데이터 관리
- 모델링을 할때, 계속 같은 ipynb파일에서 하곤 했는 데, 그렇게 되니 너무 주먹구구식으로 관리가 되고 wandbd의 이름이나 그룹이 잘못 설정되는 경우들도 허다하게 되었다.
- 다음 대회에서는 한 모델링에 대해서 하나의 파일로 작업을 하고 철저히 확인하고 작업하도록 하여 혼선을 최대한 막으려고 한다.
- 파일이름에 대한 체계성도 만드려고 한다. 아웃풋에 대한 이름체계가 확실해야 실험을 돌릴때 유실되는 파일을 막을 수 있다. 그리고 시간대를 넣어주면 wandb와 비교하여 찾기 쉬워진다.
- 방금 생각난 것인데, wandb가 알아서 생성해주는 이름을 파일명으로 쓰는 방법도 찾아봐야겠다. 그럼 매칭이 쉬워서 관리가 좋을 것이다.
요즘도 아쉬워서 서버 접속해서 맨날 이것저것 돌려보면서 생각해보고 있다. 간단한 것 같으면서도 어려웠던 대회였고 그래서 그런지 자꾸 미련이 남는다. 결론은 재미있었다!!