ㅎ지금의 4번째 프로젝트까지 함께 했다. 2번째 프로젝트때 우리 Team의 이름은 "URSA. 우루사." 였다.간과 관련된 EDA를 했었다. 해당 EDA와 관련된 내용들도 향후 올려놓도록 하겠다.
우리 팀은 정말 신기한 사람들이 모였다. 서로 부족한 점을 돌봐준다. 그렇다보니 모든 부분에서 골고루 좋은 성과를 내게 된다. 정리를 잘하는 사람도 있고, 보통 보이지 않는 부분을 집요하게 들춰내는 사람도 있고, 우리 모두를 혼자 두지 않고 자꾸만 무언가를 함께하도록 하는 사람도 있다. 그러다보니 하나씩 둘씩 우리도 모르는 사이 서로의 장점을 보고 배우는 중이다. 그 덕분인지 매번 프로젝트 후 강사님과 매니저님들에게 칭찬을 잔뜩 받는 중이다.성실하고 집요한 EDA 장인이라는 강사님의 말이 가장 임팩트 있었다.
이번 프로젝트는 AI Stage 플랫폼을 이용해 지금까지 배워왔던 머신러닝 및 관련 내용에 대해 적용해보고 질문해보는 시간을 갖도록 해주는 좋은 대회였다.비록 플랫폼의 오류로 정확하게 실력을 평가 받으며 진행하지는 못했지만, 주최측이 현재 최종 결과 및 우리가 지금까지 진행했던 결과에 대한 오류를 수정하고 있다고 한다.
왜 Team 명이 마이너스냐? Data Miners & Minus Loss.
데이터의 가치들을 EDA를 통해 발굴하고, 그를 통해 Loss를 줄인다. 대충 그런 의미다.
1. Abstract
Goal of the Competition
지속적으로 변하는 서울시의 아파트 가격을 예측한다. 이로 인해 부정거래 및 허위매물에 대해 파악하고 앞으로 아파트 가격이 어떻게 형성되는지 머신러닝 모델링을 통해 값을 예측하는 프로젝트이다.
Data set
2007년부터 2023년 06월까지 train 데이터로 제공되고, 2023년 7월 ~ 9월 까지의 데이터를 테스트 셋으로 주어졌다. 추가 데이터로 버스 및 지하철 좌표를 추가로 주어졌으며 외부 데이터를 가져올 수 있도록 허용했던 대회였다.
Competition Env.
Team : 5인 1팀
Computing Env. : 3090Ti per person. connecting SSH server.
2017년 이후 데이터 지정
위 EDA 근거에 의해서 20170101 기준 이후 데이터를 학습에 사용하였다.
GDP(E-나라지표),금리(한국은행) 금리가 상승하면 gdp가 감소하고 아파트 집값이 하락한다는뉴스와논문을 참고하여 feature를 추가하였다. 또한 금리의 변동 영향은 금리 변동 기준일 1년 뒤에 적용된다고 하여 금리 변동 기준일 기준 1년 뒤 해당 금리를 적용시켰다.
이상치 제거
아파트의 평균값이 낮은 값 : 6111.111
6111.111 이하의 아파트 값을 가지고있는 아파트는 drop.
이후 아파트의 평균값이 가장 낮은 값 : 6200
외부 데이터 크롤링 직방과 네이버에서 크롤링을 통해 아파트들의 방과 화장실 개수를 가지고 전용 공간 개수, 주차장 개수 등을 채웠다. 이를 찾은 이유는 같은 아파트에서 평수가 5평 정도 차이나고 화장실과 방 개수가 1~2개 정도 추가되면 매매가가 평균 5000만원 정도 차이가 남을 확인했기 때문이다.
아파트별 평수 평균 값에 따른 분류
평균 값 분류는 78개이며 0~78로 구성되었고, 한 분류당 평균 300개의 아파트로 분류하였다. 실제 분류한 값은 [15000,19000 ~ 11100000,1200000] 와 같으며 15000 이하 = 0, 15000 이상 19000 미만 = 1 과 같은 방식으로 분류하였다.
'test dataset의 결측치들은 어떻게 채웠는가?'에 대한 의문이 생길 수 있다. 결측치는 실제로 9274개의 데이터 중 108개였으며, 여러 가지 방법으로 결측값을 채우는 시도를 하였다. KNN Imputator, DNN Imputator, train data 23/03 ~ 23/06 의 해당 아파트 평균가를 기준으로 채우는 시도를 해보았다.
가장 좋은 결과는 'train data 23/03 ~ 23/06 의 해당 아파트 평균가를 기준으로 채움'이였다.
아파트와 지하철 역 사이의 거리를 기준으로 만든 feature
총 3개의 feature를 만들었다. SUB_DIST / 1차 역세권 / 2차 역세권
서울시에서는 1차 역세권은 역에서부터 250m 떨어진 곳, 2차 역세권은 역에서부터 500m 떨어진 곳에 해당된다. 따라서 1차 역세권에 해당되는 곳은 1, 아닌 곳은 0 / 2차 역세권에 해당되는 곳은 1, 아닌 곳은 0. 2차 역세권에 해당되면 1차 역세권 또한 1로 값을 채워주었다. 그리고 SUB_DISTANT라는 변수를 가지고 모든 지하철역과 아파트와 가장 사이의 거리를 구하고, 가장 가까운 지하철역과의 거리를 대입하여 feature를 생성했다.
위 사진 속 EDA는 자치구별 동의 아파트 평균가이며, 좌측 상단부터 우측 순서로 용산구, 종로구, 중구, 강남구이다. 아파트가 높은 자치구에 평균 이하의 동 아파트 평균이 있다. 이는 분명 모델이 보기에 이상치들을 잘 분류해줄 수 있는 좋은 feature가 될 수 있으므로 생성하였다.
Strategy Ⅰ
Data Selection에 있는 모든 변수들을 포함하였으며, 대회에서 가장 좋은 성능을 보여주었다.
RMSE test: 8468.879900564043
RMSE : 89667.8434
Strategy Ⅱ
Data selection 위 Data selection에서 금리 데이터만 사용하였다.
Model Selection
3. Process: Issues
train data set에서 총 데이터는 111만개 였으며, 결측치가 90만개에서 100만개인 column이 31개였다. 총 column 수는 51개 였으며, 이 중 결측으로 사용하지 못하는 column 31개, 실질적으로 아파트 가격에 영향을 미칠 수 없는 column은 10개. 즉, 우리가 학습에 당장 사용할 수 있는 column은 10개 였다.
주어진 데이터셋만 가지고 학습을 진행할 당시 3가지 방식을 사용해보았다. 1. 결측값을 가진 그대로 학습시키기. 2. Imputator로 결측값들을 채우고 학습시키기. 3. 새로운 feature 만들기 (SPACEAPT_AVG)
1번과 2번은 우리에게 큰 변화를 가져다주지 못했다. 하지만 3번째로 접근한 방식은 리더보드의 RMSE 값을 변화시켰고, 이는 향후 있었던 (주최측의 잘못으로 리더보드의 인덱싱 에러 및 public & private 동일 문제가 있었다.) 이슈 전과 후에도 우리 팀에 성적을 4등과 3등으로 유지시켜주는 역할을 했다.
하지만 모델의 성능이 크게 나아지지 않아서 외부에서 데이터를 가져와서 결측치가 많은 변수를 대신 하거나 보완하여 활용할 수 있는 데이터를 찾아서 채우고 향후 학습을 시켰다.[위도, 경도 좌표 Geopy를 활용하여 전체 주소명을 제작하여 채우기 등]
4. Role
배정 받은 인원은 5인이었다. 그러나 개인 사정으로 4인 체제로 진행되었다. 팀 모두 List of Work에 참여하였지만 각자 파트별 장점을 살려 비중을 두어 역할을 담당하였다.
팀장을 맡아 팀원들의 task를 확인하고 함께 방향성을 논의하였다. 특별히모델링에 힘을 썼다. 모델은 XGBoost, CatBoost, LGBM로 만들었다. 각 모델마다 Optuna를 활용하여 Hyperparameter를 찾을 수 있도록 만들었고, 학습 후 Validation으로 모델의 RMSE를 측정할 때, Overfitting 여부를 확인할 수 있도록 그래프로 Visualization 해두었다. 또한 각 모델별로 Feature Importance를 확인할 수 있도록 하였으며, Feature Importance가 모델별로 달라서 모든 모델 학습 후 VotingEnsemble을 할 수 있도록 코드를 구현했다. 외부 데이터 수집에서는 금리와 실질 GDP, 명목 GDP, 국토교통부의 20070101~20230630 매매데이터, 한강에 있는 대교 중심좌표 등을 찾아서 train 결측치를 채우도록 하였다.
EDA는 주로 'target' column을 중심으로 진행하였고 해당 과정을 통해서 'Dong_Rank' 동별 집값 평균가에 따른 순위를 나타낸 new feature, 'SPACEAPT_AVG' 동별 아파트의 전용면적 에 따른 평균가를 구해서 15000부터 1200000까지 총 78개로 카테고리를 나누어 표현한 new feature를 생성하였다.
5. Results
6. Conclusion
최종 전략 기존 변수에 대한 내용이 부족했기에, 외부에서 데이터를 가져와서 결측치가 많은 변수를 대신 하거나 보완하여 활용할 수 있는 데이터를 많이 채우고자 함.
보완한 데이터
금융 관련 요인 : 금리, GDP, 전세가율 거리 요인 : 역세권, 한강 조망권, 숲이나 도시 공원 같은 자연 조경과 관련된 시설물 교육 요인 : 학군, 학급 개수 제재 요인 : 부동산 제도 변화 아파트 구성 요인 : 방 개수, 화장실 개수, 주차장 면적, 세대수, 세대당 주차장 개수
AutoML을 사용하지 않고 직접 GridSearch, Optuna 등 여러 도구를 직접 사용해봄
기본적인 Baseline 구축을 위해 EDA와 데이터 수집을 다같이 진행한 후 완성된 데이터셋을 활용하여 Modeling 진행
앙상블 방법을 weight 적용
결측치를 직접 크롤링해서 채우기
좋은 변화
Offline으로 진행하게 되면서 목적에 맞지 않는 task가 줄어듦
다양한 모델을 구현 및 앙상블 기법 구현
부스팅 모델링에 익숙해짐
더 깊고 다양한 관점으로 EDA를 보는 시야가 틔임
나쁜 변화
마지막 크롤링 데이터 가공 시간이 너무 소요
하나의 파트를 맡아서 집중적으로 하지 않아서 하나의 작업에 집중하기 어려움
2주 라는 시간 안에 성과를 내게 될 때, 할 수 있는 것과 할 수 없는 것에 대한 더 명확한 구분이 필요함을 알게됨.
아쉬운 점
서버 OFF, 리더보드 인덱싱 오류 등의 시스템 이슈로 인한 대회 몰입도 저해
짧은 시간동안 대회가 진행되어, 회의 가운데 나왔던 논제들을 전부 해결하지 못함.
더불어 새로운 feature를 만들었으나 학습에 적용시켜 결과를 내보지 못함.
시간 안배를 효율적으로 개선하는 방안을 반드시 다음 프로젝트 때는 마련할 것이다.
7. End of the Project
'몰입'
이번 대회를 한 단어로 표현하자면, 나는 몰입이라고 하고 싶다. 처음에는 아무것도 보이지 않던 데이터 속에서 무언가 하나씩 의미가 보이기 시작하자 처음에는 1시간이 훅훅 지나가고 그 다음에는 3시간이 지나가고 이후부터는 정신차리면 새벽이었다. 몰입을 할 수 있도록 함께 열중해준 팀원들에게 너무 고맙고, 이 시간들을 버텨준 내 정신과 몸에게 너무 고맙다.
다음 대회를 맞이 하기 전 분명히 고쳐야만 한다고 생각하는 부분이 2가지 있다.
1. 어떠한 작업이든 마무리는 누가 봐도 알아볼 수 있는 깔끔한 정리를 한다.
2. 어떠한 작업을 진행하기에 앞서 소요 시간을 대략적으로 계산하고, 시간적 여유가 없다면 과감하게 내려놓는다.
다음 대회에는 이 2가지를 잘 보완하여 한 층 더 성장한 모습과 더불어 더 깊은 몰입감으로 다가오기를 기대한다.