학습 목표 및 접근 방법
우리 팀의 개인과 팀의 학습 목표는 동일한 방향을 가졌다. 경진대회 순위도 중요했지만, 더 중요한 것은 개인의 역량 향상이었다. 팀원 모두 이번 경진대회를 학습의 기회로 삼아 각자의 역량을 강화하기로 했다.
우선 직전에 배운 강의 내용을 실제 경진대회에 적용할 수 있을 정도로 이해하는 것부터 시작했다. 베이스코드가 있어서 그 코드를 실행해 보며 전체적인 흐름을 파악한 뒤, 팀원들과 함께 어떤 외부 데이터를 가져와야 부동산 시세 예측에 도움이 될지 회의했다. 매일 오전 10시, 오후 2시, 필요시에는 (거의 매일) 오후 4~5시에도 회의를 열어 활발하게 아이디어를 공유하고 토론했다.
이 과정에서 지하철역 인접 변수를 파생변수로 추가하고, 각 지역구의 ‘대장 아파트’와의 거리 계산을 통해 파생변수를 생성했다. 팀원들은 각기 다른 변수들로 다양한 시도를 했고, 로그 스케일링, 초등학교와의 거리, 금리 등 다양한 피처 엔지니어링을 적용했다.
멘토링을 통해 얻은 인사이트
경진대회 중간에 멘토링 시간에 기술적인 방법 뿐만 아니라 전반적인 인사이트를 얻었다.
1. 피처 엔지니어링 및 모델 성능 개선
- 피처 임팩트 측정 방법
세 가지 변수를 (X, Y 결측치 채우기, 지역구 라벨링 추가, 인접 지하철역 개수 추가) 함께 결합하여 모델 성능을 확인한 결과, 각각의 변수 추가가 비슷한 정도로 성능을 개선하는 것을 확인했다.
여러 변수를 함께 넣었을 때의 성능 개선이 개별 변수의 성능 개선과 비슷했으며, 이는 변수 간 상관관계가 존재할 가능성을 시사한다.
머신러닝 모델에서 개별 변수의 임팩트를 정확하게 측정하는 것은 어렵다. 변수 간 상관관계가 있을 수 있기 때문에 변수 하나를 넣었을 때와 여러 변수를 함께 넣었을 때의 성능이 단순히 더해지지 않는다.
변수들의 상관관계를 확인하기 위해서는 상관 계수 또는 VIF(Variance Inflation Factor)를 사용하여 상관성이 높은 변수들 간의 관계를 시각화하고 확인할 수 있다. 이를 통해 어떤 조합의 변수가 상관관계를 형성하고 있는지 추측할 수 있다.
- 회귀분석과 머신러닝의 차이점
회귀분석에서는 각 변수의 개별적인 임팩트를 확인하는 것이 중요하다. 변수 간 상관관계가 높지 않도록 주의하면서 다중공선성을 피하기 위해 VIF를 계산하고, Adjusted R²을 사용하여 변수 간의 상관관계가 설명력을 과대평가하는 것을 방지한다.
반면, 머신러닝에서는 상관관계가 있는 변수를 포함하더라도 최종 목표는 예측 성능을 극대화하는 것이다. 상관관계에 크게 신경 쓰지 않고 모든 변수를 투입하는 경향이 있다. 따라서 머신러닝에서는 피처의 개별적 영향력을 분석하기 어려운 경우가 많다.
- 피처 임팩트 측정 방법
피처 임포턴스를 통해 변수의 상대적인 중요도를 확인할 수 있지만, 이는 회귀분석처럼 변수의 절대적 영향력을 설명하는 것이 아니다. 변수 몇 개를 제외하면 피처 임포턴스 값 자체도 달라지기 때문에, 이를 절대적인 기준으로 삼을 수는 없다.
개별적으로 변수를 넣어가며 RMSE를 비교하는 방법도 있지만, 그 값이 단순히 더해지지 않기 때문에 변수 간 상관관계를 고려해야 한다.
2. 동일 코드에서 다른 성능 발생 문제
- 랜덤 시드 고정 여부
동일한 코드에서 다른 성능이 나온다면, 랜덤 시드를 고정하지 않은 것이 원인일 수 있다. 데이터 분할 방법에서도 random_state를 고정하고, 모델 내에서도 random_state를 고정하는 것이 중요하다.
훈련과 검증 데이터가 실제로 동일한지 확인하고, 동일한 조건에서 결과가 나오도록 시드 설정을 철저히 해야 한다. - 라이브러리 버전 여부
라이브러리의 버전이 상이할 수 있다.
3. RMSE와 대회 성능 차이
- RMSE 차이 원인
로컬에서 확인한 RMSE와 대회에서 제출한 후 RMSE 점수가 다르게 나오는 것은 대회의 특성 중 하나이다. 실제로 여러 참가자가 동일한 문제를 겪으며, 이는 대회의 일환으로 실력을 발전시킬 수 있는 기회로 활용해야 한다.
RMSE는 큰 값과 작은 값의 차이를 강조하는 특성이 있기 때문에 변수가 큰 값에 해당하는 경우 RMSE 값이 더 크게 나올 수 있다. 타겟 변수의 값이 큰 경우(부동산 시세에서는 값이 큰 경우에 속한다)에는 다른 지표를 고려하는 것이 좋다.
MAE(Mean Absolute Error)나 R² 점수 같은 다른 평가지표도 고려할 수 있다.
4. 경진대회 진행 방식 및 피처 엔지니어링
- 경진대회를 처음 참가하는 경우 분석, 제출, 리더보드 확인 등의 과정을 반복하며 성능을 개선하는 것이 중요하다.
- 팀원들과 레슨앤런을 공유하면서 서로의 작업을 피드백하고, 효율적인 피처 엔지니어링을 수행하는 것이 중요하다.
- 피처를 무분별하게 추가하기보다는 의미 있는 피처를 중심으로 실험하고, 각 피처의 효과를 공유하면서 협력하는 방식이 바람직하다. 피처가 의미 없다고 판단되면 제거하거나 다른 방식으로 실험하는 피드백을 통해 개선할 수 있다.
5. 결론
- 피처 엔지니어링: X, Y 좌표 관련 변수 추가와 같은 다양한 피처 엔지니어링은 긍정적인 결과를 기대할 수 있다. 다만, 다양한 모델을 테스트해 보는 것이 중요하며, LightGBM 외에도 XGBoost, Random Forest와 같은 모델을 함께 시도해볼 수 있다.
- 검증 방법: 시계열 데이터의 특성을 고려한 TimeSeriesSplit과 같은 검증 방법을 추천한다.
한계와 아쉬웠던 점
모델을 개발하는 과정에서 특히 예측 오류와 이상치 처리에서 많은 어려움을 겪었다. 부동산 가격은 지역에 따라 큰 차이가 있었는데, 서울에서도 천문학적으로 비싼 동네가 있는 반면, 서울 내에서도 비교적 저렴한 지역들이 존재했다. 이때, 모든 비싼 지역이나 저렴한 지역을 단순히 이상치로 처리하면 안 되지만, 이러한 지역에 대해 모델이 극단적인 예측값을 도출하는 문제가 발생했다.
특히, 일부 예측값이 너무 낮거나 너무 높게 나오는 경우가 있었는데, 이를 어떻게 정상적인 범위 내에서 수정할지에 대한 구체적인 해결 방법을 찾지 못한 점이 아쉬웠다. 예를 들어, 극단적인 예측값을 어떻게 대체하거나 보정할지에 대한 명확한 기준을 세우지 못했다. 이 문제를 해결하지 못한 채로 모델을 진행하다 보니, 결국 이상치 데이터 처리에 대한 한계가 있었다고 느꼈다.
또한, 변수 추가와 성능 개선 부분에서도 아쉬움이 남았다. 변수들을 추가하면서 성능이 개선되었지만, 그 이유를 명확하게 파악하지 못했다. 각각의 변수가 성능에 미친 영향을 하나씩 분석하기보다는 여러 변수를 넣어보고 성능이 개선된 것을 확인한 후, 나중에야 하나씩 변수를 빼보면서 어떤 요소가 성능 개선에 기여했는지를 파악하는 방식으로 진행했다. 즉, 사전에 가설을 세우고 실험하는 구조적인 방법보다는 여러 요소를 동시에 넣어보고 결과를 확인하는 방식으로 진행했기에, 특정 변수의 기여도를 명확하게 분석하지 못한 점이 아쉬웠다.
이러한 문제는 실험 과정에서 더 체계적인 방법론을 사용하지 못했기 때문이라고 생각한다. 변수 추가나 모델 개선 과정에서 사전에 어떤 변수가 예측 성능에 영향을 줄 것이라는 가설을 세우고, 그 가설을 바탕으로 실험을 진행했다면 더 명확한 인사이트를 얻었을 것이다.
경진대회 결과
Public 2등, RMSE 15042.1302
Private 3등, RMSE 12518.1396
우리는 Public 리더보드(Mid) 2등, Private 리더보드(Final) 3등이라는 좋은 결과를 얻었다.
한계와 교훈을 바탕으로 한 다음 경진대회 계획
(last 모델이 최종 제출한 모델이다.)
위 사진을 보면 중간 RMSE가 낮지 않았던 모델 중에서도 최종 RMSE가 더 좋게 나온 모델들이 있었다. 이를 통해 중간 RMSE에만 의존하지 않고, 다양한 예측 능력을 가진 모델을 최종 제출하는 전략이 중요함을 배웠다.
다음 경진대회에서는 중간 RMSE가 낮은 모델에만 의존하기보다는 다양한 데이터에 잘 맞는 모델을 선택할 계획이다. 특히, n_estimators를 15000으로 준 모델이 가장 좋은 결과를 낸 것처럼, 다양한 파라미터 튜닝과 더 많은 시도를 통해 최종 제출 모델을 결정해야겠다는 교훈을 얻었다.
자체 평가 및 개선점
잘했던 점
- 경진대회에서 사용할 수 있는 외부 데이터를 미리미리 찾아놓아서 실제로 필요할 때 데이터를 찾는 시간을 절약할 수 있었다. 덕분에 실험에 집중할 수 있었고, 빠르게 작업을 진행할 수 있었다.
- 각 실험에서 어떤 변화를 주었는지 세세하게 기록하여, 어떤 부분이 모델 성능을 개선하는 데 기여했는지 명확하게 파악할 수 있었다. 이를 통해 실험의 효율성을 높일 수 있었다.
- 팀원들과 자주 회의를 진행하면서 지속적으로 프로젝트에 몰두했다. 특히 10시에서 19시까지는 쉬지 않고 몰입했으며, 개인 시간에도 꾸준히 진행했지만 무리하게 밤을 새우는 등의 무리한 작업을 피하면서 효율적으로 일할 수 있었다.
시도했으나 잘 되지 않았던 것들
- 부동산 시세는 시계열 데이터의 성향을 가지고 있다고 판단하여 TimeSeriesSplit과 group k-fold 등을 시도해 보았으나, 실질적인 성능 개선에는 큰 도움이 되지 않았다. 데이터 전처리가 더 철저하게 이루어졌어야 했다는 아쉬움이 있지만, 그래도 시계열 데이터라는 점을 고려해 시도했던 것은 합리적이었다고 생각한다.
- 부동산 시세에 실질적으로 영향을 미칠 수 있는 ‘아파트 커뮤니티 시설’이나 ‘GTX 여부’ 등의 데이터를 활용하려고 했지만, 이런 데이터를 찾기 어려웠고, 찾더라도 이를 수치화하여 학습 데이터에 통합하는 방법이 애매하여 실제로 시도해보지 못했다.
아쉬웠던 점들
- 명확한 인과관계를 가정하고 실험을 진행하기보다는, 단순히 부동산 시세에 영향을 줄 것 같은 데이터를 가져와서 테스트해 보는 방식으로 진행했다. 앞으로는 데이터와 성능 사이의 인과관계를 생각하여 유의미한 가설을 세우고, 그 가설을 바탕으로 실험을 진행하는 방식을 도입할 필요가 있다.
- 세세한 기록을 남기는 습관이 부족했다. 앞으로는 더 체계적으로 기록하고, 모든 실험 과정과 결과를 꼼꼼하게 남기는 습관을 들이려고 한다.
프로젝트를 통해 배운 점 또는 시사점
- 어떤 요소가 모델 성능 개선에 기여할지 알 수 없으니 일단 모두 시도해보는 실험 정신이 중요한 교훈이었다. 다양한 변화를 시도하면서 성능이 개선되는 요소를 발견할 수 있었고, 이러한 접근 방식이 새로운 인사이트를 얻는 데 도움이 되었다.
'Upstage AI Lab 4기' 카테고리의 다른 글
[CV 경진대회] K-fold 적용 (0) | 2024.11.04 |
---|---|
[CV 경진대회] 데이터 증강 기법, ViT 모델 사용 (0) | 2024.11.04 |
[팀프로젝트] 페르소나를 이용한 오은영 박사님 챗봇 (2) - chat history와 주제와 관계 없는 질문 회피 (1) | 2024.08.19 |
[팀프로젝트] 페르소나를 이용한 오은영 박사님 챗봇 (1) 데이터 수집 및 임베딩, 쿼리 테스트 (0) | 2024.08.13 |
[송인서 강사님] AI Engineer로의 첫걸음 + OT 후기 (1) | 2024.07.16 |