Trénovanie a vyhodnotenie modelu predpovedania časového radu
V tomto notebooku vytvoríme program na prognózu údajov časového radu, ktorý má sezónne cykly. Používame NYC Nehnuteľnosť Predaj množiny s dátumami od 2003 do 2015 publikoval NYC Department of Finance na NYC Open Data Portal.
Požiadavky
Získajte predplatné na Microsoft Fabric. Alebo si zaregistrujte bezplatnú skúšobnú verziu služby Microsoft Fabric.
Prihláste sa do služby Microsoft Fabric.
Pomocou prepínača skúseností v ľavej dolnej časti domovskej stránky sa prepnete na službu Fabric.
- Znalosť poznámkových blokov služby Microsoft Fabric.
- Úložisko lakehouse na ukladanie údajov pre tento príklad. Ďalšie informácie nájdete v téme Pridanie jazera do poznámkového bloku.
Sledovanie v poznámkovom bloke
Spolu s nimi môžete postupovať v poznámkovom bloke jedným z dvoch spôsobov:
- Otvorte a spustite vstavaný poznámkový blok.
- Nahrajte poznámkový blok z GitHubu.
Otvorenie vstavaného poznámkového bloku
Vzorový poznámkový blok časového radu sprevádza tento kurz.
Ak chcete otvoriť vzorový poznámkový blok pre tento kurz, postupujte podľa pokynov v téme Príprava systému na kurzy dátovej vedy.
Uistite sa, že pripojiť lakehouse na notebook, ako začnete bežať kód.
Importovanie notebooku z GitHubu
AIsample - Time Series Forecasting.ipynb je notebook, ktorý sprevádza tento kurz.
Ak chcete otvoriť sprievodný poznámkový blok pre tento kurz, postupujte podľa pokynov v téme Príprava systému na kurzy dátových vied na import notebooku do pracovného priestoru.
Ak by ste radšej skopírovali a prilepili kód z tejto stránky, môžete vytvoriť nový poznámkový blok.
Uistite sa, že pripojiť lakehouse na notebook , ako začnete spustiť kód.
Krok č. 1: Inštalácia vlastných knižníc
Keď vyvíjate model strojového učenia alebo spracovávate ad hoc analýzu údajov, možno budete musieť rýchlo nainštalovať vlastnú knižnicu (napríklad prophet
v tomto notebooku) pre reláciu Apache Spark. Ak to chcete urobiť, máte dve možnosti.
- Ak chcete rýchlo začať s novými knižnicami,
%pip
môžete použiť možnosti vnorenej inštalácie (napríklad , ,%conda
atď.). Tým by sa nainštalovali iba vlastné knižnice v aktuálnom poznámkovom bloku, nie v pracovnom priestore.
# Use pip to install libraries
%pip install <library name>
# Use conda to install libraries
%conda install <library name>
- Prípadne môžete vytvoriť prostredie služby Fabric, nainštalovať knižnice z verejných zdrojov alebo do neho nahrať vlastné knižnice a potom môže správca pracovného priestoru k prostrediu pripojiť ako predvolené prostredie pre pracovný priestor. Všetky knižnice v prostredí budú potom k dispozícii na použitie v poznámkových blokoch a definíciách úloh služby Spark v pracovnom priestore. Ďalšie informácie o prostrediach nájdete v téme o vytváraní, konfigurácii a používaní prostredia v službe Microsoft Fabric.
V tomto poznámkovom bloku použite %pip install
na inštaláciu knižnice prophet
. Jadro služby PySpark sa reštartuje po %pip install
reštarte. To znamená, že pred spustením akýchkoľvek iných buniek musíte nainštalovať knižnicu.
# Use pip to install Prophet
%pip install prophet
Krok č. 2: Načítanie údajov
Množina údajov
Tento notebook používa množinu údajov NYC Property Sales. Pokrýva údaje od roku 2003 do roku 2015, publikoval NYC Department of Finance na NYC Open Data Portal.
Množina údajov obsahuje záznam o každom predaji budov na trhu s nehnuteľnosťami v New Yorku v rámci 13-ročného obdobia. Definíciu stĺpcov v množine údajov nájdete v slovníku pojmov pre súbory predaja vlastností.
Borough | susedstvo | building_class_category | tax_class | blokovať | veľa | eastment (východ) | building_class_at_present | adresa | apartment_number | zip_code | residential_units | commercial_units | total_units | land_square_feet | gross_square_feet | year_built | tax_class_at_time_of_sale | building_class_at_time_of_sale | sale_price | sale_date |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Manhattan | ABECEDA MESTO | 07 A APARTMÁNY - WALKUP | 0,0 | 384.0 | 17,0 | C4 | 225 VÝCHODNÁ 2. ULICA | 10009.0 | 10,0 | 0,0 | 10,0 | 2145.0 | 6670.0 | 1900.0 | 2,0 | C4 | 275000.0 | 2007-06-19 | ||
Manhattan | ABECEDA MESTO | 07 A APARTMÁNY - WALKUP | 2,0 | 405.0 | 12,0 | C7 | 508 VÝCHODNÁ 12. ULICA | 10009.0 | 28.0 | 2,0 | 30.0 | 3872.0 | 15428.0 | 1930.0 | 2,0 | C7 | 7794005.0 | 2007-05-21 |
Cieľom je vytvoriť model, ktorý na základe historických údajov predpovedá mesačný celkový predaj. Na to použijete proroka, open-source knižnicu predpovedí vyvinutú Facebookom. Prorok je založený na aditívnom modeli, v ktorom sú nelineárne trendy vhodné na denné, týždenné a ročné sezónnosti a sviatočné efekty. Proroc pracuje najlepšie na množinách údajov časových radov, ktoré majú silné sezónne účinky, a niekoľko sezón historických údajov. Okrem toho prorok robustne spracováva chýbajúce údaje a odchýlky údajov.
Prorok používa rozložiteľný model časového radu, ktorý pozostáva z troch komponentov:
- trend: Prorok predpokladá kus-múdry konštantná rýchlosť rastu, s automatickým výberom bodov zmeny
- seasonality: V predvolenom nastavení, prorok používa Fourier série, aby sa zmestili týždenné a ročné sezónnosti
- dovolenka: prorok vyžaduje všetky minulé a budúce výskyty sviatkov. Ak sa sviatok v budúcnosti neopakuje, prorok ho do predpovede nezahrnie.
Tento notebook agreguje údaje na mesačnej báze, takže ignoruje sviatky.
Prečítajte si oficiálny dokument pre viac informácií o proroka modelovanie techník.
Stiahnite si množinu údajov a nahrajte ju do služby lakehouse
Zdroj údajov pozostáva z 15 .csv
súborov. Tieto súbory obsahujú záznamy o predaji vlastností z piatich mestských častí v New Yorku v rokoch 2003 až 2015. Pre väčšie pohodlie nyc_property_sales.tar
súbor obsahuje všetky tieto .csv
súbory a skomprimuje ich na jeden súbor. Tento .tar
súbor hosťuje verejne dostupný ukladací priestor objektu BLOB.
Prepitné
Pomocou parametrov uvedených v tejto bunke kódu môžete jednoducho použiť tento poznámkový blok na rôzne množiny údajov.
URL = "https://synapseaisolutionsa.blob.core.windows.net/public/NYC_Property_Sales_Dataset/"
TAR_FILE_NAME = "nyc_property_sales.tar"
DATA_FOLDER = "Files/NYC_Property_Sales_Dataset"
TAR_FILE_PATH = f"/lakehouse/default/{DATA_FOLDER}/tar/"
CSV_FILE_PATH = f"/lakehouse/default/{DATA_FOLDER}/csv/"
EXPERIMENT_NAME = "aisample-timeseries" # MLflow experiment name
Tento kód stiahne verejne dostupnú verziu množiny údajov a potom túto množinu údajov uloží v službe Fabric Lakehouse.
Dôležité
Uistite sa, že ste pridali lakehouse do notebooku pred spustením. Ak to neurobíte, bude to mať za následok chybu.
import os
if not os.path.exists("/lakehouse/default"):
# Add a lakehouse if the notebook has no default lakehouse
# A new notebook will not link to any lakehouse by default
raise FileNotFoundError(
"Default lakehouse not found, please add a lakehouse for the notebook."
)
else:
# Verify whether or not the required files are already in the lakehouse, and if not, download and unzip
if not os.path.exists(f"{TAR_FILE_PATH}{TAR_FILE_NAME}"):
os.makedirs(TAR_FILE_PATH, exist_ok=True)
os.system(f"wget {URL}{TAR_FILE_NAME} -O {TAR_FILE_PATH}{TAR_FILE_NAME}")
os.makedirs(CSV_FILE_PATH, exist_ok=True)
os.system(f"tar -zxvf {TAR_FILE_PATH}{TAR_FILE_NAME} -C {CSV_FILE_PATH}")
Spustite nahrávanie času spustenia tohto poznámkového bloku.
# Record the notebook running time
import time
ts = time.time()
Nastavenie sledovania experimentov toku MLflow
Ak chcete rozšíriť možnosti zapisovania do denníka toku MLflow, automatické označovanie automaticky zaznamenáva hodnoty vstupných parametrov a výstupné metriky modelu strojového učenia počas jeho trénovania. Tieto informácie sa potom prihlásia do pracovného priestoru, kde môžu rozhrania API toku MLflow alebo príslušný experiment v pracovnom priestore získať prístup a vizualizovať ich. Ďalšie informácie o automatickom označovaní nájdete v tomto zdroji .
# Set up the MLflow experiment
import mlflow
mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True) # Disable MLflow autologging
Poznámka
Ak chcete zakázať automatické označovanie služby Microsoft Fabric v relácii poznámkového bloku, zavolajte mlflow.autolog()
a nastavte položku disable=True
.
Prečítajte si nespracované údaje dátumu z lakehouse
df = (
spark.read.format("csv")
.option("header", "true")
.load("Files/NYC_Property_Sales_Dataset/csv")
)
Krok č. 3: Začatie prieskumnej analýzy údajov
Na preskúmanie množiny údajov by ste mohli manuálne preskúmať podmnožinu údajov a lepšie ju pochopiť. Funkciu môžete použiť display
na tlač prvku DataFrame. Môžete tiež zobraziť zobrazenia grafu na jednoduchú vizualizáciu podmnožín množiny údajov.
display(df)
Manuálna kontrola množiny údajov má za následok niektoré skoré pozorovania:
Inštancie v predajných cenách 0,00 USD. Podľa slovníka podmienok to znamená prevod vlastníctva bez hotovostného zváženia. Inými slovami, v transakcii sa nevytriešila žiadna hotovosť. Z množiny údajov by ste mali odstrániť hodnoty predaja v hodnote 0,00
sales_price
USD.Množina údajov zahŕňa rôzne triedy budov. Tento notebook sa však zameria na obytné budovy, ktoré sú podľa slovníka pojmov označené ako typ "A". Množinu údajov by ste mali vyfiltrovať tak, aby obsahovala len obytné budovy. Ak to chcete urobiť, zahrňte buď
building_class_at_time_of_sale
stĺpec alebobuilding_class_at_present
. Musíte zahrnúťbuilding_class_at_time_of_sale
iba údaje.Množina údajov obsahuje inštancie, v ktorých sa
total_units
hodnoty rovnajú 0 alebogross_square_feet
hodnoty rovné 0. Mali by ste odstrániť všetky inštancie, kdetotal_units
alebogross_square_units
sa hodnoty rovnajú 0.Niektoré stĺpce,
apartment_number
napríklad ,tax_class
,build_class_at_present
, atď. majú chýbajúce alebo hodnoty NULL. Predpokladajme, že chýbajúce údaje zahŕňajú duchovných chýb alebo neexistujúcimi údajmi. Analýza nezávisí od týchto chýbajúcich hodnôt, takže ich môžete ignorovať.Stĺpec
sale_price
je uložený ako reťazec s napendovaným znakom $. Ak chcete pokračovať s analýzou, predstavuje tento stĺpec ako číslo. Stĺpec by ste mali pretypovaťsale_price
ako celé číslo.
Konverzia a filtrovanie typu
Ak chcete vyriešiť niektoré z identifikovaných problémov, importujte požadované knižnice.
# Import libraries
import pyspark.sql.functions as F
from pyspark.sql.types import *
Presunutie údajov o predaji z reťazca do celého čísla
Pomocou regulárnych výrazov oddeľte číselnú časť reťazca od znaku dolára (napríklad v reťazci $300,000
, rozdeliť $
a 300,000
) a potom pretypovať číselnú časť ako celé číslo.
V ďalšom kroku vyfiltrujte údaje tak, aby zahŕňali iba inštancie, ktoré spĺňajú všetky tieto podmienky:
- hodnota je väčšia
sales_price
ako 0 - hodnota je väčšia
total_units
ako 0 - hodnota je väčšia
gross_square_feet
ako 0 - hodnota
building_class_at_time_of_sale
je typu A
df = df.withColumn(
"sale_price", F.regexp_replace("sale_price", "[$,]", "").cast(IntegerType())
)
df = df.select("*").where(
'sale_price > 0 and total_units > 0 and gross_square_feet > 0 and building_class_at_time_of_sale like "A%"'
)
Agregácia na mesačnej báze
Tento zdroj údajov denne sleduje predaj vlastností, ale tento prístup je pre tento poznámkový blok príliš podrobný. Namiesto toho agregovať údaje na mesačnej báze.
Najskôr zmeňte hodnoty dátumu tak, aby zobrazovali iba údaje o mesiaci a roku. Dátumové hodnoty by stále obsahovali údaje o roku. Stále však môžete rozlišovať medzi napríklad decembrom 2005 a decembrom 2006.
Okrem toho zachovajte relevantné iba stĺpce pre analýzu. Patria sem sales_price
položky , total_units
gross_square_feet
a sales_date
. Musíte tiež premenovať sales_date
na month
.
monthly_sale_df = df.select(
"sale_price",
"total_units",
"gross_square_feet",
F.date_format("sale_date", "yyyy-MM").alias("month"),
)
display(monthly_sale_df)
sale_price
total_units
Agregácia hodnôt a gross_square_feet
podľa mesiacov. Potom údaje zoskupte podľa month
a sčítajte všetky hodnoty v každej skupine.
summary_df = (
monthly_sale_df.groupBy("month")
.agg(
F.sum("sale_price").alias("total_sales"),
F.sum("total_units").alias("units"),
F.sum("gross_square_feet").alias("square_feet"),
)
.orderBy("month")
)
display(summary_df)
Konverzia z Pysparku na Pandas
Údajové rámce v Pysparku sú vhodné na spracovanie veľkých množín údajov. Z dôvodu agregácie údajov je však veľkosť údajového rámca menšia. Predpokladá sa, že teraz môžete používať údajové rámce pandas.
Tento kód vytypuje množinu údajov z pyspark dataframe do prvku pandas DataFrame.
import pandas as pd
df_pandas = summary_df.toPandas()
display(df_pandas)
Vizualizácia
Môžete preskúmať trend obchodu s nehnuteľnosťami v New Yorku, aby ste lepšie pochopili údaje. To vedie k prehľadom možných vzorov a trendov sezónnosti. Ďalšie informácie o vizualizácii údajov v službe Microsoft Fabric nájdete v tomto zdroji.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
f, (ax1, ax2) = plt.subplots(2, 1, figsize=(35, 10))
plt.sca(ax1)
plt.xticks(np.arange(0, 15 * 12, step=12))
plt.ticklabel_format(style="plain", axis="y")
sns.lineplot(x="month", y="total_sales", data=df_pandas)
plt.ylabel("Total Sales")
plt.xlabel("Time")
plt.title("Total Property Sales by Month")
plt.sca(ax2)
plt.xticks(np.arange(0, 15 * 12, step=12))
plt.ticklabel_format(style="plain", axis="y")
sns.lineplot(x="month", y="square_feet", data=df_pandas)
plt.ylabel("Total Square Feet")
plt.xlabel("Time")
plt.title("Total Property Square Feet Sold by Month")
plt.show()
Súhrn pozorovaní z prieskumnej analýzy údajov
- Údaje zobrazujú jasný opakujúci sa vzor s ročnou frekvenciou. To znamená, že údaje majú ročné sezónnosť
- Zdá sa, že letné mesiace majú v porovnaní so zimnými mesiacmi vyššie objemy predaja
- V porovnaní rokov s vysokým predajom a rokmi s nízkym predajom, rozdiel výnosov medzi mesiacmi vysokej tržby a mesiacmi nízkeho predaja vo vysokých predajných rokoch prekračuje v absolútnom význame rozdiel výnosov medzi vysokými mesiacmi predaja a mesiacmi nízkeho predaja v rokoch nízkeho predaja.
V roku 2004 je napríklad rozdiel výnosov medzi mesiacom najvyššieho predaja a najnižším mesiacom predaja asi:
$900,000,000 - $500,000,000 = $400,000,000
V roku 2011 je výpočet rozdielu výnosov asi takto:
$400,000,000 - $300,000,000 = $100,000,000
To bude dôležité neskôr, keď sa musíte rozhodnúť medzi multiplikačnými a s pripočítavými účinkami sezónnosti.
Krok č. 4: Trénovaie a sledovanie modelu
Montáž modelu
Prorok vstup je vždy dva-stĺpec DataFrame. Jeden vstupný stĺpec je stĺpec času s názvom ds
a jeden vstupný stĺpec je stĺpec hodnôt s názvom y
. Stĺpec času by mal mať formát údajov dátumu, času alebo dátumu a času (napríklad YYYY_MM
). Množina údajov v tomto prípade spĺňa túto podmienku. Stĺpec hodnôt musí byť číselný formát údajov.
Na prispôsobenie modelu je potrebné premenovať iba stĺpec ds
času a stĺpec hodnoty na a odovzdať y
údaje prorokovi. Prečítajte si dokumentáciu k rozhranie API jazyka Python pre proroka, kde nájdete ďalšie informácie.
df_pandas["ds"] = pd.to_datetime(df_pandas["month"])
df_pandas["y"] = df_pandas["total_sales"]
Prorok sa riadi konvenciou scikit-learn . Najprv vytvorte novú inštanciu proroka, nastavte určité parametre (napríklad,seasonality_mode
) a potom túto inštanciu prispôsobte množine údajov.
Hoci konštantný faktor s pripočítania je predvoleným efektom sezónnosti pre proroka, mali by ste pre parameter seasonality vplyvu použiť viacnásobnú sezónnosť . Analýza v predchádzajúcej časti ukázala, že z dôvodu zmien v amplitúde sezónnosti sa jednoduchá sezónnosť s pripočítaním vôbec nezmestí na údaje.
Nastavte parameter weekly_seasonality na možnosť vypnuté, pretože údaje boli agregované podľa mesiaca. V dôsledku toho nie sú týždenné údaje k dispozícii.
Na zachytenie odhadov sezónnosti neistoty používajte metódy reťazca Markov Monte Carlo (MCMC ). Prorok môže predvolene poskytovať odhady neistoty týkajúce sa trendu a pozorovaného hluku, ale nie sezónnosti. MCMC vyžaduje viac času spracovania, ale umožňujú algoritmu poskytovať odhady neistoty týkajúce sa sezónnosti a trendu a pozorovaného hluku. Prečítajte si dokumentáciu o intervaloch neistoty vo prorokovi, kde nájdete ďalšie informácie.
Vylaďte citlivosť automatického zisťovania bodov zmeny prostredníctvom parametra changepoint_prior_scale . Algoritmus proroka sa automaticky snaží nájsť inštancie v údajoch, kde trajektórie sa náhle zmenia. Nájsť správnu hodnotu môže byť zložité. Ak to chcete vyriešiť, môžete vyskúšať rôzne hodnoty a potom vybrať model s najlepším výkonom. Prečítajte si dokumentáciu k zmena trendu proroka, kde nájdete ďalšie informácie.
from prophet import Prophet
def fit_model(dataframe, seasonality_mode, weekly_seasonality, chpt_prior, mcmc_samples):
m = Prophet(
seasonality_mode=seasonality_mode,
weekly_seasonality=weekly_seasonality,
changepoint_prior_scale=chpt_prior,
mcmc_samples=mcmc_samples,
)
m.fit(dataframe)
return m
Krížové overenie
Prorok má vstavaný nástroj krížového overovania. Tento nástroj dokáže odhadnúť chybu prognózovania a nájsť model s najlepším výkonom.
Technika krížového overovania môže overiť efektivitu modelu. Táto technika trénuje model na podmnožine množiny údajov a spustí testy na predtým nezrušenej podmnožine množiny údajov. Táto technika umožňuje skontrolovať, ako sa štatistický model zovšeobecňuje na nezávislú množinu údajov.
Na krížové overenie si vyhradzte konkrétnu vzorku množiny údajov, ktorá nebola súčasťou tréningovej množiny údajov. Potom pred nasadením otestujte trénovaný model v tejto ukážke. Tento prístup však nefunguje s údajmi časového radu, pretože ak model zaznamenal údaje z mesiacov január 2005 a marec 2005 a pokúsite sa predpovedať mesiac február 2005, model môže v podstate podvádzať, pretože by mohol zistiť, kam vedie trend údajov. V reálnych aplikáciách je cieľom prognózovať budúcnosť, keďže neviditeľné regióny.
Ak to chcete spracovať a nastaviť test ako spoľahlivý, rozdeľte množinu údajov na základe dátumov. Množinu údajov použite k určitému dátumu (napríklad prvých 11 rokov údajov) na trénovaie a potom použite na predpoveď zostávajúce neviditeľné údaje.
V tomto scenári začnite s 11 rokmi tréningových údajov a potom vykonajte mesačné predpovede na obdobie jedného roka. Konkrétne údaje trénovania obsahujú všetko od roku 2003 do roku 2013. Potom sa pri prvom spustení budú spracovávať predpovede pre január 2014 až január 2015. Ďalšie spustenie rieši predpovede na február 2014 až február 2015 a tak ďalej.
Zopakujte tento proces pre každý z troch trénovaných modelov, aby ste zistili, ktorý model funguje najlepšie. Potom porovnajte tieto predpovede s hodnotami z reálneho sveta, aby ste stanovili kvalitu predpovede najlepšieho modelu.
from prophet.diagnostics import cross_validation
from prophet.diagnostics import performance_metrics
def evaluation(m):
df_cv = cross_validation(m, initial="4017 days", period="30 days", horizon="365 days")
df_p = performance_metrics(df_cv, monthly=True)
future = m.make_future_dataframe(periods=12, freq="M")
forecast = m.predict(future)
return df_p, future, forecast
Model denníka s MLflow
Zaznamenávajte modely, aby ste udržali prehľad o ich parametroch a ukladali modely na neskoršie použitie. Všetky relevantné informácie modelu sa prihlásia do pracovného priestoru pod názvom experimentu. Model, parametre a metriky spolu s položkami automatického označovania toku ML sa ukladajú v jednom spustení toku MLflow.
# Setup MLflow
from mlflow.models.signature import infer_signature
Vykonanie experimentov
Experiment strojového učenia slúži ako hlavná jednotka organizácie a riadenia pre všetky súvisiace spustenia strojového učenia. Spustenie zodpovedá jednému vykonaniu kódu modelu. Sledovanie experimentov strojového učenia sa vzťahuje na správu všetkých rôznych experimentov a ich súčastí. To zahŕňa parametre, metriky, modely a ďalšie artefakty a pomáha usporiadať požadované súčasti konkrétneho experimentu strojového učenia. Sledovanie experimentov strojového učenia tiež umožňuje jednoduchú duplicitu minulých výsledkov s uloženými experimentmi. Získajte ďalšie informácie o experimentoch strojového učenia v službe Microsoft Fabric. Akonáhle zistíte, aké kroky chcete zahrnúť (napríklad montáž a vyhodnocovanie modelu proroka v tomto poznámkovom bloku), môžete spustiť experiment.
model_name = f"{EXPERIMENT_NAME}-prophet"
models = []
df_metrics = []
forecasts = []
seasonality_mode = "multiplicative"
weekly_seasonality = False
changepoint_priors = [0.01, 0.05, 0.1]
mcmc_samples = 100
for chpt_prior in changepoint_priors:
with mlflow.start_run(run_name=f"prophet_changepoint_{chpt_prior}"):
# init model and fit
m = fit_model(df_pandas, seasonality_mode, weekly_seasonality, chpt_prior, mcmc_samples)
models.append(m)
# Validation
df_p, future, forecast = evaluation(m)
df_metrics.append(df_p)
forecasts.append(forecast)
# Log model and parameters with MLflow
mlflow.prophet.log_model(
m,
model_name,
registered_model_name=model_name,
signature=infer_signature(future, forecast),
)
mlflow.log_params(
{
"seasonality_mode": seasonality_mode,
"mcmc_samples": mcmc_samples,
"weekly_seasonality": weekly_seasonality,
"changepoint_prior": chpt_prior,
}
)
metrics = df_p.mean().to_dict()
metrics.pop("horizon")
mlflow.log_metrics(metrics)
Vizualizácia modelu s prorokom
Prorok má vstavané funkcie vizualizácie, ktoré dokážu ukázať výsledky kovania modelu.
Čierne bodky označujú údajové body, ktoré sa používajú na trénovanie modelu. Modrá čiara je predpoveď a svetlomodrá oblasť zobrazuje intervaly neistoty. Vytvorili ste tri modely s rôznymi changepoint_prior_scale
hodnotami. Predpovede týchto troch modelov sú zobrazené vo výsledkoch tohto bloku kódu.
for idx, pack in enumerate(zip(models, forecasts)):
m, forecast = pack
fig = m.plot(forecast)
fig.suptitle(f"changepoint = {changepoint_priors[idx]}")
Najmenšia changepoint_prior_scale
hodnota v prvom grafe vedie k podhodnoteniu zmien trendov. Najväčšie changepoint_prior_scale
v treťom grafe by mohlo viesť k prepísaní. Takže druhý graf sa zdá byť optimálnou voľbou. Z toho vyplýva, že druhý model je najvhodnejší.
Vizualizujte trendy a sezónnosť pomocou proroka
Prorok môže tiež jednoducho vizualizovať základné trendy a sezónnosti. Vizualizácie druhého modelu sú zobrazené vo výsledkoch tohto bloku kódu.
BEST_MODEL_INDEX = 1 # Set the best model index according to the previous results
fig2 = models[BEST_MODEL_INDEX].plot_components(forecast)
V týchto grafoch svetlomodré tieňovanie odráža neistotu. Horný graf zobrazuje silný, dlhotrvajúci oscilujúci trend. V priebehu niekoľkých rokov sa objemy predaja zvyšujú a klesajú. Nižší graf ukazuje, že predaj zvyčajne dosiahne vrchol vo februári a septembri a dosiahne svoje maximálne hodnoty za rok v týchto mesiacoch. Krátko po týchto mesiacoch, v marci a októbri, spadajú na minimálne hodnoty roka.
Vyhodnotiť výkon modelov pomocou rôznych metrík, napríklad:
- stredná chyba so štvorčekovou hodnotou (MSE)
- chyba koreňovej priemernej štvorčekovej množiny (RMSE)
- stredná absolútna chyba (MAE)
- mean absolute percent error (MAPE)
- absolútna chyba mediánu percenta (MDAPE)
- symetrická stredná absolútna percentuálna chyba (SMAPE)
Vyhodnotiť pokrytie pomocou yhat_lower
odhadov a yhat_upper
. Všimnite si rôzne horizonty, kde predpovedáte jeden rok v budúcnosti, 12-krát.
display(df_metrics[BEST_MODEL_INDEX])
S metrikou MAPE pre tento model prognózy predpovede, ktoré sa predĺžia o jeden mesiac do budúcnosti, zvyčajne zahŕňajú chyby približne 8 %. V prípade predpovedí z jedného roka do budúcnosti sa však chyba zvýši na zhruba 10 %.
Krok č. 5: Skóre modelu a uloženie výsledkov predpovede
Teraz vypočítajte skóre modelu a uložte výsledky predpovede.
Vytvorenie predpovedí pomocou funkcie Predpovedať Transformer
Teraz môžete načítať model a použiť ho na vytváranie predpovedí. Používatelia môžu pracovať s modelmi strojového učenia pomocou škálovateľnej funkcie Microsoft Fabric, ktorá podporuje dávkové skóre v akomkoľvek výpočtovom nástroji. Ďalšie informácie o PREDICT
službe Microsoft Fabric a jej používaní v tomto zdroji.
from synapse.ml.predict import MLFlowTransformer
spark.conf.set("spark.synapse.ml.predict.enabled", "true")
model = MLFlowTransformer(
inputCols=future.columns.values,
outputCol="prediction",
modelName=f"{EXPERIMENT_NAME}-prophet",
modelVersion=BEST_MODEL_INDEX,
)
test_spark = spark.createDataFrame(data=future, schema=future.columns.to_list())
batch_predictions = model.transform(test_spark)
display(batch_predictions)
# Code for saving predictions into lakehouse
batch_predictions.write.format("delta").mode("overwrite").save(
f"{DATA_FOLDER}/predictions/batch_predictions"
)
# Determine the entire runtime
print(f"Full run cost {int(time.time() - ts)} seconds.")