Träna och utvärdera en tidsserieprognosmodell
I den här notebook-filen skapar vi ett program för att prognostisera tidsseriedata som har säsongscykler. Vi använder datauppsättningen NYC Property Sales med datum från 2003 till 2015 publicerade av NYC Department of Finance på NYC Open Data Portal.
Förutsättningar
Skaffa en Microsoft Fabric-prenumeration. Eller registrera dig för en kostnadsfri utvärderingsversion av Microsoft Fabric.
Logga in på Microsoft Fabric.
Använd upplevelseväxlaren till vänster på startsidan för att växla till Synapse Datavetenskap upplevelse.
- Kunskaper om Microsoft Fabric-notebook-filer.
- Ett lakehouse för att lagra data för det här exemplet. Mer information finns i Lägga till ett lakehouse i anteckningsboken.
Följ med i en notebook-fil
Du kan följa med i en notebook-fil på ett av två sätt:
- Öppna och kör den inbyggda notebook-filen i Synapse Datavetenskap upplevelse.
- Ladda upp din notebook-fil från GitHub till Synapse-Datavetenskap upplevelse.
Öppna den inbyggda notebook-filen
Exempelanteckningsboken för Tidsserie medföljer den här självstudien.
Så här öppnar du självstudiekursens inbyggda exempelanteckningsbok i Synapse Datavetenskap upplevelse:
Gå till startsidan för Synapse Datavetenskap.
Välj Använd ett exempel.
Välj motsvarande exempel:
- Från standardfliken för arbetsflöden från slutpunkt till slutpunkt (Python) om exemplet är för en Python-självstudie.
- Från fliken Arbetsflöden från slutpunkt till slutpunkt (R) om exemplet är för en R-självstudie.
- Om exemplet är för en snabb självstudie på fliken Snabbsjälvstudier.
Koppla ett lakehouse till notebook-filen innan du börjar köra kod.
Importera anteckningsboken från GitHub
AIsample – Time Series Forecasting.ipynb är anteckningsboken som medföljer den här självstudien.
Om du vill öppna den medföljande notebook-filen för den här självstudien följer du anvisningarna i Förbereda systemet för självstudier för datavetenskap för att importera anteckningsboken till din arbetsyta.
Om du hellre vill kopiera och klistra in koden från den här sidan kan du skapa en ny notebook-fil.
Se till att bifoga ett lakehouse i notebook-filen innan du börjar köra kod.
Steg 1: Installera anpassade bibliotek
När du utvecklar en maskininlärningsmodell eller hanterar ad hoc-dataanalys kan du snabbt behöva installera ett anpassat bibliotek (till exempel prophet
i den här notebook-filen) för Apache Spark-sessionen. För att göra detta har du två alternativ.
- Du kan använda in-line-installationsfunktionerna (till exempel
%pip
,%conda
, osv.) för att snabbt komma igång med nya bibliotek. Detta skulle bara installera de anpassade biblioteken i den aktuella notebook-filen, inte på arbetsytan.
# Use pip to install libraries
%pip install <library name>
# Use conda to install libraries
%conda install <library name>
- Du kan också skapa en Infrastrukturmiljö, installera bibliotek från offentliga källor eller ladda upp anpassade bibliotek till den och sedan kan din arbetsyteadministratör koppla miljön som standard för arbetsytan. Alla bibliotek i miljön blir sedan tillgängliga för användning i alla notebook-filer och Spark-jobbdefinitioner på arbetsytan. Mer information om miljöer finns i skapa, konfigurera och använda en miljö i Microsoft Fabric.
För den här notebook-filen använder %pip install
du för att installera prophet
biblioteket. PySpark-kerneln startas om efter %pip install
. Det innebär att du måste installera biblioteket innan du kör andra celler.
# Use pip to install Prophet
%pip install prophet
Steg 2: Läs in data
Datamängd
Den här notebook-filen använder datamängden NYC Property Sales. Den omfattar data från 2003 till 2015, publicerade av NYC Department of Finance på NYC Open Data Portal.
Datamängden innehåller ett register över varje fastighetsförsäljning i New York Citys fastighetsmarknad inom en 13-årsperiod. En definition av kolumnerna i datamängden finns i ordlistan med villkor för egenskapsförsäljningsfiler .
stad | grannskap | building_class_category | tax_class | block | lott | eastment | building_class_at_present | adress | 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 | ALFABETSSTAD | 07 LÄGENHETER - WALKUP LÄGENHETER | 0,0 | 384.0 | 17,0 | C4 | 225 EAST 2ND STREET | 10009.0 | 10,0 | 0,0 | 10,0 | 2145.0 | 6670.0 | 1900.0 | 2.0 | C4 | 275000.0 | 2007-06-19 | ||
Manhattan | ALFABETSSTAD | 07 LÄGENHETER - WALKUP LÄGENHETER | 2.0 | 405,0 | 12.0 | C7 | 508 EAST 12TH STREET | 10009.0 | 28.0 | 2.0 | 30,0 | 3872.0 | 15428.0 | 1930.0 | 2.0 | C7 | 7794005.0 | 2007-05-21 |
Målet är att skapa en modell som förutspår den månatliga totala försäljningen baserat på historiska data. För detta använder du Prophet, ett öppen källkod prognosbibliotek som utvecklats av Facebook. Profeten är baserad på en additiv modell, där icke-linjära trender passar med dagliga, veckovisa och årliga säsongsvariationer och semestereffekter. Prophet fungerar bäst på tidsseriedatauppsättningar som har starka säsongseffekter och flera säsonger av historiska data. Dessutom hanterar Prophet data som saknas och avvikande data.
Prophet använder en förmultnad tidsseriemodell som består av tre komponenter:
- trend: Profeten förutsätter en bitvis konstant tillväxttakt, med automatisk ändringspunktval
- säsongsvariation: Som standard använder Prophet Fourier-serien för att passa vecko- och års säsongsvariationer
- helgdagar: Profeten kräver alla tidigare och framtida händelser av helgdagar. Om en helgdag inte upprepas i framtiden kommer Profeten inte att inkludera den i prognosen.
Den här notebook-filen aggregerar data varje månad, så den ignorerar helgdagarna.
Läs det officiella dokumentet för mer information om profetmodelleringstekniker.
Ladda ned datauppsättningen och ladda upp till ett sjöhus
Datakällan består av 15 .csv
filer. Dessa filer innehåller fastighetsförsäljningsposter från fem stadsdelar i New York, mellan 2003 och 2015. För enkelhetens nyc_property_sales.tar
skull innehåller filen alla dessa .csv
filer och komprimerar dem till en fil. En offentligt tillgänglig bloblagring är värd för den här .tar
filen.
Dricks
Med parametrarna som visas i den här kodcellen kan du enkelt använda den här notebook-filen på olika datauppsättningar.
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
Den här koden laddar ned en offentligt tillgänglig version av datamängden och lagrar sedan datauppsättningen i en Fabric Lakehouse.
Viktigt!
Se till att du lägger till ett lakehouse i notebook-filen innan du kör den. Om du inte gör det uppstår ett fel.
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}")
Börja spela in körningen av den här notebook-filen.
# Record the notebook running time
import time
ts = time.time()
Konfigurera MLflow-experimentspårning
För att utöka MLflow-loggningsfunktionerna samlar automatisk loggning automatiskt in värdena för indataparametrar och utdatamått för en maskininlärningsmodell under träningen. Den här informationen loggas sedan till arbetsytan, där MLflow-API:erna eller motsvarande experiment på arbetsytan kan komma åt och visualisera den. Besök den här resursen om du vill ha mer information om automatisk loggning.
# Set up the MLflow experiment
import mlflow
mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True) # Disable MLflow autologging
Kommentar
Om du vill inaktivera automatisk loggning av Microsoft Fabric i en notebook-session anropar mlflow.autolog()
du och anger disable=True
.
Läsa rådata från lakehouse
df = (
spark.read.format("csv")
.option("header", "true")
.load("Files/NYC_Property_Sales_Dataset/csv")
)
Steg 3: Börja undersöka dataanalys
Om du vill granska datauppsättningen kan du manuellt undersöka en delmängd data för att få en bättre förståelse för den. Du kan använda display
funktionen för att skriva ut DataFrame. Du kan också visa diagramvyerna för att enkelt visualisera delmängder av datamängden.
display(df)
En manuell granskning av datamängden leder till några tidiga observationer:
Instanser av försäljningspriser på 0,00 USD. Enligt ordlistan innebär detta en ägaröverföring utan kontant ersättning. Med andra ord flödade inga kassaflöden i transaktionen. Du bör ta bort försäljning med $0,00-värden
sales_price
från datauppsättningen.Datamängden omfattar olika byggnadsklasser. Den här notebook-filen fokuserar dock på bostadshus som enligt ordlistan markeras som typ "A". Du bör filtrera datamängden så att den endast innehåller bostadshus. Det gör du genom att inkludera antingen kolumnerna
building_class_at_time_of_sale
building_class_at_present
eller . Du får bara inkluderabuilding_class_at_time_of_sale
data.Datamängden innehåller instanser där
total_units
värden är lika med 0 ellergross_square_feet
värden lika med 0. Du bör ta bort alla instanser därtotal_units
ellergross_square_units
värden är lika med 0.Vissa kolumner – till exempel
apartment_number
,tax_class
,build_class_at_present
osv. – har saknade värden eller NULL-värden. Anta att saknade data omfattar skrivfel eller obefintliga data. Analysen beror inte på de saknade värdena, så du kan ignorera dem.Kolumnen
sale_price
lagras som en sträng med ett förberett $-tecken. Om du vill fortsätta med analysen representerar du den här kolumnen som ett tal. Du bör omvandlasale_price
kolumnen som heltal.
Typkonvertering och filtrering
Du kan lösa några av de identifierade problemen genom att importera de bibliotek som krävs.
# Import libraries
import pyspark.sql.functions as F
from pyspark.sql.types import *
Omvandla försäljningsdata från sträng till heltal
Använd reguljära uttryck för att separera den numeriska delen av strängen från dollartecknet (till exempel i strängen $300,000
, split $
och 300,000
), och sedan omvandla den numeriska delen som ett heltal.
Filtrera sedan data så att de endast innehåller instanser som uppfyller alla dessa villkor:
- Är
sales_price
större än 0 - Är
total_units
större än 0 - Är
gross_square_feet
större än 0 building_class_at_time_of_sale
Är av typ 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%"'
)
Sammansättning per månad
Dataresursen spårar egenskapsförsäljning dagligen, men den här metoden är för detaljerad för den här notebook-filen. Aggregera i stället data varje månad.
Ändra först datumvärdena så att endast månad och år-data visas. Datumvärdena skulle fortfarande innehålla årsdata. Du kan fortfarande skilja mellan till exempel december 2005 och december 2006.
Dessutom behåller du bara kolumnerna som är relevanta för analysen. Dessa inkluderar sales_price
, total_units
och gross_square_feet
sales_date
. Du måste också byta namn till sales_date
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
Aggregera värdena och total_units
gross_square_feet
efter månad. Gruppera sedan data month
efter och summera alla värden i varje grupp.
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)
Pyspark till Pandas-konvertering
Pyspark DataFrames hanterar stora datamängder väl. DataFrame-storleken är dock mindre på grund av dataaggregering. Detta tyder på att du nu kan använda Pandas DataFrames.
Den här koden omvandlar datauppsättningen från en pyspark DataFrame till en Pandas DataFrame.
import pandas as pd
df_pandas = summary_df.toPandas()
display(df_pandas)
Visualisering
Du kan undersöka fastighetshandelstrenden i New York City för att bättre förstå data. Detta leder till insikter om potentiella mönster och säsongstrender. Läs mer om Microsoft Fabric-datavisualisering på den här resursen.
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()
Sammanfattning av observationer från den undersökande dataanalysen
- Data visar ett tydligt återkommande mönster på en årlig takt. detta innebär att data har en årlig säsongsvariation
- Sommarmånaderna verkar ha högre försäljningsvolymer jämfört med vintermånaderna
- I en jämförelse av år med hög försäljning och år med låg försäljning, överstiger intäktsskillnaden mellan höga försäljningsmånader och låga försäljningsmånader under höga försäljningsår - i absoluta termer - intäktsskillnaden mellan höga försäljningsmånader och låga försäljningsmånader under låga försäljningsår.
År 2004 är till exempel intäktsskillnaden mellan den högsta försäljningsmånaden och den lägsta försäljningsmånaden ungefär:
$900,000,000 - $500,000,000 = $400,000,000
För 2011 handlar den intäktsskillnadsberäkningen om:
$400,000,000 - $300,000,000 = $100,000,000
Detta blir viktigt senare, när du måste bestämma mellan multiplicativa och additiva säsongseffekter.
Steg 4: Modellträning och spårning
Modellanpassning
Profetindata är alltid en dataram med två kolumner. En indatakolumn är en tidskolumn med namnet ds
, och en indatakolumn är en värdekolumn med namnet y
. Tidskolumnen ska ha dataformatet date, time eller datetime (till exempel YYYY_MM
). Datauppsättningen här uppfyller det villkoret. Värdekolumnen måste vara ett numeriskt dataformat.
För modellanpassningen får du bara byta namn på tidskolumnen till ds
och värdekolumnen till y
och skicka data till Profeten. Mer information finns i dokumentationen om Python-API:et för profeten.
df_pandas["ds"] = pd.to_datetime(df_pandas["month"])
df_pandas["y"] = df_pandas["total_sales"]
Profeten följer scikit-learn-konventionen . Skapa först en ny instans av Prophet, ange vissa parametrar (till exempelseasonality_mode
) och anpassa sedan instansen till datauppsättningen.
Även om en konstant additiv faktor är standardvariationen för Prophet bör du använda säsongsvariationen "multiplicativ" för parametern säsongseffekt. Analysen i föregående avsnitt visade att på grund av förändringar i säsongsmässig amplitud kommer en enkel additiv säsongsvariation inte att passa data bra alls.
Ställ in parametern weekly_seasonality på av eftersom data aggregerades per månad. Därför är veckodata inte tillgängliga.
Använd Metoder för Markov Chain Monte Carlo (MCMC) för att fånga upp uppskattningarna av säsongsosäkerhet. Som standard kan Profeten ge osäkerhetsuppskattningar på trend- och observationsbruset, men inte för säsongsvariationen. MCMC kräver mer bearbetningstid, men de gör det möjligt för algoritmen att ge osäkerhetsuppskattningar om säsongsvariation och trend- och observationsbrus. Mer information finns i dokumentationen om profetens osäkerhetsintervall.
Justera känsligheten för automatisk identifiering av ändringspunkter via parametern changepoint_prior_scale . Profetalgoritmen försöker automatiskt hitta instanser i de data där banorna plötsligt ändras. Det kan bli svårt att hitta rätt värde. För att lösa detta kan du prova olika värden och sedan välja modellen med bästa prestanda. Mer information finns i dokumentationen om profettrendändringspunkter.
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
Korsvalidering
Prophet har ett inbyggt korsvalideringsverktyg. Det här verktyget kan beräkna prognosfelet och hitta modellen med bästa prestanda.
Korsvalideringstekniken kan verifiera modellens effektivitet. Den här tekniken tränar modellen på en delmängd av datamängden och kör tester på en tidigare osedda delmängd av datamängden. Den här tekniken kan kontrollera hur väl en statistisk modell generaliserar till en oberoende datauppsättning.
För korsvalidering reserverar du ett visst urval av datamängden, som inte ingick i träningsdatauppsättningen. Testa sedan den tränade modellen i exemplet före distributionen. Den här metoden fungerar dock inte för tidsseriedata, för om modellen har sett data från månaderna januari 2005 och mars 2005, och du försöker förutsäga för månaden februari 2005, kan modellen i princip fuska eftersom den kan se var datatrenden leder. I verkliga program är målet att prognostisera för framtiden, som de osynliga regionerna.
Om du vill hantera detta och göra testet tillförlitligt delar du upp datamängden baserat på datumen. Använd datauppsättningen upp till ett visst datum (till exempel de första 11 åren av data) för träning och använd sedan återstående osedda data för förutsägelse.
I det här scenariot börjar du med 11 års träningsdata och gör sedan månatliga förutsägelser med en ettårshorisont. Mer specifikt innehåller träningsdata allt från 2003 till 2013. Sedan hanterar den första körningen förutsägelser för januari 2014 till januari 2015. Nästa körning hanterar förutsägelser för februari 2014 till februari 2015 och så vidare.
Upprepa den här processen för var och en av de tre tränade modellerna för att se vilken modell som presterar bäst. Jämför sedan dessa förutsägelser med verkliga värden för att fastställa förutsägelsekvaliteten för den bästa modellen.
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
Loggmodell med MLflow
Logga modellerna för att hålla reda på deras parametrar och spara modellerna för senare användning. All relevant modellinformation loggas på arbetsytan under experimentnamnet. Modellen, parametrarna och måtten, tillsammans med autologgningsobjekt för MLflow, sparas i en MLflow-körning.
# Setup MLflow
from mlflow.models.signature import infer_signature
Utföra experiment
Ett maskininlärningsexperiment fungerar som den primära enheten för organisation och kontroll för alla relaterade maskininlärningskörningar. En körning motsvarar en enda körning av modellkod. Spårning av maskininlärningsexperiment avser hanteringen av alla olika experiment och deras komponenter. Detta inkluderar parametrar, mått, modeller och andra artefakter, och det hjälper till att organisera nödvändiga komponenter i ett specifikt maskininlärningsexperiment. Spårning av maskininlärningsexperiment möjliggör också enkel duplicering av tidigare resultat med sparade experiment. Läs mer om maskininlärningsexperiment i Microsoft Fabric. När du har fastställt vilka steg du tänker ta med (till exempel anpassning och utvärdering av Profetens modell i den här notebook-filen) kan du köra experimentet.
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)
Visualisera en modell med Prophet
Prophet har inbyggda visualiseringsfunktioner som kan visa modellanpassningsresultatet.
De svarta punkterna anger de datapunkter som används för att träna modellen. Den blå linjen är förutsägelsen och det ljusblå området visar osäkerhetsintervallen. Du har skapat tre modeller med olika changepoint_prior_scale
värden. Förutsägelserna för dessa tre modeller visas i resultatet av det här kodblocket.
for idx, pack in enumerate(zip(models, forecasts)):
m, forecast = pack
fig = m.plot(forecast)
fig.suptitle(f"changepoint = {changepoint_priors[idx]}")
Det minsta changepoint_prior_scale
värdet i den första grafen leder till underanpassning av trendändringar. Den största changepoint_prior_scale
i den tredje grafen kan leda till överanpassning. Så den andra grafen verkar vara det optimala valet. Detta innebär att den andra modellen är den lämpligaste.
Visualisera trender och säsongsvariationer med Prophet
Profeten kan också enkelt visualisera underliggande trender och säsongsvariationer. Visualiseringar av den andra modellen visas i resultatet av det här kodblocket.
BEST_MODEL_INDEX = 1 # Set the best model index according to the previous results
fig2 = models[BEST_MODEL_INDEX].plot_components(forecast)
I dessa grafer återspeglar den ljusblå skuggningen osäkerheten. Det översta diagrammet visar en stark, lång period som svänger trend. Under några år har försäljningsvolymerna ökat och minskat. Det lägre diagrammet visar att försäljningen tenderar att nå sin topp i februari och september och nå sina högsta värden för året under dessa månader. Kort efter dessa månader, i mars och oktober, faller de till årets minimivärden.
Utvärdera modellernas prestanda med hjälp av olika mått, till exempel:
- genomsnittligt kvadratfel (MSE)
- rot medelvärde kvadratfel (RMSE)
- genomsnittligt absolut fel (MAE)
- genomsnittligt absolut procentfel (MAPE)
- medianfel för absolut procent (MDAPE)
- symmetriskt genomsnittligt absolut procentfel (SMAPE)
Utvärdera täckningen med hjälp av uppskattningarna yhat_lower
och yhat_upper
. Observera de varierande horisonter där du förutsäger ett år i framtiden, 12 gånger.
display(df_metrics[BEST_MODEL_INDEX])
Med MAPE-måttet för den här prognosmodellen innebär förutsägelser som sträcker sig en månad in i framtiden vanligtvis fel på ungefär 8 %. För förutsägelser ett år in i framtiden ökar dock felet till ungefär 10 %.
Steg 5: Poängsätta modellen och spara förutsägelseresultat
Gör nu en poäng för modellen och spara förutsägelseresultatet.
Göra förutsägelser med Predict Transformer
Nu kan du läsa in modellen och använda den för att göra förutsägelser. Användare kan operationalisera maskininlärningsmodeller med PREDICT, en skalbar Microsoft Fabric-funktion som stöder batchbedömning i alla beräkningsmotorer. Läs mer om PREDICT
och hur du använder det i Microsoft Fabric på den här resursen.
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.")