스터디그룹 대회참여/모듈 스터디 2차(Upstage 대회 참여)

ML 경진대회 개인 보고서 (Feat.Upstage)

김뚱입니다 2024. 1. 31. 05:54

[Fast-Up Report Guide 1을 기반으로 작성]

1. Abstract

  • Goal of the Competition
    • House Price Prediction | 아파트 실거래가 예측
    • 2007.01.01 ~ 2023.06.30 기간의 데이터를 학습데이터로 이용하여, 2023.07.01 ~ 2023.09.26 기간의 데이터를 평가데이터로 구성
    • 평가지표는 RMSE를 사용. 회귀 모델이 실제 거래 가격의 차이를 얼마나 잘 잡아내는지 확인
      • 따라서 Public 리더보드를 참고하여 private 리더보드(최종)에서 최대한 낮은 RMSE Score를 기록하는 것이 목표
  • Timeline
    • January 15, 2024 - Start Date
    • January 25, 2024 - Final submission deadline
  • Description of the work
    • 팀원들과 데이터 EDA 진행
    • 데이터셋의 컬럼별로 특징 분석 후 피처엔지니어링에 집중
      • 학습에 사용할 컬럼들 분리
      • 아파트 실거래가에 영향을 미칠 것이라 생각한 피처 추가
        • kaggle, dacon에서 열렸던 유사한 대회 참고
        • 각자 조사한 내용을 참고
    • 간단한 Tree 모델을 사용하여 피처별로 RMSE 값 기록
    • 동일한 데이터셋으로 팀원별 코드를 작성하여 RMSE 값 공유
      • 팀원별로 하이퍼파라미터 최적화, 모델링을 진행하여 다양성을 높였음
    • Public 리더보드 RMSE Score를 참고하여 최종 제출 파일 결정 

2. Process : Competition Model

  • Describe the structure of your System.
    • 데이터 전처리
      • 팀 회의에서 유의미한 컬럼들만 분리하여 최종 데이터 셋에 저장
      • 결측치 처리에 공공데이터도 사용하였음
    • 피처엔지니어링
      • 이전가격
        • 단기적으로는 직전 시세가 가장 중요함
        • 최근 3년간 데이터만 학습하기로 했으므로 동일 아파트, 동일 면적에 대한 직전 거래 가격을 이전 가격 피처로 추가
      • 한강과의 거리
        • 한강 지나가는 곳의 사각형의 중앙을 기준으로 한강의 위도 계산
        • 좌상단 위경도 : 난지한강공원 기준
        • 우하단 위도 : 반포수난구조대 기준
        • 우하단 경도 : 고덕수변생태공원 기준
      • 구별 1인당 평균급여
        • 국가통계포털 KOSIS의 시군구별 근로소득 연말정산 신고현황 데이터 활용
        • 금액 / 인원 = 1인당 평균급여(구 별)
        • 16~21년도의 서울시 구 별 1인당 평균급여 계산
      • 가장 가까운 거리에 있는 학교와의 거리
        • 아파트에 가까운 학교가 있다면 'target' 값에 영향을 줄 것이라 가정
        • 따라서 초, 중, 고등학교에 구분 없이 가장 가까운 학교와의 거리 피처 추가
        • 공공데이터의 학교 별 위도, 경도 데이터와 아파트 위도, 경도 데이터를 harversine distance로 계산하여 새로운 피처로 추가
      • 버스 정류장과의 거리
        • 주변의 교통시설 여부에 따라 집값에 영향이 있을 것이라 가정
        • 공공데이터의 위도, 경도 데이터를 이용해서 각 데이터마다 일정 거리 이내에 버스 정류장 이 몇 개가 있는지를 기준으로 버스 정류장의 총합을 계산한 피처 추가
        • harversine distance로 계산하였음
    • 최적화
      • 팀원별로 코드를 따로 작성하였음
      • 제가 사용한 방법
        • GridSearchCV를 첫 번째로 사용하여 로컬에서 RMSE 값을 기록
        • Optuna를 두 번째로 사용하여 로컬에서 RMSE 값을 기록
    • 모델링
      • 결과적으로 마지막에 사용한 코드
        • 이상치 제거(IQR), Optuna, KFold 사용
        • LGBM & Extra Trees Regressor(기본모델) + 선형회귀(메타모델) -> stacking ensemble
    • 로컬에서의 RMSE 값 기록
      • Train RMSE Score : 2052.4353
        Train MSE Score : 4212490.7444
      • Valid RMSE Score : 10480.6916
        Valid MSE Score : 109844895.6052
      • Test RMSE Score : 15982.0471
        Test MSE Score : 255425828.1306
    • 결과 예측
      • 제출 횟수가 얼마 남지 않은 상태에서 로컬 RMSE 값을 팀원들과 공유하여 제일 낮은 것을 선택하였음
        • 제 로컬 RMSE 값이 다른 코드 RMSE 값보다 높았으므로 대회에 최종 제출하지 않았음

3. Process : Issues

  • Describe the issue that your team faced during the project.
    • 모델링보다 피처엔지니어링에 집중하는 것이 결과 향상에 직결될 것이라 생각하였음
    • 따라서 사용할 피처를 분류하고 새로운 피처를 추가하였음
    • 하지만 피처엔지니어링에 집중할수록 Public 리더보드에서 RMSE 값이 좋지 않았음
      • RMSE 값이 베이스라인 코드에 비해 크게 달라지지 않음
      • Public 리더보드의 RMSE 값을 기준으로 코드 작성 방향을 설정하였는데, 새로운 시도를 하더라도 RMSE 값이 향상되지 않아서 딜레마에 빠졌음
  • Describe the reason for the issue.
    • 팀 내부적으로 검토한 결과 Public 리더보드의 RMSE 값이 변하지 않는 이유가 대회 평가 데이터가 잘못되었다고 확신하였음
      • 특히 엄효범 님이 공유해 주신 방법이 85K를 기록하였는데, 이 코드로 만들어진 csv 파일을 분석한 결과 고가의 아파트를 낮은 가격으로 예측했는데도 85k라는 점수를 기록했음
      • 위 결과에서 높은 가격의 아파트들의 예측값을 따로 학습시킨 결과를 결합하여 제출하였는데, PB score가 더 좋지 않게 나오는 것을 보고 대회 평가가 정확하지 않다고 확신하였음
  • Describe the possible solution to imporve your project.
    • 대회 평가데이터가 잘못되었다고 확신을 가진 뒤 멘토분께 실시간 멘토링을 통해 의문을 제기하였음
      • 하지만 대회가 끝날 때 까지 유의미한 피드백을 받지 못함
        • 대회 주최자 분과 연락이 닿지 않는다고 하셨음
        • 따라서 발표에서 PPT를 통해 자체적으로 테스트한 결과를 공유하여 대회 테스트 데이터가 이상한 점을 공유하였음

4. Role

  • Describe your role with task in your team.
    • [가장 가까운 거리에 있는 학교와의 거리] 피처를 공공데이터를 이용하여 계산하여 추가하였음
    • 엄효범님이 공유하신 방법으로 최적화, 모델링 후 결과 기록하여 공유
      • 더보기
        [모든 시도는 전 단계의 코드를 수정]
        2020년 이후의 데이터 사용
        X = df_train[['전용면적', 'x']]
        y = df_train['price']
        test = df_test[['전용면적', 'x']]

        [Try-0]
        SJY_LGBM.ipynb
        *효범님 코드 그대로 따라한 코드*
        RMSE:  67394.02934576674
        MSE:  4541955191.45807
        [PBL RMSE : 89689.2585]

        [Try-1]
        SJY_LGBM_upgrade.ipynb
        위 코드에서 baseline의 이상치 제거(IQR)만 추가
        이상치 제거(IQR), LGBM 사용
        RMSE:  51888.533674683604 (향상)
        MSE:  2692419926.9087744 (향상)

        [Try-2]
        SJY_LGBM_upgrade2.ipynb
        이상치 제거(IQR), LGBM, KFold 사용
        Average RMSE:  51882.63722090446 (향상-큰 차이 x)
        Average MSE:  2692519797.9808455 (향상-큰 차이 x)

        [Try-3]
        SJY_LGBM_upgrade3.ipynb
        이상치 제거(IQR), GridSearchCV, KFold, LGBM 사용
        Average RMSE:  51120.51528032164 (향상)
        Average MSE:  2614039934.829773 (향상)

        [Try-4]
        SJY_LGBM_upgrade4.ipynb
        이상치 제거(IQR), Optuna, KFold, LGBM 사용
        Average RMSE:  44969.722806500955 (향상)
        Average MSE:  2024885585.2284265 (향상)

        [Try-5] (X)
        SJY_LGBM_upgrade5.ipynb
        이상치 제거(IQR), Scaler, Optuna, KFold, LGBM 사용
        Average RMSE:  45310.52190259858 (감퇴)
        Average MSE:  2055687899.101036 (감퇴)
        감퇴했으므로 Try-5는 이용하지 않고, Try-6은 Try-4를 기반으로 수정

        [Try-6]
        SJY_LGBM_upgrade6.ipynb
        이상치 제거(IQR), Optuna, KFold
        LGBM(기본모델) + 선형회귀(메타모델)-> stacking ensemble
        Average RMSE:  32622.845142662834 (크게 향상)
        Average MSE:  1064756063.3237922 (크게 향상)

        [Try-7]
        SJY_LGBM_upgrade7.ipynb
        이상치 제거(IQR), Optuna, KFold
        LGBM & Extra Trees Regressor(기본모델) + 선형회귀(메타모델)-> stacking ensemble
        Average RMSE:  11416.153423597494 (크게 향상)
        Average MSE:  130559586.11656937 (감퇴)
        [PBL RMSE : 98223.8338]
    • 팀원들과 공통된 데이터셋을 이용하여 모델링 후 결과 공유
  • Describe papers or book chapeters you found relevant to the problem, references to see.
  • Explain which are relevant for your Project.
    • 케글 대회에서 높은 점수를 기록한 사람들이 공유한 코드들을 참고
      • 사용한 모델, 앙상블 방법 참고
    • 데이콘 대회에서 수상한 사람들이 사용한 피처들 참고
      • 대장아파트 거리, 버스 정류장과의 거리, 한강거리, 학교와의 거리 피처 추가하는데 참고

5. Results

  • Write the main result of Competition
    • 저희 팀의 대회 주요 결과는 평가 데이터셋이 잘못되었다는 것을 증명하기 위해 모든 target 값에 2023.01 ~ 2023.06 기간 동안의 모든 실거래가의 평균을 넣었는데 최종 리더보드에 2등으로 마무리되었습니다.
  • Final standings of the Leaderboard
    • 최종 리더보드 순위 2위 (평가 데이터 수정 전)
    • 최종 리더보드 순위 5위 (평가 데이터 수정 후)

6. Conclusion

  • Describe your running code with its own advantages and disadvantages, in relation to other groups in the course.
    • 사실 평가 데이터 셋이 변경되기 전 Public RMSE 값이 정확하지 않았으므로 제대로 된 방향을 잡지 못하고 방황
    • 따라서 최종 제출한 csv 파일 선택에 문제가 있었고, 평가 데이터 셋이 변경된 이후에는 5위로 떨어짐
    • 피처 추가는 대회에 참여한 팀 중에 제일 많이 하였는데, 제대로 활용하지 못하고 마무리된 것이 아쉬움
  • Sum up your project and suggest future extensions and improvements.
    • 만약 평가 데이터가 제대로 되어 있었다면, 추가한 피처들을 사용하여 여러 ML, DL 모델들을 사용하여 학습한 결과를 제출 후 점수를 기록하여 어떤 방향으로 나아가야 할지 정했을 것이고, 제대로 모델링에 집중할 수 있었을 것이라 생각함