Regolare le feature temporali
Nel corso abbiamo citato più volte i rischi di far trapelare informazioni al tuo modello durante l'addestramento. La data leakage farà apparire le metriche di accuratezza del modello troppo ottimistiche, ma quando lo userai su dati reali i risultati saranno spesso deludenti.
In questo esercizio ci assicureremo che DAYSONMARKET rifletta solo le informazioni disponibili al momento della previsione. Cioè, se la casa è ancora sul mercato, non sappiamo per quanti giorni resterà in vendita. Dobbiamo quindi adattare il nostro test_df per riflettere le informazioni disponibili al 2017-12-10.
NOTA: Questo esempio userà la funzione lit(). Questa funzione permette di usare valori scalari dove una funzione si aspetterebbe un'intera colonna.
Questo esercizio fa parte del corso
Feature Engineering con PySpark
Istruzioni dell'esercizio
- Importa le seguenti funzioni da
pyspark.sql.functionsper usarle più avanti:datediff(),to_date(),lit(). - Converte la stringa di data '2017-12-10' in una data pyspark chiamando prima la funzione letterale
lit()su di essa e poito_date(). - Crea
test_dffiltrandoOFFMKTDATEmaggiore o uguale asplit_dateeLISTDATEminore o uguale asplit_dateusandowhere(). - Sostituisci
DAYSONMARKETcalcolando una nuova colonna chiamataDAYSONMARKET; la nuova colonna deve essere la differenza trasplit_dateeLISTDATE. Usadatediff()per eseguire il calcolo tra date. Ispeziona la nuova colonna e l'originale usando il codice fornito.
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
from pyspark.sql.functions import ____, ____, ____
split_date = ____(____('2017-12-10'))
# Create Sequential Test set
test_df = df.____(df[____] >= ____).____(df[____] <= ____)
# Create a copy of DAYSONMARKET to review later
test_df = test_df.withColumn('DAYSONMARKET_Original', test_df['DAYSONMARKET'])
# Recalculate DAYSONMARKET from what we know on our split date
test_df = test_df.withColumn(____, ____(____, ____))
# Review the difference
test_df[['LISTDATE', 'OFFMKTDATE', 'DAYSONMARKET_Original', 'DAYSONMARKET']].show()