Úprava časových příznaků
V průběhu tohoto kurzu jsme několikrát zmiňovali rizika spojená s únikem informací do modelu během trénování. Data leakage způsobuje, že model vykazuje příliš optimistické metriky přesnosti – jakmile ho ale spustíš na reálných datech, výsledky bývají zklamáním.
V tomto cvičení zajistíme, aby sloupec DAYSONMARKET odrážel pouze informace, které máme k dispozici v okamžiku predikce hodnoty. Jinými slovy: pokud je dům stále v nabídce, nevíme, kolik dalších dní tam zůstane. Musíme proto upravit test_df tak, aby odpovídal informacím, které máme k dispozici ke dni 2017-12-10.
POZNÁMKA: V tomto příkladu použijeme funkci lit(). Tato funkce slouží k předání jedné hodnoty tam, kde se v rámci volání funkce očekává celý sloupec.
Toto cvičení je součástí kurzu
Feature Engineering with PySpark
Pokyny k cvičení
- Naimportuj z
pyspark.sql.functionsnásledující funkce, které použiješ v dalším kroku:datediff(),to_date(),lit(). - Převeď řetězec s datem '2017-12-10' na pyspark datum: nejprve na něj zavolej funkci
lit()a výsledek předej funkcito_date(). - Vytvoř
test_dftak, že pomocíwhere()vyfiltrujete záznamy, kde jeOFFMKTDATEvětší nebo rovnosplit_dateaLISTDATEmenší nebo rovnosplit_date. - Přepiš sloupec
DAYSONMARKETvýpočtem nového sloupce se stejným názvem – jeho hodnota by měla odpovídat rozdílu mezisplit_dateaLISTDATE. K výpočtu použij funkcidatediff(). Nový i původní sloupec si prohlédni pomocí připraveného kódu.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
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()