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
Hanki Microsoft Fabric -tilaus. Voit myös rekisteröityä ilmaiseen Microsoft Fabric -kokeiluversioon.
Siirry Synapse Data Science -käyttökokemukseen aloitussivun vasemmassa reunassa olevan käyttökokemuksen vaihtajan avulla.
- Microsoft Fabric -muistikirjojen tunteminen.
- Lakehouse tietojen tallentamiseksi tälle esimerkille. Lisätietoja on kohdassa Lisää lakehouse muistikirjaasi.
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:
Siirry Synapse Data Science -aloitussivulle.
Valitse Käytä mallia.
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.
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.
- Voit käyttää in-line-asennusominaisuuksia (esimerkiksi
%pip
,%conda
jne.) 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>
- 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 taigross_square_feet
arvot 0. Poista kaikki esiintymät, joissatotal_units
taigross_square_units
arvot ovat 0.Joillakin sarakkeilla - esimerkiksi
apartment_number
,tax_class
,build_class_at_present
ja 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 heksatasale_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:
sales_price
on suurempi kuin 0total_units
on suurempi kuin 0gross_square_feet
on suurempi kuin 0building_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_units
ja 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_price
total_units
- ja gross_square_feet
-arvot kuukauden mukaan. Ryhmittele sitten tiedot :n mukaan month
ja 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 ds
on , 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)
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.
Visualisoi trendejä ja kausivaihtelua Profeetan avulla
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ä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_lower
arvioita. 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 PREDICT
ja 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.")