1. 경진대회 개요
1. 개요
부동산은 의식주에서의 주로 중요한 요소 중 하나입니다. 이러한 부동산은 아파트 자체의 가치도 중요하고, 주변 요소 (강, 공원, 백화점 등)에 의해서도 영향을 받아 시간에 따라 가격이 많이 변동합니다. 개인에 입장에서는 더 싼 가격에 좋은 집을 찾고 싶고, 판매자의 입장에서는 적절한 가격에 집을 판매하기를 원합니다. 부동산 실거래가의 예측은 이러한 시세를 예측하여 적정한 가격에 구매와 판매를 도와주게 합니다. 그리고, 정부의 입장에서는 비정상적으로 시세가 이상한 부분을 체크하여 이상 신호를 파악하거나, 업거래 다운거래 등 부정한 거래를 하는 사람들을 잡아낼 수도 있습니다.
저희는 이러한 목적 하에서 다양한 부동산 관련 의사결정을 돕고자 하는 부동산 실거래가를 예측하는 모델을 개발하는 것입니다. 특히, 가장 중요한 서울시로 한정해서 서울시의 아파트 가격을 예측하려고 합니다.
2. 환경
- (팀 구성 및 컴퓨팅 관련) : 5인 1팀, NVIDIA GeForce RTX 3090 서버를 VSCode와 SSH로 연결하여 사용
- (협업 환경) : Notion, Github
- (의사소통) : Slack, Zoom
2. 팀 구성 및 역할
팀원 | 역할 |
이명진 | 팀장, EDA, Feature Engineering, Modeling |
서재현 | EDA, Feature Engineering, Modeling |
신주용 | EDA, Feature Engineering, Modeling |
이영훈 | EDA, Feature Engineering, Modeling |
이준형 | EDA, Feature Engineering, Modeling |
저희는 대회의 성적도 중요하지만, 개인 학습역량도 중요하다고 생각했으며 전체 데이터셋에 대해 팀원 모두가 잘 이해하고 있어야 다양한 가설을 수립할 수 있으며 여러 실험을 할 수 있다는 판단하에 모두가 함께 EDA, Feature Engineering, Modeling에 참여하였습니다.
3. 프로젝트 수행 절차 및 방법
1. 프로젝트 개발환경 구축 (Github, Notion)
- 여태껏 프로젝트 진행 시 폴더를 구조화하지 않고 필요할 때마다 폴더를 생성하고 파일을 관리하는 식으로 진행하다 보니 어떤 파일이 어디에 있었는지 확인하는데 어려움이 있었고 프로젝트를 구조화해서 진행하고 싶다는 욕구가 있었습니다. 또한 개인이 아닌 팀으로 진행할 때도 이런 식으로 진행하면 협업 과정에서 어려움이 있겠다고 판단하였습니다. 따라서 머신러닝 프로젝트에서는 어떤 식으로 구조화해서 진행하는지 살펴보았고 CookieCutter 패키지와 사용 방법 및 컨벤션에 대해 팀원들에게 공유 후 프로젝트를 구조화해서 진행하였습니다.
- 중복된 실험을 방지하고 모델 실험 기록과 관리를 용이하게 하기 위해 Notion으로 실험 관리를 위한 페이지를 작성하여 실험을 진행하였습니다.
2. EDA를 진행하면서 데이터에 대한 이해 ('왜?'라는 부분에 집중하여 결측치와 이상치를 파악)
3. Baseline을 위한 모델 선정 및 코드 작성
4. 각자 Feature들을 나눠서 Feature Engineering을 통한 다양한 파생변수 생성
5. Feature Selection을 통한 모델의 과적합 방지와 성능 개선
6. Weights & Biases Sweep을 이용하여 Hyper Parameter Tuning
7. 실거래가에 따라 높은 실거래가와 낮은 실거래가를 예측하는 2개의 모델로 각각 예측을 수행
4. 경진대회 수행 결과
저희는 우선 EDA를 통한 다양한 파생변수를 생성해서 모델의 성능을 높이는 것을 key point로 설정하여 다양한 가설을 세우고 해당 변수가 모델 성능에 도움이 되었는지를 평가하는 식으로 진행하였습니다.
그중에서도 역세권 근처의 집들은 상대적으로 비역세권 집값보다 비쌀 것이라는 가설 하에 위도, 경도 변수를 기반으로 역세권 여부, 근처 X미터 이내에 버스 정류장 개수의 총합 등과 같은 거리기반 파생변수를 생성하는데 집중하였습니다.
유클리드 거리, 맨해튼 거리, harversine 중 어떤 알고리즘을 통해 거리를 구할 것인가에 대한 고민이 있었는데 실제 위, 경도 사이의 거리를 구하는 것이 목적이었기 때문에 지구상의 좌표로 이루어진 거리에 적합하고, 지리적 위치 간의 거리를 측정하는 데 사용되는 harversine 알고리즘을 사용하였습니다. 다른 거리 측정 알고리즘에 비해 계산이 느리다는 단점이 있었고 모든 데이터의 위, 경도 좌표에 대해서 지하철역, 버스 정류장까지의 거리를 계산해야 했기 때문에 실제로 수행시간도 약 23분 정도로 오래 걸렸습니다.
앞으로의 여러 실험들을 위해서 빠르게 결과를 확인하고 반복하는 작업에 매번 모든 좌표에 대한 거리를 계산하기에는 시간이 너무 오래 걸린다는 문제가 있었습니다. 이를 해결하기 위해 알고리즘을 개선을 통해 계산 시간을 23분에서 6분으로 개선하였습니다.
기존 알고리즘의 시간 복잡도인 O($N^2$) 을 줄이지는 못했지만 set 자료형을 이용해 unique 한 위도, 경도 집합에 대해서 순회해서 같은 위도, 경도를 가지는 값에 동일값을 채워주는 방식으로 기존 12584 x 1128094 만큼 순회하는 방식에서 12584 x 5887 만큼 순회해야 하는 데이터 개수를 줄여주는 방식으로 해결하였습니다.
하지만 파생변수를 여러 개 생성해도 좀처럼 모델의 성능 개선이 없었고 성능 개선을 위해서는 다른 전략을 취해야 한다고 판단했습니다. 우리의 모델이 예측한 target 값의 분포를 살펴보니 실거래가가 높은 아파트에 대해서 예측을 잘 못한다는 것을 확인하였습니다.
실거래가가 높은 아파트에 대한 예측을 못한다면 평가지표로 사용한 RMSE 값이 높게 측정이 될 것이고, 결과적으로 실거래가가 높은 아파트를 잘 예측하는 모델을 만드는 것이 이번 대회의 key problem이라고 생각하였습니다. 최종적으로 cross validation rmse가 가장 낮게 나온 실거래가가 높은 아파트를 예측하는 모델과 실거래가가 낮은 아파트를 예측하는 모델 2개를 선정하고 각각의 예측값을 사용하는 방식을 통해 좋은 결과를 거둘 수 있었습니다.
5. 자체 평가 의견
잘했던 점
- 프로젝트 구조화와 실험 관리 노션 페이지를 통해 효율적으로 실험할 수 있도록 설계하였다.
- 바로 모델의 성능을 올리는데 집중한 것이 아니라 팀원들 다 같이 일주일정도 EDA를 통해 데이터를 살펴보고 서로 공유하였다.
- 변수들을 분담하여 파생변수를 생성했기 때문에 결과적으로 모든 변수에 대해 의미 있을 것 같다고 생각되는 파생변수를 생성하였다.
- 팀원들 중 누구 하나 불평불만 없이 서로의 의견을 존중해 주었고 모두 다 열심히 참여해서 좋은 분위기 속에서 대회를 마무리하였다.
시도했으나 잘 되지 않았던 것들
- 개인적으로 의미 있다고 생각되는 파생변수를 생성하여 실험해 보았지만 성능 개선으로 이루어지지 않는 경우가 많았다.
- 최대한 많은 데이터를 사용해서 모델을 학습시키려 하였지만 시계열적 특성을 잘 반영하지 못하여 최근 3년의 데이터로 학습한 모델보다 성능이 좋지 못했다.
한계점 및 아쉬웠던 점들
- 실거래가가 높은 아파트와 실거래가가 낮은 아파트의 기준을 정하는 데 있어서 여러 가지 실험을 하지 않고 단순히 target값의 분포를 기준으로 30억이라는 숫자로 정한 것이 아쉽고 해당 기준을 정하는데 조금 더 고민하면서 명확한 기준으로 정했으면 어땠을까 하는 아쉬움이 있다.
- 항상 '왜?'라는 부분을 염두에 두고 진행하려 했지만 신경이 점수에 쏠리는 경우가 많았다.
- 대회 기간이 2주로 짧았기 때문에 여러 가지 더 많은 실험을 못 해보았다.
- 모델을 검증하는 과정에서 시계열 데이터에 사용되는 TimeSeries Split 방법도 있었지만 Hold out 방법으로만 실험해보았다.
- 프로젝트를 구조화 하긴 했지만 실험 파이프라인을 코드를 체계적으로 작성하지 않아 대회가 끝나고 피드백하는 과정에서 코드를 살펴보는데 어려움이 있었다.
- 깃헙 commit convention을 따로 지정하지 않아 팀원들끼리 같은 convention을 사용했다면 조금 더 깔끔하게 관리할 수 있을 것 같다는 아쉬움이 있다.
경진대회를 통해 배운 점 또는 시사점
- ML Project의 전반적인 파이프라인을 경험해 볼 수 있었다.
- 실험도중 나는 항상 기존 데이터, 모델의 성능 관점에 사로잡혀 있었는데 팀원분들은 외부 데이터를 어떻게 활용할지, 우리의 모델이 어떤 점을 잘 예측하지 못하는지에 대해 생각하시는 분도 계셔서 팀원분들을 통해 많이 배우고 생각하는 관점도 넓어졌다.
- Weights & Bias의 사용법과 Sweep을 통해 하이퍼 파라미터 튜닝 하는 방법을 배웠다.
- Feature Selection의 여러 방법론에 대한 라이브러리 사용 방법을 배웠다.
'기타 > Upstage AI Lab' 카테고리의 다른 글
Dialogue Summarization Fast-up Report (0) | 2024.03.25 |
---|---|
Document Classification Fast-up Report (0) | 2024.02.22 |
1차 스터디 그룹 보고서 (0) | 2024.01.02 |