Tworzenie podziałów czasowych
Na wideo omówiliśmy, dlaczego losowy podział danych może być niebezpieczny w przypadku szeregów czasowych – dane z przyszłości mogą powodować przeuczenie modelu. W przypadku szeregów czasowych często pozyskujemy nowe dane w miarę ich dostępności i chcemy ponownie trenować model na najnowszych danych. Na wideo pokazaliśmy, jak wykonać podział procentowy na zbiór testowy i treningowy, ale załóżmy, że chcesz trenować na wszystkich dostępnych danych z wyjątkiem ostatnich 45 dni, które mają posłużyć jako zbiór testowy.
W tym ćwiczeniu utworzysz funkcję wyznaczającą datę podziału, tak by ostatnie 45 dni danych trafiło do zbioru testowego, a pozostałe – do treningowego. Pamiętaj, że timedelta() zostało już zaimportowane ze standardowej biblioteki python o nazwie datetime.
To ćwiczenie jest częścią kursu
Inżynieria cech z PySpark
Instrukcje do ćwiczenia
- Utwórz funkcję
train_test_split_date(), która przyjmuje ramkę danychdf, kolumnę z datami używaną do podziałusplit_coloraz liczbę dni przeznaczonych na zbiór testowytest_days– ustaw dla niej domyślną wartość 45. - Wyznacz minimalne i maksymalne daty dla
split_colza pomocą,(). - Oblicz datę podziału na zbiór testowy i treningowy, odejmując
test_daysodmax_dateprzy użyciutimedelta(), które przyjmuje parametrdays– w tym przypadku przekaż do niegotest_days. - Używając
OFFMKTDATEjakosplit_col, wyznaczsplit_datei użyj jej do podzielenia ramki danych na dwie nowe:train_dfitest_df, gdzietest_dfzawiera wyłącznie ostatnie 45 dni danych. Zadbaj przy tym, bytest_dfobejmował tylko nieruchomości wystawione nie później niż w dniu podziału – odfiltrujdf['LISTDATE']tak, by była mniejsza lub równasplit_date.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
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)