Créer des découpages temporels
Dans la vidéo, nous avons vu pourquoi un découpage aléatoire est risqué pour les séries temporelles : des données futures peuvent entraîner un surapprentissage du modèle. Avec les séries temporelles, vous recevez souvent de nouvelles données au fil du temps et vous souhaitez réentraîner votre modèle avec les plus récentes. Dans la vidéo, nous avons montré comment effectuer un découpage en pourcentage pour les jeux d’entraînement et de test, mais supposons que vous vouliez entraîner sur toutes les données disponibles sauf les 45 derniers jours, que vous réservez au jeu de test.
Dans cet exercice, nous allons créer une fonction pour déterminer la date de découpage afin d’utiliser les 45 derniers jours 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.
Cet exercice fait partie du cours
<cours>Feature Engineering avec PySpark</cours>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 le découpagesplit_col, ainsi que le nombre de jours à utiliser pour le jeu de testtest_days, avec une valeur par défaut de 45. - Trouvez les dates
minetmaxpoursplit_colen utilisant,(). - Déterminez la date de séparation entre test et entraînement à partir de
max_dateen soustrayanttest_daysviatimedelta(), qui prend un paramètredays; dans ce cas, passeztest_days. - En utilisant
OFFMKTDATEcommesplit_col, calculezsplit_dateet servez-vous-en pour filtrer le DataFrame en deux nouveaux DataFrames,train_dfettest_df, oùtest_dfne contient que les 45 derniers jours de données. Assurez-vous en outre quetest_dfne contient que des biens listés à la date de découpage en filtrantdf['LISTDATE']inférieur ou égal à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)