Zeitlich basierte Splits erstellen
Im Video haben wir gelernt, warum ein zufälliges Splitten bei Zeitreihen riskant ist: Daten aus der Zukunft können zu Overfitting führen. Bei Zeitreihen erhältst du oft neue Daten, sobald sie verfügbar sind, und möchtest dein Modell mit den neuesten Daten neu trainieren. Im Video haben wir gezeigt, wie man prozentuale Splits für Test- und Trainingsmengen erstellt. Angenommen, du willst auf allen verfügbaren Daten trainieren – außer auf den letzten 45 Tagen, die du als Testmenge verwenden möchtest.
In dieser Übung erstellen wir eine Funktion, die das Split-Datum ermittelt, sodass die letzten 45 Tage für das Testen und der Rest für das Training genutzt werden. Beachte, dass timedelta() bereits aus der Standardbibliothek python (datetime) für dich importiert wurde.
Diese Übung ist Teil des Kurses
<Kurs>Feature Engineering mit PySpark</Kurs>Übungsanweisungen
- Erstelle eine Funktion
train_test_split_date(), die ein DataFramedf, die Datumsspalte zum Splittensplit_colsowie die Anzahl der Tage für das Test-Settest_daysentgegennimmt und einen Standardwert von 45 fürtest_dayssetzt. - Ermittle die
min- undmax-Daten fürsplit_colmithilfe von,(). - Bestimme das Datum für den Split zwischen Test- und Trainingsmenge, indem du von
max_datetest_daysabziehst. Verwende dazutimedelta(), das einen Parameterdayserwartet; übergib hiertest_days. - Verwende
OFFMKTDATEalssplit_col, ermittlesplit_dateund filtere das DataFrame in zwei neue DataFrames,train_dfundtest_df, wobeitest_dfnur die letzten 45 Tage der Daten enthält. Stelle außerdem sicher, dasstest_dfnur Objekte enthält, die bis zum Split-Datum gelistet wurden, indem dudf['LISTDATE']auf kleiner oder gleichsplit_datefilterst.
Interaktive praktische Übung
Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.
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)