시계열 분할 만들기
영상에서, 시계열 데이터는 무작위로 분할하면 미래의 데이터가 모델에 유입되어 과적합을 일으킬 수 있어 위험하다는 점을 배웠어요. 시계열에서는 보통 새로운 데이터가 생길 때마다 확보하게 되고, 최신 데이터로 모델을 재학습하고 싶을 때가 많죠. 영상에서는 학습/테스트 세트를 퍼센트 기준으로 분할하는 방법을 보여드렸지만, 여기서는 마지막 45일치 데이터를 테스트 세트로 두고, 나머지 모든 사용 가능한 데이터로 학습하고 싶다고 가정해 봅시다.
이번 연습에서는 마지막 45일치 데이터를 테스트로, 나머지를 학습으로 사용하기 위한 분할 날짜를 찾는 함수를 만들어 볼 거예요. 표준 python 라이브러리 datetime에서 timedelta()는 이미 임포트되어 있으니 참고하세요.
이 연습은 강의의 일부입니다
PySpark로 하는 Feature Engineering
연습 안내
- 데이터프레임
df, 분할에 사용할 날짜 컬럼split_col, 테스트 세트 일수test_days를 인자로 받고 기본값을 45로 하는 함수train_test_split_date()를 작성하세요. split_col의min과max날짜를,()를 사용해 구하세요.max_date에서test_days를 뺀 날짜를 분할 기준으로 사용하세요. 이때days매개변수를 받는timedelta()를 사용하며, 여기서는test_days를 전달하세요,OFFMKTDATE를split_col로 사용해split_date를 구하고, 이를 이용해 데이터프레임을train_df와test_df두 개로 필터링하세요.test_df는 마지막 45일치 데이터만 포함해야 합니다. 추가로,df['LISTDATE']가split_date이하인 주택만 포함되도록 필터링해test_df에 반영하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
def train_test_split_date(df, split_col, test_days=____):
"""Calculate the date to split test and training sets"""
# Find how many days our data spans
max_date = df.____({____: ____}).collect()[0][0]
min_date = df.____({____: ____}).collect()[0][0]
# Subtract an integer number of days from the last date in dataset
split_date = ____ - timedelta(days=____)
return split_date
# Find the date to use in spitting test and train
split_date = train_test_split_date(df, ____)
# Create Sequential Test and Training Sets
____ = df.where(df[____] < split_date)
____ = df.where(df[____] >= split_date).where(df[____] <= split_date)