Créer des partitions temporelles
Dans la vidéo, nous avons vu pourquoi un découpage aléatoire peut être risqué pour les séries chronologiques : des données futures peuvent entraîner du surapprentissage dans notre modèle. Souvent, avec les séries temporelles, vous obtenez de nouvelles données au fur et à mesure et vous voudrez réentraîner votre modèle avec les plus récentes. Dans la vidéo, nous avons montré comment effectuer une répartition en pourcentage pour les ensembles d'entraînement et de test, mais supposons que vous souhaitiez entraîner sur toutes les données disponibles sauf les 45 derniers jours, que vous utiliserez comme ensemble de test.
Dans cet exercice, nous allons créer une fonction pour trouver la date de coupure afin d'utiliser les 45 derniers jours de données pour le test et le reste pour l'entraînement. Veuillez noter que timedelta() a déjà été importée pour vous depuis la bibliothèque standard python datetime.
Cette activité fait partie du cours
Ingénierie des caractéristiques avec PySpark
Instructions de l’exercice
- Créez une fonction
train_test_split_date()qui prend en entrée un dataframedf, la colonne de date à utiliser pour la coupuresplit_colet le nombre de jours à utiliser pour l'ensemble de testtest_days, avec une valeur par défaut de 45. - Trouvez les dates
minetmaxpoursplit_colen utilisant,(). - Déterminez la date de coupure entre test et entraînement en partant de
max_dateet en soustrayanttest_daysà l'aide detimedelta(), qui accepte un paramètredays; dans ce cas, transmetteztest_days. - En utilisant
OFFMKTDATEcommesplit_col, trouvezsplit_dateet servez-vous-en pour filtrer le dataframe en deux nouveaux dataframes,train_dfettest_df, oùtest_dfcorrespond uniquement aux 45 derniers jours de données. Assurez-vous également quetest_dfne contient que les propriétés inscrites à la date de coupure en filtrantdf['LISTDATE']pour qu'elle soit inférieure ou égale àsplit_date.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
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)