[Upstage AI Lab] [8주차] Regression 대회

라을·2024년 9월 8일

Upstage AI Lab

목록 보기
16/28

📌 대회 소개

개인 회고 작성 개요

  • 작성 내용(필수):
    • 나는 내 학습목표를 달성하기 위해 무엇을 어떻게 했는가?
    • 전과 비교해서, 내가 새롭게 시도한 변화는 무엇이고, 어떤 효과가 있었는가? (2번째 경진대회부터 해당)
    • 마주한 한계는 무엇이며, 아쉬웠던 점은 무엇인가?
    • 한계/교훈을 바탕으로 다음 경진대회에서 시도해보고 싶은 점은 무엇인가?
  • 작성 내용(선택/참고):
    • 나는 어떤 방식으로 모델을 개선했는가?
    • 내가 해본 시도 중 어떠한 실패를 경험했는가? 실패의 과정에서 어떠한 교훈을 얻었는가?
    • 협업 과정에서 잘된 점/ 아쉬웠던 점은 어떤 점이 있는가?
  • 작성 시 유의사항:
    • 경진대회 Fast-Up에서 작성한 내용과 중복되지 않게 ‘개인’의 입장에서 경진대회를 회고해 주세요.
    • 팀 내 자신의 역할, 경진대회에서 사용한 자신의 기술 및 지식, 모델링 및 성능 개선 등 경진대회 전 과정에서 자신이 기여한 내용과 개인의 구체적 성과를 정리해주세요.
    • 기술적 지식 뿐만 아니라 갈등 관리 및 커뮤니케이션, 협업 역량 등 여러 가지 측면에서 자신의 역량이 잘 드러날 수 있도록 회고 내용을 기록해주세요!
    • 경진대회 뿐만 아니라 동료를 통해서 내가 어떤 것을 배웠고, 경진대회 과정에서 내가 마주한 어떤 어려움을 어떻게 극복했는지 등 자신의 이야기가 온전히 담길 수 있도록 작성해주세요.

개인 회고 작성 세부 가이드라인

  • 리포트에서의 개인 회고글은 경진대회 기간 동안 내가 시도한 기술적인 도전, 학습과정에서의 교훈, 마주한 한계와 도전숙제 등을 담아 정리하면서 학습의 주체로서 무엇을 어떻게 해봤고, 무엇을 얻었는지에 대해 스스로 회고하고 하나의 논리적인 흐름의 콘텐츠를 만드는 데 목적이 있습니다.
  • 실무에서는 일을 잘하는 것 못지 않게 논리적으로 커뮤니케이션하고, 지속적인 기록을 기반으로 성장을 이어가는 것이 보편적입니다. AI 기술학습에 대한 학습을 통해 실무에서 일을 잘하는 여러분을 기대합니다!
  • 예시:
    • 나는 내 학습목표를 달성하기 위해 무엇을 어떻게 했는가?
      • 우리 팀과 나의 학습목표는 무엇이었나?
      • 개인 학습 측면
      • 공동 학습 측면
    • 나는 어떤 방식으로 모델을 개선했는가?
      • 사용한 지식과 기술
    • 내가 한 행동의 결과로 어떤 지점을 달성하고, 어떠한 깨달음을 얻었는가?
    • 전과 비교해서, 내가 새롭게 시도한 변화는 무엇이고, 어떤 효과가 있었는가?
    • 마주한 한계는 무엇이며, 아쉬웠던 점은 무엇인가?
    • 한계/교훈을 바탕으로 다음 경진대회에서 스스로 새롭게 시도해볼 것은 무엇일까?

팀 리포트

1. 경진대회 개요

  • 경진대회 주제
  • 경진대회 구현 내용, 컨셉, 교육 내용과의 관련성 등
  • 활용 장비 및 재료(개발 환경, 협업 tool 등)
  • 경진대회 구조 및 사용 데이터셋의 구조도(연관도)

2. 경진대회 팀 구성 및 역할 (팀원 별로 주도적으로 참여한 부분을 중심으로 간략히 작성)

  • 예시:
    • 정업스(팀장): 팀의 기본적인 목표 설정 및 협업 리딩, ㅇㅇㅇ 프레임워크 설정
    • 최수업(팀원): ㅇㅇㅇ 모델 설계 및 실험, ㅇㅇㅇ 모델 튜닝

3. 경진대회 수행 절차 및 방법

  • 경진대회의 기획과 수행 및 완료 과정이 드러나게 작성해 주세요.
  • 실제 경진대회를 수행한 세부적인 기간과 활동 내용, 절차 등을 포함해도 좋습니다. (e.g. 경진대회 Road Map 형식 / 경진대회 WBS 형식, 경진대회 마일스톤 형식 등)

4. 경진대회 수행 결과

  • 경진대회 결과물이 도출된 과정을 세부적으로 기록합니다.
  • 활용된 기술(구현 방법), 핵심 기능, 검증 결과 등을 기재합니다.
  • 경진대회의 과정이 잘 드러날 수 있도록 데이터 전처리 과정부터 활용까지 전체적인 프로세스를 확인할 수 있도록 단계별로 작성하시기 바랍니다. (요약적, 유기적, 논리적으로 작성할 수 있도록 유의해주세요!)
    • 탐색적 분석 및 전처리 (학습데이터 소개)
    • 모델 개요
    • 모델 선정 및 분석
    • 모델 평가 및 개선
    • 시연 결과
      • 모델 성능
      • 결과물 사진/ 시연 동영상 등 선택적 포함

5. 자체 평가 의견

  • 경진대회 결과물에 대한 경진대회 의도와의 부합 정도 및 실무활용 가능 정도, 계획 대비 달성도, 완성도 등 자체적인 평가 의견과 느낀점을 포함합니다.
  • 팀 차원에서 잘한 부분과 아쉬운 점을 작성합니다. (팀 별 공통 의견 중심으로 작성하며, 분량을 고려하여 개인적인 의견은 개인 회고 부분에서 작성할 수 있도록 합니다.)
    • 잘한 점들
    • 시도 했으나 잘 되지 않았던 것들
    • 아쉬웠던 점들
    • 경진대회를 통해 배운 점 또는 시사점

✒️ 기록

📍bus-station density, subway-station density

import pandas as pd
import numpy as np
from shapely.geometry import Point
import geopandas as gpd
from geopandas.tools import sjoin
import pyproj
from tqdm import tqdm

def preprocess_data(df, x_col, y_col):
    wgs84 = pyproj.CRS('EPSG:4326')  # WGS84 좌표계 (위도, 경도)
    utm_k = pyproj.CRS('EPSG:5179')  # UTM-K 좌표계 (한국)
    project = pyproj.Transformer.from_crs(wgs84, utm_k, always_xy=True).transform
    
    df['geometry'] = df.apply(lambda row: Point(project(row[x_col], row[y_col])), axis=1)
    return gpd.GeoDataFrame(df, geometry='geometry', crs=utm_k)

def calculate_density(gdf_real_estate, gdf_locations, radius):
    gdf_real_estate['buffer'] = gdf_real_estate.geometry.buffer(radius)
    
    joined = sjoin(gdf_locations, gdf_real_estate.set_geometry('buffer'), how='inner', predicate='within')
    
    density = joined.groupby(joined.index_right).size().rename('density')
    
    return gdf_real_estate.join(density, how='left').fillna(0)['density']

def process_in_chunks(df, locations_gdf, radius, chunk_size=10000):
    results = []
    for i in tqdm(range(0, len(df), chunk_size)):
        chunk = df.iloc[i:i+chunk_size]
        chunk_gdf = preprocess_data(chunk, '좌표X', '좌표Y')
        density = calculate_density(chunk_gdf, locations_gdf, radius)
        results.append(density)
    return pd.concat(results)

# 버스 정류장과 지하철역 데이터 전처리
bus_gdf = preprocess_data(dt_bus, 'X좌표', 'Y좌표')  # 버스 정류장 좌표계 변환

# 지하철 데이터는 위도, 경도 데이터를 X, Y로 변환
subway_gdf = preprocess_data(dt_subway, '경도', '위도')  # 지하철 데이터도 동일하게 좌표 변환

# 반경 설정
bus_radius = 500  # 미터 단위
subway_radius = 1000  # 1km를 미터 단위로 표현

# 청크 크기 설정
chunk_size = 10000

print("버스 정류장 밀도 계산 중 (500m 반경)...")
concat['bus_stop_density_500m'] = process_in_chunks(concat, bus_gdf, bus_radius, chunk_size)

print("지하철역 밀도 계산 중 (1km 반경)...")
concat['subway_station_density_1km'] = process_in_chunks(concat, subway_gdf, subway_radius, chunk_size)

# 결과 출력
print(concat[['좌표X', '좌표Y', 'bus_stop_density_500m', 'subway_station_density_1km']].head())

RMSE : 8432.15101327254

📍위 내용 + 기준금리

#첫 번째 행을 '날짜', 두 번째 행을 '기준금리'로 변환
dt_rate = pd.DataFrame({
    '날짜' : dt_rate.iloc[0, :].values, #세로로 변환
    '기준금리' : dt_rate.iloc[1, :].values
})

dt_rate.reset_index(drop=True, inplace=True)

print(dt_rate.head())

#날짜에서 '월' 지우기
dt_rate['날짜']=dt_rate['날짜'].str.replace('월','')

#데이터타입 일치시키기
dt_rate['날짜'] = dt_rate['날짜'].astype(int)
concat['계약년월'] = concat['계약년월'].astype(int)

# 병합 과정에서 누락되는 것을 방지하기 위해, 계약년월과 기준금리가 일치하는지 직접 확인하는 방식으로 병합
concat['기준금리'] = concat['계약년월'].map(dt_rate.set_index('날짜')['기준금리'])

#날짜 컬럼 제거
#concat.drop(columns='날짜', inplace=True)

#기준금리 데이터타입 변환
concat['기준금리']= concat['기준금리'].astype(float)

#결과 출력
print(concat.head(5))

# 결측치 확인
print(f"기준금리 결측치 수: {concat['기준금리'].isnull().sum()}")

RMSE test: 8336.50080272665

📍weighted_combined_station_density


# 만약 가중치를 적용하고 싶다면:
bus_weight = 0.5  # 예: 버스 밀도에 가중치 0.5
subway_weight = 0.8  # 예: 지하철 밀도에 가중치 0.7

concat['weighted_combined_density'] = (concat['bus_stop_density_500m'] * bus_weight + 
                                       concat['subway_station_density_1km'] * subway_weight)
                                       
concat= concat.drop(columns=['bus_stop_density_500m','subway_station_density_1km'])

RMSE test: 8326.393583335255

로컬에서는 RMSE가 낮게 나오는데, submit 해보니까 RMSE가 훌쩍 뛰어버리는 경우를 보고.. 오버피팅 나는 부분을 잡아보자는 생각에 지하철,버스 밀도를 합친 피처를 만들어보았다!


📌 다른 팀 발표 후 회고

다음 정보들을 더한다면 더 좋은 성능이 나올 수 있을 것 같다

  • 층수 영향 분석 : 지하층 데이터는 가격이 낮음
  • 이상치 처리 : 전용면적 상한을 122.92키터-> 280미터로 수정
  • 금리와 1인당 총국민소득 데이터를 신규 변수로 추가


📌 참고 링크

https://sincere-nova-ec6.notion.site/Fast-Up-Report-Guide-6e9ab2d757ef483ea9515e1f4b1e99b5

https://dacon.io/edu/1016/
https://dacon.io/competitions/official/21265/overview/description

https://stages.ai/competitions/331/server/vpn

profile
욕심 많은 공대생

0개의 댓글