서울 아파트 거래 정보를 기반으로 실거래가(target, 단위: 만원)를 예측하는 회귀 문제를 풀었습니다.
단순 모델 비교를 넘어서, 부동산 도메인에서 발생하는 특수 거래/이상 거래를 어떻게 모델 학습에 반영할지 실험했습니다.
- 입력 데이터: 아파트 위치, 단지 정보, 전용면적, 층, 건축연도, 거래시점, 좌표, 주변 교통 정보 등
- 예측 대상: 아파트 실거래가
target - 평가지표: RMSE
- 해석: RMSE는 예측 가격과 실제 가격의 평균적인 오차 크기입니다. 예를 들어 RMSE 7,060은 평균적으로 약 7,060만원 정도의 가격 오차가 난다는 뜻입니다.
부동산 가격은 지역, 면적, 연식, 거래시점에 따라 비교적 일관된 경향을 보입니다.
하지만 급매, 다운거래, 증여성 거래, 지인 거래 등으로 인해 같은 조건 대비 지나치게 낮거나 높은 거래가 존재할 수 있습니다.
이 프로젝트에서는 이런 거래를 무조건 제거하지 않고 다음처럼 처리했습니다.
같은 지역·아파트·면적 기준 중앙가격 대비 ±30% 이상 벗어나는 거래는 특수 거래 후보로 보고,
학습에서의 영향력을 낮춰 정상적인 시장 가격 경향을 더 잘 학습하도록 설계했습니다.
- 모델:
CatBoostRegressor - 타겟 변환:
log1p(target) - 이상치 처리: 제거하지 않고
sample_weight를 낮춤 - 범주형 처리: CatBoost의 categorical feature 처리 활용
- 검증: train/validation split 후 원래 가격 단위로 RMSE 계산
real_estate_price_portfolio_reconstructed/
├─ data/raw/ # 원본 데이터 위치, 실제 csv는 포함하지 않음
├─ src/
│ ├─ outlier_strategy.py # ±30% 이상치 판단 및 weight 생성
│ └─ train_catboost_outlier.py # 단일 실행 학습 스크립트
├─ notebooks/
│ └─ 01_reconstructed_pipeline.ipynb # 재구성 노트북
├─ docs/
│ ├─ portfolio_case_study.md # 포트폴리오용 정리문
│ ├─ experiment_log.md # 실험 로그 템플릿
│ ├─ eda_checklist.md # EDA 체크리스트
│ └─ interview_notes.md # 면접/발표 설명용 문장
├─ outputs/
├─ models/
├─ requirements.txt
└─ README.md
원본 데이터를 아래 위치에 넣습니다.
data/raw/train.csv
data/raw/test.csv
data/raw/sample_submission.csv
data/raw/bus_feature.csv
data/raw/subway_feature.csv
그 다음 실행합니다.
pip install -r requirements.txt
python src/train_catboost_outlier.py결과 파일은 다음 위치에 생성됩니다.
outputs/submission.csv
이 프로젝트는 단순히 CatBoost를 실행한 것이 아니라, 부동산 거래 데이터의 특성을 고려해 “모델이 무엇을 더 믿고, 무엇을 덜 믿게 할 것인가”를 설계한 실험입니다.