Jaa


Aikasarjan ennustemallin harjoittaminen ja arvioiminen

Tässä muistikirjassa rakennamme ohjelman, jolla ennustetaan kausisarjatietoja, joissa on kausijaksoja. Käytämme NYC Property Sales -tietojoukkoa, jonka päivämäärät vaihtelevat vuosina 2003–2015 ja jotka Nyc Department of Finance on julkaissut NYC Open Data Portalissa.

Edellytykset

Seuraa mukana muistikirjassa

Voit seurata muistikirjassa jompaa kumpiakin tapoja:

  • Avaa ja suorita sisäinen muistikirja Synapse Data Science -kokemuksessa.
  • Lataa muistikirja GitHubista Synapse Data Science -kokemukseen.

Avaa sisäinen muistikirja

Time-sarjan esimerkkimuistikirja on tämän opetusohjelman mukana.

Opetusohjelman sisäinen näytemuistikirja avataan Synapse Data Science -kokemuksesta seuraavasti:

  1. Siirry Synapse Data Science -aloitussivulle.

  2. Valitse Käytä mallia.

  3. Valitse vastaava malli:

    • Oletusarvoisen Päästä päähän -työnkulkujen (Python) välilehdestä, jos malli on tarkoitettu Python-opetusohjelmaa varten.
    • Jos malli on R-opetusohjelmassa, päästä päähän -työnkulut (R) -välilehdeltä.
    • Pikaopetusohjelmat-välilehdessä, jos malli on pikaopetusohjelmaa varten.
  4. Liitä muistikirjaan lakehouse, ennen kuin aloitat koodin suorittamisen.

Tuo muistikirja GitHubista

AIsample – Time Series Forecasting.ipynb on muistikirja, joka seuraa tätä opetusohjelmaa.

Jos haluat avata tämän opetusohjelman liitteenä olevan muistikirjan, tuo muistikirja työtilaasi noudattamalla ohjeita kohdassa Järjestelmän valmisteleminen datatieteen opetusohjelmia varten.

Jos haluat kopioida ja liittää koodin tältä sivulta, voit luoda uuden muistikirjan.

Muista liittää lakehouse muistikirjaan ennen kuin aloitat koodin suorittamisen.

Vaihe 1: Mukautettujen kirjastojen asentaminen

Kun kehität koneoppimismallia tai käsittelet ad-hoc-tietoanalyysia, sinun on ehkä asennettava nopeasti mukautettu kirjasto (esimerkiksi prophet tässä muistikirjassa) Apache Spark -istuntoa varten. Jos haluat tehdä tämän, sinulla on kaksi vaihtoehtoa.

  1. Voit käyttää in-line-asennusominaisuuksia (esimerkiksi %pip, %condajne.) uusien kirjastojen käytön aloittamiseen nopeasti. Tämä asentaa vain nykyisen muistikirjan mukautetut kirjastot, ei työtilaan.
# Use pip to install libraries
%pip install <library name>

# Use conda to install libraries
%conda install <library name>
  1. Vaihtoehtoisesti voit luoda Fabric-ympäristön, asentaa kirjastoja julkisista lähteistä tai ladata mukautettuja kirjastoja siihen, jonka jälkeen työtilan järjestelmänvalvoja voi liittää ympäristön työtilan oletusarvoksi. Kaikki ympäristön kirjastot ovat sitten käytettävissä missä tahansa muistikirjoissa ja Spark-työmääritelmissä työtilassa. Katso lisätietoja ympäristöistä kohdasta Ympäristön luominen, määrittäminen ja käyttäminen Microsoft Fabricissa.

Tätä muistikirjaa varten asennat kirjaston :n prophet avulla%pip install. PySpark-ydin käynnistyy uudelleen :n jälkeen %pip install. Tämä tarkoittaa sitä, että sinun on asennettava kirjasto ennen kuin suoritat muita soluja.

# Use pip to install Prophet
%pip install prophet

Vaihe 2: Lataa tiedot

Tietojoukko

Tässä muistikirjassa käytetään NYC Property Sales -tietojoukkoa. Se kattaa tiedot vuosina 2003–2015, jotka NEWC:n valtiovarainministeriö on julkaissut Nyc Open Data Portalissa.

Tietojoukko sisältää tiedot kaikista newyorkilaisten kiinteistömarkkinoiden rakennusmyynnistä 13 vuoden kuluessa. Katso tietojoukon sarakkeiden määritelmä kohdasta Ominaisuusmyyntitiedostojen sanasto.

kaupunginosa naapurusto building_class_category tax_class block arpa itäinen building_class_at_present osoite 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 AAKKOSKAUPUNKI 07 VUOKRAUSTA - WALKUP APARTMENTS 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 AAKKOSKAUPUNKI 07 VUOKRAUSTA - WALKUP APARTMENTS 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

Tavoitteena on luoda malli, joka ennustaa kuukausittaisen kokonaismyynnin historiallisten tietojen perusteella. Tätä varten käytetään Profeetta-kirjastoa, joka on Facebookin kehittämä avoimen lähdekoodin ennustekirjasto. Profeetta perustuu lisäävään malliin, jossa epälineaariset trendit sopivat päivittäiseen, viikoittaiseen ja vuosittaiseen kausivaihteluun ja lomavaikutuksiin. Profeetta toimii parhaiten aikasarjatietojoukoissa, joilla on voimakkaita kausivaikutuksia ja useita historiatietojen vuodenaikoja. Lisäksi Profeetta käsittelee tehokkaasti puuttuvia tietoja ja tietojen poikkeavia arvoja.

Profeetta käyttää mätänevää aikasarjamallia, joka koostuu kolmesta osasta:

  • trend: Profeetta olettaa, että määrä kasvaa jatkuvasti, ja automaattinen muutospisteen valinta
  • kausiluonteisuus: Oletusarvoisesti Profeetta sovittaa Fourier-sarjan avulla viikoittaisen ja vuosittaisen kausivaihtelun
  • holidays: Profeetta vaatii kaikki juhlapyhien menneet ja tulevat tapahtumat. Jos loma ei toistu tulevaisuudessa, Profeetta ei sisällytä sitä ennusteeseen.

Tämä muistikirja koostaa tiedot kuukausittain, joten se ei huomioi lomia.

Lue virallisesta paperista lisätietoja profeetan mallinnustekniikoista.

Lataa tietojoukko ja lataa se Lakehouse-palveluun.

Tietolähde koostuu 15 .csv tiedostosta. Nämä tiedostot sisältävät ominaisuusmyyntitietueita viidestä newyorkilaisesta kaupunginosasta vuosina 2003–2015. Kätevästi nyc_property_sales.tar tiedosto sisältää kaikki nämä .csv tiedostot ja pakkaa ne yhdeksi tiedostoksi. Julkisesti käytettävissä oleva blob-säilö isännöi tätä .tar tiedostoa.

Vihje

Tämän koodisolun parametrien avulla voit helposti käyttää tätä muistikirjaa eri tietojoukkoihin.

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

Tämä koodi lataa tietojoukosta julkisesti saatavilla olevan version ja tallentaa sitten kyseisen tietojoukon Fabric Lakehouse -järjestelmään.

Tärkeä

Varmista, että lisäät muistikirjaan lakehousen, ennen kuin suoritat sen. Jos näin ei tehdä, tuloksena on virhe.

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}")

Aloita muistikirjan suoritusajan tallennus.

# Record the notebook running time
import time

ts = time.time()

MLflow-kokeilujen seurannan määrittäminen

Jos haluat laajentaa MLflow-kirjaustoimintoja, automaattinen käyttöönotto tallentaa automaattisesti koneoppimismallin syöteparametrien arvot ja tulostemittarit sen harjoittamisen aikana. Nämä tiedot kirjataan sitten työtilaan, jossa MLflow-ohjelmointirajapinnat tai niitä vastaavat kokeilut työtilassa voivat käyttää ja visualisoida niitä. Tässä resurssissa on lisätietoja automaattisesta lokista.

# Set up the MLflow experiment
import mlflow

mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True)  # Disable MLflow autologging

Muistiinpano

Jos haluat poistaa Microsoft Fabric -automaattisen lokeraamisen käytöstä muistikirjaistunnossa, kutsu mlflow.autolog() ja määritä disable=True.

Lue raakapäivämäärätiedot Lakehousesta

df = (
    spark.read.format("csv")
    .option("header", "true")
    .load("Files/NYC_Property_Sales_Dataset/csv")
)

Vaihe 3: Aloita valmisteleva tietoanalyysi

Jos haluat tarkastella tietojoukkoa, voit tarkastella tietojen alijoukkoa manuaalisesti, jotta saat siitä paremman käsityksen. -funktion display avulla voit tulostaa DataFramen. Voit myös näyttää kaavionäkymät, jotta voit helposti visualisoida tietojoukon alijoukkoja.

display(df)

Tietojoukon manuaalinen tarkastelu johtaa joihinkin varhaisiin havaintoihin:

  • Myyntihintojen 0,00 $:n esiintymät. Termien sanaston mukaan tämä merkitsee omistajuuden siirtämistä ilman käteisvaroja. Toisin sanoen tapahtumassa ei virtauteta kassavirtaa. Poista tietojoukosta myynti, jossa on 0,00 sales_price dollarin arvot.

  • Tietojoukko kattaa eri rakennusluokat. Tämä muistikirja keskittyy kuitenkin asuinrakennuksiin, jotka termien sanaston mukaan on merkitty tyypiksi "A". Suodata tietojoukko sisältämään vain asuinrakennukset. Voit tehdä tämän sisällytä joko - building_class_at_time_of_sale tai - building_class_at_present sarakkeisiin. Sinun täytyy sisällyttää building_class_at_time_of_sale vain tiedot.

  • Tietojoukko sisältää esiintymät, joissa total_units arvot ovat 0 tai gross_square_feet arvot 0. Poista kaikki esiintymät, joissa total_units tai gross_square_units arvot ovat 0.

  • Joillakin sarakkeilla - esimerkiksi apartment_number, tax_class, build_class_at_presentja niin edelleen - on puuttuvia tai NULL-arvoja. Oletetaan, että puuttuvista tiedoista puuttuu toimistovirheitä tai ei-mitään tietoja. Analyysi ei riipu näistä puuttuvista arvoista, joten voit jättää ne huomiotta.

  • Sarake sale_price tallennetaan merkkijonona, jonka etuliite on $. Jos haluat jatkaa analyysia, esitä tämä sarake numerona. Sarakkeen tulisi heksata sale_price kokonaislukuna.

Tyyppimuunnos ja suodatus

Voit ratkaista joitakin tunnistettuja ongelmia tuomalla tarvittavat kirjastot.

# Import libraries
import pyspark.sql.functions as F
from pyspark.sql.types import *

Myyntitietojen koostaminen merkkijonosta kokonaisluvuksi

Käytä säännönmukaisia lausekkeita erottamaan merkkijonon numero-osa dollarimerkistä (esimerkiksi merkkijonossa $300,000, split $ ja 300,000) ja pyöristämään numeerinen osa kokonaislukuna.

Suodata sitten tiedot sisältämään vain esiintymät, jotka täyttävät kaikki nämä ehdot:

  1. sales_price on suurempi kuin 0
  2. total_units on suurempi kuin 0
  3. gross_square_feet on suurempi kuin 0
  4. building_class_at_time_of_sale on tyyppiä 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%"'
)

Koostaminen kuukausittain

Tietoresurssi seuraa ominaisuusmyyntiä päivittäin, mutta tämä lähestymistapa on liian vaiheittainen tälle muistikirjalle. Koosta tiedot sen sijaan kuukausittain.

Muuta ensin päivämääräarvot näyttämään vain kuukausi- ja vuositiedot. Päivämääräarvot sisältävät edelleen vuositiedot. Voit silti erottaa toisistaan esimerkiksi joulukuun 2005 ja joulukuun 2006.

Lisäksi voit pitää vain sarakkeet oleellisina analyysin kannalta. Näitä ovat esimerkiksi sales_price, gross_square_feet total_unitsja sales_date. Sinun täytyy myös nimetä sales_date uudelleen nimellä 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)

Koosta -, sale_pricetotal_units - ja gross_square_feet -arvot kuukauden mukaan. Ryhmittele sitten tiedot :n mukaan monthja laske yhteen kunkin ryhmän kaikki arvot.

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 to Pandas -muunto

Pyspark DataFrames käsittelee suuria tietojoukkoja hyvin. Tietojen koostamisen vuoksi DataFramen koko on kuitenkin pienempi. Tämä viittaa siihen, että voit nyt käyttää pandas DataFrame -kehyksia.

Tämä koodi heittää tietojoukon pyspark DataFramesta pandas DataFrame -kehykseksi.

import pandas as pd

df_pandas = summary_df.toPandas()
display(df_pandas)

Visualisointi

Voit tarkastella New Yorkin kiinteistökaupan trendiä tietojen ymmärtämiseksi paremmin. Tämä johtaa merkityksellisiin tietoihin mahdollisista malleista ja kausivaihtelun trendeistä. Lue lisää Microsoft Fabric -tietojen visualisoinnista tästä resurssista.

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()

Yhteenveto valmistelevan tietoanalyysin havainnoista

  • Tiedot näyttävät selkeän toistuvan mallin vuosittain. Tämä tarkoittaa, että tiedoilla on vuosittaista kausivaihtelua
  • Kesäkuukausien myyntimäärät näyttävät olevan suuremmat kuin talvikuukausina
  • Kun verrataan vuosia, joilla myynti on korkea ja vuodet alhaisella myynnillä, suurten myyntikuukausien ja suurten myyntivuosien alhaisen myyntikuukausien välinen tuottoero ylittää – absoluuttisesti - suurten myyntikuukausien ja matalien myyntikuukausien välisen tuottoeron alhaisina myyntivuosina.

Esimerkiksi vuonna 2004 suurimman myyntikuukauden ja pienimmän myyntikuukauden välinen tuottoero on noin:

$900,000,000 - $500,000,000 = $400,000,000

Vuonna 2011 tuoton erojen laskutoimituksessa on kyse:

$400,000,000 - $300,000,000 = $100,000,000

Tästä tulee tärkeää myöhemmin, kun sinun täytyy päättää lisäävän ja lisäävän kausivaihteluvaikutuksen välillä.

Vaihe 4: Mallin harjoittaminen ja seuranta

Mallin asentaminen

Profeetan syöte on aina kahden sarakkeen DataFrame. Yksi syötesarake on aikasarake, jonka nimi dson , ja yksi syötesarake on arvosarake nimeltä y. Aikasarakkeen tulee olla päivämäärä-, aika- tai päivämäärä/aika-tietomuoto (esimerkiksi YYYY_MM). Tässä oleva tietojoukko täyttää tämän ehdon. Arvosarakkeen on oltava numeerinen tietomuoto.

Mallin mitatta varten sinun tulee vain nimetä aikasarake uudelleen arvosarakkeeseen ds ja välittää tiedot Profeetta-kohteelle y. Lue lisätietoja profeetta Python-ohjelmointirajapinnan dokumentaatiosta .

df_pandas["ds"] = pd.to_datetime(df_pandas["month"])
df_pandas["y"] = df_pandas["total_sales"]

Profeetta noudattaa scikit-learn-kokousta . Luo ensin uusi Profeetan esiintymä, määritä tietyt parametrit (esimerkiksi,seasonality_mode) ja sovita kyseinen esiintymä sitten tietojoukkoon.

  • Vaikka profeetalle vakio lisäävä tekijä on profeetan oletusarvoinen kausivaihteluvaikutus, käytä kausivaihteluvaikutusparametria "multiplicatiivinen" kausivaihtelu . Edellisen osion analyysi osoitti, että kausivaihtelun amplitude-muutosten vuoksi yksinkertainen lisääva kausivaihtelu ei sovi tietoihin ollenkaan.

  • Poista weekly_seasonality-parametri käytöstä, koska tiedot koostettiin kuukauden mukaan. Tämän vuoksi viikoittaiset tiedot eivät ole käytettävissä.

  • Käytä Markov Chain Monte Carlo (MCMC) - menetelmiä kausiluonteisuuden epävarmuusarvioiden tallentamiseen. Oletuksena Profeetta voi tarjota epävarmuusarvioita trendistä ja havaintomelusta, mutta ei kausivaihtelusta. MCMC vaatii enemmän prosessointiaikaa, mutta niiden avulla algoritmi voi tarjota epävarmuusarvioita kausivaihtelusta sekä trendistä ja havaintomelusta. Lue lisätietoja profeetan epävarmuusvälit -dokumentaatiosta .

  • Voit hienosäätää automaattisen muutospisteen tunnistuksen luottamuksellisuutta changepoint_prior_scale parametrin avulla. Profeetan algoritmi yrittää automaattisesti löytää tiedoista esiintymiä, joissa lentoradat muuttuvat äkillisesti. Oikean arvon löytäminen voi olla hankalaa. Voit ratkaista ongelman kokeilemalla eri arvoja ja valitsemalla sitten mallin, jossa on paras suorituskyky. Lue lisätietoja profeetan trendin muutospisteiden dokumentaatiosta .

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

Ristiintarkistus

Profeetalla on sisäinen ristiintarkistustyökalu. Tämä työkalu voi arvioida ennustevirheen ja löytää mallin, jossa on paras suorituskyky.

Ristiintarkistustekniikka voi vahvistaa mallin tehokkuuden. Tämä tekniikka kouluttaa mallin tietojoukon alijoukkoon ja suorittaa testejä tietojoukon aiemmin näkymättömälle alijoukolle. Tällä menetelmällä voidaan tarkistaa, miten hyvin tilastomalli yleistyy itsenäiseen tietojoukkoon.

Varaa ristiintarkistusta varten tietty otos tietojoukosta, joka ei ollut osa koulutuksen tietojoukkoa. Testaa sitten harjoitettu malli tässä mallissa ennen käyttöönottoa. Tämä lähestymistapa ei kuitenkaan toimi aikasarjatiedoissa, koska jos malli on nähnyt tietoja tammikuulta 2005 ja maaliskuulta 2005 ja yrität ennustaa kuukauden helmikuulta 2005, malli voi käytännössä huijaa, koska siinä saattaa näkyä, mihin tietojen trendi johtaa. Todellisissa sovelluksissa tavoitteena on ennustaa tulevaisuutta näkymättöminä alueina.

Jos haluat käsitellä tämän ja tehdä testistä luotettavan, jaa tietojoukko päivämäärien perusteella. Käytä tietojoukkoa tiettyyn päivämäärään saakka (esimerkiksi ensimmäisten 11 vuoden tiedot) harjoittamiseen ja käytä sitten jäljellä olevia näkymättömiä tietoja ennustamiseen.

Aloita tässä skenaariossa 11 vuoden harjoitustiedoista ja tee sitten kuukausittaiset ennusteet yhden vuoden horisontissa. Tarkemmin sanottuna koulutustiedot sisältävät kaiken vuosina 2003–2013. Sen jälkeen ensimmäinen suoritus käsittelee ennusteita tammikuusta 2014 tammikuuhun 2015. Seuraavassa ajossa käsitellään ennusteet helmikuusta 2014 helmikuuhun 2015 ja niin edelleen.

Toista tämä prosessi jokaiselle kolmelle koulutetulle mallille, jotta näet, mikä malli suoriutuu parhaiten. Vertaa sitten näitä ennusteita reaalimaailman arvoihin, jotta voit määrittää parhaan mallin ennusteen laadun.

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

Lokimalli, jossa on MLflow

Kirjaa mallit, jotta voit seurata niiden parametreja, ja tallenna mallit myöhempää käyttöä varten. Kaikki olennaiset mallitiedot kirjataan työtilaan kokeilun nimellä. Malli, parametrit ja mittarit sekä MLflow-automaattianalyysikohteet tallennetaan yhdellä MLflow-suorituskerralla.

# Setup MLflow
from mlflow.models.signature import infer_signature

Koeiden tekeminen

Koneoppimiskokeilu toimii kaikkien siihen liittyvien koneoppimisten suoritukset organisaation ja hallinnan ensisijaisena yksikkönä. Suoritus vastaa mallikoodin yksittäistä suoritusta. Koneoppimisen kokeilujen seuranta viittaa kaikkien eri kokeiden ja niiden osien hallintaan. Tämä sisältää parametrit, mittarit, mallit ja muut artefaktit, ja se auttaa organisoimaan tietyn koneoppimiskokeilun vaaditut komponentit. Koneoppimisen kokeilujen seuranta mahdollistaa myös aiempien tulosten helpon monistamisen tallennettujen kokeilujen avulla. Lue lisää Microsoft Fabricin koneoppimisen kokeiluista. Kun olet päättänyt, mihin vaiheisiin aiot sisällyttää (esimerkiksi sopivan ja arvioivan Profeeta-mallin tässä muistikirjassa), voit suorittaa kokeen.

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)

Näyttökuva ominaisuuspaneelista.

Visualisoi malli Profeetan avulla

Profeetalla on sisäisiä visualisointifunktioita, jotka voivat näyttää mallin sopivat tulokset.

Mustat pisteet ilmaisevat arvopisteitä, joita käytetään mallin harjoittamiseen. Sininen viiva on ennuste ja vaaleansininen alue näyttää epävarmuuden välit. Olet rakentanut kolme mallia, joissa on erilaiset changepoint_prior_scale arvot. Näiden kolmen mallin ennusteet näytetään tämän koodilohkon tuloksissa.

for idx, pack in enumerate(zip(models, forecasts)):
    m, forecast = pack
    fig = m.plot(forecast)
    fig.suptitle(f"changepoint = {changepoint_priors[idx]}")

Ensimmäisen kaavion pienin changepoint_prior_scale arvo johtaa trendimuutosten alitallennukseen. Kolmannen kaavion suurin changepoint_prior_scale arvo voi johtaa ylitäytymiseen. Toinen kaavio vaikuttaa siis olevan optimaalinen valinta. Tämä tarkoittaa, että toinen malli on sopivin.

Profeetta voi myös helposti visualisoida taustalla olevia trendejä ja kausivaihteluja. Toisen mallin visualisoinnit näkyvät tämän koodilohkon tuloksissa.

BEST_MODEL_INDEX = 1  # Set the best model index according to the previous results
fig2 = models[BEST_MODEL_INDEX].plot_components(forecast)

Näyttökuva hinnoittelutietojen vuositason trendien kaaviosta.

Näissä kaavioissa vaaleansininen varjostus kuvastaa epävarmuutta. Yläkaaviossa näkyy vahva pitkän aikavälin värähtelytrendi. Muutaman vuoden aikana myyntimäärät kasvavat ja laskevat. Alempi kaavio näyttää, että myynti on yleensä huipussaan helmikuussa ja syyskuussa ja saavuttaa vuoden enimmäisarvot kyseisinä kuukausina. Pian näiden kuukausien jälkeen, maaliskuussa ja lokakuussa, ne laskevat vuoden vähimmäisarvoihin.

Arvioi mallien suorituskykyä käyttämällä erilaisia mittareita, esimerkiksi:

  • keskimääräinen neliömäinen virhe (MSE)
  • juuriarvon neliömäinen virhe (RMSE)
  • keskiarvo absoluuttinen virhe (MAE)
  • absoluuttisen prosenttiarvon keskiarvovirhe (MAPE)
  • mediaanin absoluuttinen prosenttivirhe (MDAPE)
  • symmetrinen keskiarvo absoluuttinen prosenttivirhe (SMAPE)

Arvioi kattavuus käyttämällä - ja yhat_upper -yhat_lowerarvioita. Huomaa vaihtelevat horisontit, joissa ennakoit yhden vuoden tulevaisuudessa, 12-kertaisesti.

display(df_metrics[BEST_MODEL_INDEX])

MAPE-mittarin avulla tämän ennustemallin ennusteet, jotka pidentävät yhden kuukauden tulevaisuudessa, sisältävät yleensä noin 8 prosentin virheitä. Vuotta myöhemmin ennusteiden virhe kuitenkin kasvaa noin 10 %:iin.

Vaihe 5: Mallin pisteytys ja ennustetulosten tallentaminen

Pisteytä malli ja tallenna ennustetulokset.

Ennusteiden tekeminen Predict Transformerilla

Nyt voit ladata mallin ja tehdä sen avulla ennusteita. Käyttäjät voivat operationalisoida koneoppimismalleja PREDICT-funktiolla, joka on skaalattava Microsoft Fabric -funktio, joka tukee erän pisteytystä missä tahansa laskentamoduulissa. Lisätietoja :sta PREDICTja sen käyttämisestä Microsoft Fabricissa on tässä resurssissa.

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.")