Megosztás a következőn keresztül:


Előrejelzési modell fejlesztése, kiértékelése és pontszáma a superstore-értékesítésekhez

Ez az oktatóanyag a Synapse Adattudomány munkafolyamatának végpontok közötti példáját mutatja be a Microsoft Fabricben. A forgatókönyv létrehoz egy előrejelzési modellt, amely az előzmény értékesítési adatokat használja a termékkategória-értékesítések előrejelzéséhez egy szuperadattárban.

Az előrejelzés kulcsfontosságú eszköz az értékesítésben. Az előzményadatokat és a prediktív módszereket kombinálva betekintést nyújt a jövőbeli trendekbe. Az előrejelzés képes elemezni a múltbeli értékesítéseket, hogy azonosítsa a mintákat, és tanuljon a fogyasztói viselkedésből a leltár-, az éles és a marketingstratégiák optimalizálása érdekében. Ez a proaktív megközelítés növeli az alkalmazkodóképességet, a válaszkészséget és a vállalkozások általános teljesítményét egy dinamikus piactéren.

Ez az oktatóanyag az alábbi lépéseket ismerteti:

  • Az adatok betöltése
  • Feltáró adatelemzés használata az adatok megértéséhez és feldolgozásához
  • Gépi tanulási modell betanítása nyílt forráskódú szoftvercsomaggal, és kísérletek nyomon követése az MLflow és a Fabric autologging funkciójával
  • Mentse a végső gépi tanulási modellt, és készítsen előrejelzéseket
  • A modell teljesítményének megjelenítése Power BI-vizualizációkkal

Előfeltételek

  • Microsoft Fabric-előfizetés lekérése. Vagy regisztráljon egy ingyenes Microsoft Fabric-próbaverzióra.

  • Jelentkezzen be a Microsoft Fabricbe.

  • A kezdőlap bal oldalán található élménykapcsolóval válthat a Synapse Adattudomány felületre.

    Screenshot of the experience switcher menu, showing where to select Data Science.

  • Szükség esetén hozzon létre egy Microsoft Fabric-tóházat a Microsoft Fabricben a Tóház létrehozása című cikkben leírtak szerint.

Követés jegyzetfüzetben

A jegyzetfüzetben az alábbi lehetőségek közül választhat:

  • Nyissa meg és futtassa a beépített jegyzetfüzetet a Synapse Adattudomány felületen
  • Jegyzetfüzet feltöltése a GitHubról a Synapse Adattudomány felületére

A beépített jegyzetfüzet megnyitása

Az oktatóanyagot a Sales előrejelzési mintajegyzetfüzete kíséri.

Az oktatóanyag beépített mintajegyzetfüzetének megnyitása a Synapse Adattudomány felületén:

  1. Nyissa meg a Synapse Adattudomány kezdőlapját.

  2. Válassza a Minta használata lehetőséget.

  3. Válassza ki a megfelelő mintát:

    • Ha a minta Python-oktatóanyaghoz készült, az alapértelmezett Végpontok közötti munkafolyamatok (Python) lapon.
    • A végpontok közötti munkafolyamatok (R) lapról, ha a minta R-oktatóanyaghoz készült.
    • A Gyors oktatóanyagok lapon, ha a minta egy gyors oktatóanyaghoz készült.
  4. A kód futtatása előtt csatoljon egy lakehouse-t a jegyzetfüzethez .

A jegyzetfüzet importálása a GitHubról

Az AIsample – Superstore Forecast.ipynb jegyzetfüzet ezt az oktatóanyagot kíséri.

Az oktatóanyaghoz mellékelt jegyzetfüzet megnyitásához kövesse a Rendszer előkészítése adatelemzési oktatóanyagokhoz című témakör utasításait, és importálja a jegyzetfüzetet a munkaterületre.

Ha inkább erről a lapról másolja és illessze be a kódot, létrehozhat egy új jegyzetfüzetet.

A kód futtatása előtt mindenképpen csatoljon egy lakehouse-t a jegyzetfüzethez .

1. lépés: Az adatok betöltése

Az adatkészlet 9995 különböző termék értékesítését tartalmazza. Emellett 21 attribútumot is tartalmaz. Ez a táblázat a jegyzetfüzetben használt Superstore.xlsx fájlból származik:

Sorazonosító Rendelésazonosító Order Date Ship Date Szállítási mód Ügyfél-azonosító Ügyfél neve Szegmens Ország Város Állapot Irányítószám Régió Termékazonosító Kategória Alkategória Termék neve Értékesítés Mennyiség Kedvezmény Nyereség
4 US-2015-108966 2015-10-11 2015-10-18 Standard osztály SO-20335 Sean O'Donnell Ügyfélszolgáltatások Egyesült Államok Fort Lauderdale Florida 33311 Dél FUR-TA-100000577 Bútor Táblák Bretford CR4500 sorozat karcsú téglalap alakú asztal 957.5775 5 0,45 -383.0310
11 CA-2014-115812 2014-06-09 2014-06-09 Standard osztály Standard osztály Brosina Hoffman Ügyfélszolgáltatások Egyesült Államok Los Angeles Kalifornia 90032 Nyugati régió FUR-TA-10001539 Bútor Táblák Chromcraft négyszögletes konferenciatáblák 1706.184 9 0,2 85.3092
31 US-2015-150630 2015-09-17 2015-09-21 Standard osztály TB-21520 Tracy Blumstein Ügyfélszolgáltatások Egyesült Államok Philadelphia Pennsylvania 19140 Keleti régió OFF-EN-10001509 Irodaszerek Borítékok Poly String Tie borítékok 3.264 2 0,2 1.1016

Adja meg ezeket a paramétereket, hogy ezt a jegyzetfüzetet különböző adatkészletekkel használhassa:

IS_CUSTOM_DATA = False  # If TRUE, the dataset has to be uploaded manually

IS_SAMPLE = False  # If TRUE, use only rows of data for training; otherwise, use all data
SAMPLE_ROWS = 5000  # If IS_SAMPLE is True, use only this number of rows for training

DATA_ROOT = "/lakehouse/default"
DATA_FOLDER = "Files/salesforecast"  # Folder with data files
DATA_FILE = "Superstore.xlsx"  # Data file name

EXPERIMENT_NAME = "aisample-superstore-forecast"  # MLflow experiment name

Töltse le az adathalmazt, és töltse fel a lakehouse-ba

Ez a kód letölti az adathalmaz nyilvánosan elérhető verzióját, majd egy Fabric lakehouse-ban tárolja:

Fontos

A futtatás előtt mindenképpen vegyen fel egy lakehouse-t a jegyzetfüzetbe. Ellenkező esetben hibaüzenet jelenik meg.

import os, requests
if not IS_CUSTOM_DATA:
    # Download data files into the lakehouse if they're not already there
    remote_url = "https://synapseaisolutionsa.blob.core.windows.net/public/Forecast_Superstore_Sales"
    file_list = ["Superstore.xlsx"]
    download_path = "/lakehouse/default/Files/salesforecast/raw"

    if not os.path.exists("/lakehouse/default"):
        raise FileNotFoundError(
            "Default lakehouse not found, please add a lakehouse and restart the session."
        )
    os.makedirs(download_path, exist_ok=True)
    for fname in file_list:
        if not os.path.exists(f"{download_path}/{fname}"):
            r = requests.get(f"{remote_url}/{fname}", timeout=30)
            with open(f"{download_path}/{fname}", "wb") as f:
                f.write(r.content)
    print("Downloaded demo data files into lakehouse.")

MLflow-kísérletkövetés beállítása

A Microsoft Fabric a betanítása során automatikusan rögzíti a gépi tanulási modell bemeneti paramétereinek és kimeneti metrikáinak értékeit. Ez kibővíti az MLflow automatikus naplózási képességeit. Ezután a rendszer naplózza az adatokat a munkaterületre, ahol az MLflow API-kkal vagy a munkaterület megfelelő kísérletével érheti el és jelenítheti meg azokat. Az automatikus kereséssel kapcsolatos további információkért tekintse meg az Automatikus keresés a Microsoft Fabricben című témakört.

Ha ki szeretné kapcsolni a Microsoft Fabric automatikus használatát egy jegyzetfüzet-munkamenetben, hívja meg mlflow.autolog() és állítsa be a következőt disable=True:

# Set up MLflow for experiment tracking
import mlflow

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

Nyers adatok olvasása a lakehouse-ból

Nyers adatok beolvasása a lakehouse Fájlok szakaszából. Adjon hozzá további oszlopokat a különböző dátumrészekhez. Ugyanezeket az információkat használják particionált deltatábla létrehozásához. Mivel a nyers adatok Excel-fájlként tárolódnak, a pandas használatával kell elolvasni:

import pandas as pd
df = pd.read_excel("/lakehouse/default/Files/salesforecast/raw/Superstore.xlsx")

2. lépés: Feltáró adatelemzés végrehajtása

Kódtárak importálása

Elemzés előtt importálja a szükséges kódtárakat:

# Importing required libraries
import warnings
import itertools
import numpy as np
import matplotlib.pyplot as plt
warnings.filterwarnings("ignore")
plt.style.use('fivethirtyeight')
import pandas as pd
import statsmodels.api as sm
import matplotlib
matplotlib.rcParams['axes.labelsize'] = 14
matplotlib.rcParams['xtick.labelsize'] = 12
matplotlib.rcParams['ytick.labelsize'] = 12
matplotlib.rcParams['text.color'] = 'k'
from sklearn.metrics import mean_squared_error,mean_absolute_percentage_error

A nyers adatok megjelenítése

Manuálisan tekintse át az adatok egy részhalmazát, hogy jobban megértse magát az adathalmazt, és a display függvény használatával nyomtassa ki a DataFrame-et. Emellett a Chart nézetek könnyen vizualizálhatják az adathalmaz részhalmazait.

display(df)

Ez a jegyzetfüzet elsősorban a kategóriaeladások előrejelzésére Furniture összpontosít. Ez felgyorsítja a számítást, és segít a modell teljesítményének megjelenítésében. Ez a jegyzetfüzet azonban adaptálható technikákat használ. Ezeket a technikákat kiterjesztheti más termékkategóriák értékesítésének előrejelzésére.

# Select "Furniture" as the product category
furniture = df.loc[df['Category'] == 'Furniture']
print(furniture['Order Date'].min(), furniture['Order Date'].max())

Az adatok előfeldolgozása

A valós üzleti forgatókönyveknek gyakran három különböző kategóriában kell előrejeleznie az értékesítéseket:

  • Egy adott termékkategória
  • Egy adott ügyfélkategória
  • A termékkategória és az ügyfélkategória adott kombinációja

Először vesse el a szükségtelen oszlopokat az adatok előfeldolgozásához. Néhány oszlop (Row ID, , Order IDésCustomer IDCustomer Name ) szükségtelen, mert nincs hatása. Egy adott termékkategória (Furniture) teljes értékesítését szeretnénk előrejelzni az állam és a régió egészében, hogy a State, Region, Country, Cityés Postal Code oszlopokat elvethessük. Egy adott hely vagy kategória értékesítésének előrejelzéséhez szükség lehet az előfeldolgozási lépés megfelelő módosítására.

# Data preprocessing
cols = ['Row ID', 'Order ID', 'Ship Date', 'Ship Mode', 'Customer ID', 'Customer Name', 
'Segment', 'Country', 'City', 'State', 'Postal Code', 'Region', 'Product ID', 'Category', 
'Sub-Category', 'Product Name', 'Quantity', 'Discount', 'Profit']
# Drop unnecessary columns
furniture.drop(cols, axis=1, inplace=True)
furniture = furniture.sort_values('Order Date')
furniture.isnull().sum()

Az adathalmaz napi rendszerességgel van strukturálva. Újra kell adnunk az oszlopot Order Date, mert egy modellt szeretnénk fejleszteni, amely havi rendszerességgel előrejelzést készít az értékesítésekről.

Először csoportosítsa a kategóriát Furniture Order Date. Ezután számítsa ki az Sales egyes csoportok oszlopának összegét az egyes egyedi Order Date értékek teljes értékesítésének meghatározásához. Az oszlop újraszámítása Sales a MS gyakorisággal az adatok hónap szerinti összesítéséhez. Végül számítsa ki az egyes hónapok átlagos értékesítési értékét.

# Data preparation
furniture = furniture.groupby('Order Date')['Sales'].sum().reset_index()
furniture = furniture.set_index('Order Date')
furniture.index
y = furniture['Sales'].resample('MS').mean()
y = y.reset_index()
y['Order Date'] = pd.to_datetime(y['Order Date'])
y['Order Date'] = [i+pd.DateOffset(months=67) for i in y['Order Date']]
y = y.set_index(['Order Date'])
maximim_date = y.reset_index()['Order Date'].max()

A kategória hatásának Order Date Sales Furniture bemutatása:

# Impact of order date on the sales
y.plot(figsize=(12, 3))
plt.show()

Statisztikai elemzés előtt importálnia kell a Python-modult statsmodels . Osztályokat és függvényeket biztosít számos statisztikai modell becsléséhez. Emellett osztályokat és funkciókat is biztosít a statisztikai tesztek és a statisztikai adatok feltárásához.

import statsmodels.api as sm

Statisztikai elemzés végrehajtása

Az idősorok meghatározott időközönként nyomon követik ezeket az adatelemeket, hogy meghatározzák ezeknek az elemeknek a variációját az idősor mintájában:

  • Szint: Az adott időszak átlagértékét képviselő alapvető összetevő

  • Trend: Azt írja le, hogy az idősor csökken,állandó marad-e, vagy az idő függvényében növekszik-e

  • Szezonalitás: Az idősor időszakos jelét írja le, és olyan ciklikus előfordulásokat keres, amelyek befolyásolják az idősorok növekvő vagy csökkenő mintáit

  • Zaj/reziduális: A modell által nem magyarázható idősoradatok véletlenszerű ingadozásait és variabilitását jelenti.

Ebben a kódban az előfeldolgozás után megfigyelheti az adathalmaz elemeit:

# Decompose the time series into its components by using statsmodels
result = sm.tsa.seasonal_decompose(y, model='additive')

# Labels and corresponding data for plotting
components = [('Seasonality', result.seasonal),
              ('Trend', result.trend),
              ('Residual', result.resid),
              ('Observed Data', y)]

# Create subplots in a grid
fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(12, 7))
plt.subplots_adjust(hspace=0.8)  # Adjust vertical space
axes = axes.ravel()

# Plot the components
for ax, (label, data) in zip(axes, components):
    ax.plot(data, label=label, color='blue' if label != 'Observed Data' else 'purple')
    ax.set_xlabel('Time')
    ax.set_ylabel(label)
    ax.set_xlabel('Time', fontsize=10)
    ax.set_ylabel(label, fontsize=10)
    ax.legend(fontsize=10)

plt.show()

A diagramok az előrejelzési adatok szezonalitását, trendjeit és zaját írják le. Rögzítheti az alapul szolgáló mintákat, és olyan modelleket fejleszthet, amelyek pontos előrejelzéseket tesznek lehetővé, amelyek rugalmasak a véletlenszerű ingadozásokkal szemben.

3. lépés: A modell betanítása és nyomon követése

Most, hogy már rendelkezik az elérhető adatokkal, határozza meg az előrejelzési modellt. Ebben a jegyzetfüzetben alkalmazza a szezonális autoregresszív integrált mozgó átlagnak nevezett előrejelzési modellt exogén tényezőkkel (SARIMAX). A SARIMAX az autoregresszív (AR) és a mozgó átlag (MA) összetevőket, a szezonális különbségeket és a külső prediktorokat kombinálva pontos és rugalmas előrejelzéseket készít az idősoradatokhoz.

Az MLflow és a Fabric automatikus kitöltésével is nyomon követheti a kísérleteket. Itt töltse be a delta táblát a tóházból. Használhat más deltatáblákat is, amelyek a lakehouse-t tekintik forrásnak.

# Import required libraries for model evaluation
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error

Hiperparaméterek hangolása

A SARIMAX figyelembe veszi a normál autoregresszív integrált mozgóátlag (ARIMA) mód (p, , ), qés hozzáadja a szezonalitási paramétereket (P, D, , Qs). d Ezeket a SARIMAX-modellargumentumokat sorrendnek (, , dq) és szezonális sorrendnek (P, D, Q), snevezzük.p Ezért a modell betanítása érdekében először hét paramétert kell hangolnunk.

A rendelés paraméterei:

  • p: Az AR-összetevő sorrendje, amely az aktuális érték előrejelzéséhez használt idősor múltbeli megfigyeléseinek számát jelöli.

    Ennek a paraméternek általában nem negatív egész számnak kell lennie. A gyakori értékek az adott adattulajdonságoktól függően a következő 3tartományba tartoznak0, bár magasabb értékek is lehetségesek. A magasabb p érték a modell korábbi értékeinek hosszabb memóriáját jelzi.

  • d: A különbségi sorrend, amely azt jelöli, hogy hány alkalommal kell különbséget tenni az idősoron a helyhez kötöttség eléréséhez.

    Ennek a paraméternek nem negatív egész számnak kell lennie. A gyakori értékek a következő tartományba tartoznak 0 2: . 0 Az d idősor értéke már álló. A magasabb értékek a helyhez kötöttséghez szükséges különbségi műveletek számát jelzik.

  • q: Az MA-összetevő sorrendje, amely az aktuális érték előrejelzéséhez használt korábbi fehér zajú hibakifejezések számát jelöli.

    Ennek a paraméternek nem negatív egész számnak kell lennie. A gyakori értékek a következő 3tartományba tartoznak0, de bizonyos idősorokhoz magasabb értékekre lehet szükség. A magasabb q érték azt jelzi, hogy erősebben támaszkodik a múltbeli hibakifejezésekre az előrejelzések készítéséhez.

A szezonális rendelés paraméterei:

  • P: Az AR-összetevő szezonális sorrendje, a szezonális részhez p hasonlóan
  • D: A különbség szezonális sorrendje, hasonló a szezonális részhez d ,
  • Q: A MA összetevő szezonális sorrendje, a szezonális részhez q hasonlóan
  • s: Szezonális ciklusonkénti időlépések száma (például 12 az éves szezonalitással rendelkező havi adatok esetében)
# Hyperparameter tuning
p = d = q = range(0, 2)
pdq = list(itertools.product(p, d, q))
seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
print('Examples of parameter combinations for Seasonal ARIMA...')
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1]))
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))

A SARIMAX más paraméterekkel is rendelkezik:

  • enforce_stationarity: A SARIMAX-modell illesztése előtt a modellnek kötelező-e az idősoradatokra vonatkozó helyőrület.

    Ha enforce_stationarity (az alapértelmezett) értékre True van állítva, az azt jelzi, hogy a SARIMAX-modellnek az idősoradatokon érvényesítenie kell az állomásaritást. A SARIMAX-modell ezután automatikusan különbséget alkalmaz az adatokon, hogy azok a modell illesztése előtt a rendelések és D a d megrendelések szerint helyhez kötöttek legyenek. Ez egy gyakori gyakorlat, mivel számos idősorozat-modell, beleértve a SARIMAX-ot is, feltételezi, hogy az adatok helyhez kötöttek.

    Ha nem egy adott idősort használ (például trendeket vagy szezonalitást mutat), célszerű ezt beállítani enforce_stationarity True, és hagyja, hogy a SARIMAX modell kezelje a különbségeket a helyhez kötöttség eléréséhez. A helyhez kötött idősorok (például trendek vagy szezonalitás nélküliek) esetében a szükségtelen különbség elkerülése érdekében állítsa be enforce_stationarity False .

  • enforce_invertibility: Azt határozza meg, hogy a modell kényszerítse-e az invertálhatóságot a becsült paraméterekre az optimalizálási folyamat során.

    Ha enforce_invertibility (az alapértelmezett) értékre True van állítva, az azt jelzi, hogy a SARIMAX modellnek inverzitást kell érvényesítenie a becsült paramétereken. Az invertálhatóság biztosítja, hogy a modell megfelelően legyen definiálva, és hogy a becsült AR- és MA-együttható az állandóság tartományán belülre húzódjon.

    Az invertálhatóság kényszerítése segít biztosítani, hogy a SARIMAX modell megfeleljen a stabil idősorozat-modell elméleti követelményeinek. Emellett segít megelőzni a modell becslésével és stabilitásával kapcsolatos problémákat.

Az alapértelmezett modell egy AR(1) modell. Ez a .-ra (1, 0, 0)vonatkozik. Általános gyakorlat azonban a rendelési paraméterek és a szezonális rendelési paraméterek különböző kombinációinak kipróbálása, valamint az adathalmaz modellteljesítményének kiértékelése. A megfelelő értékek idősoronként eltérőek lehetnek.

Az optimális értékek meghatározása gyakran magában foglalja az idősoradatok automatikus javítási függvényének (ACF) és részleges automatikus javítási függvényének (PACF) elemzését. Gyakran használ modellkiválasztási kritériumokat is – például az Akaike információs kritériumot (AIC) vagy a Bayes-féle információs kritériumot (BIC).

A hiperparaméterek hangolása:

# Tune the hyperparameters to determine the best model
for param in pdq:
    for param_seasonal in seasonal_pdq:
        try:
            mod = sm.tsa.statespace.SARIMAX(y,
                                            order=param,
                                            seasonal_order=param_seasonal,
                                            enforce_stationarity=False,
                                            enforce_invertibility=False)
            results = mod.fit(disp=False)
            print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))
        except:
            continue

Az előző eredmények kiértékelése után a rendelési paraméterek és a szezonális rendelési paraméterek értékeit is meghatározhatja. A választás a order=(0, 1, 1) legalacsonyabb AIC-t (például 279,58) kínáló és seasonal_order=(0, 1, 1, 12)a legalacsonyabb. Ezekkel az értékekkel taníthatja be a modellt.

A modell betanítása

# Model training 
mod = sm.tsa.statespace.SARIMAX(y,
                                order=(0, 1, 1),
                                seasonal_order=(0, 1, 1, 12),
                                enforce_stationarity=False,
                                enforce_invertibility=False)
results = mod.fit(disp=False)
print(results.summary().tables[1])

Ez a kód a bútorértékesítési adatok idősor-előrejelzését jeleníti meg. A ábrázolt eredmények a megfigyelt adatokat és az egylépéses előrejelzést is megjelenítik, egy árnyékolt régióval a megbízhatósági intervallumhoz.

# Plot the forecasting results
pred = results.get_prediction(start=maximim_date, end=maximim_date+pd.DateOffset(months=6), dynamic=False) # Forecast for the next 6 months (months=6)
pred_ci = pred.conf_int() # Extract the confidence intervals for the predictions
ax = y['2019':].plot(label='observed')
pred.predicted_mean.plot(ax=ax, label='One-step ahead forecast', alpha=.7, figsize=(12, 7))
ax.fill_between(pred_ci.index,
                pred_ci.iloc[:, 0],
                pred_ci.iloc[:, 1], color='k', alpha=.2)
ax.set_xlabel('Date')
ax.set_ylabel('Furniture Sales')
plt.legend()
plt.show()
# Validate the forecasted result
predictions = results.get_prediction(start=maximim_date-pd.DateOffset(months=6-1), dynamic=False)
# Forecast on the unseen future data
predictions_future = results.get_prediction(start=maximim_date+ pd.DateOffset(months=1),end=maximim_date+ pd.DateOffset(months=6),dynamic=False)

A modell teljesítményének felmérésére használható predictions a tényleges értékekkel való kontrasztos megjelenítéssel. Az predictions_future érték a jövőbeli előrejelzést jelzi.

# Log the model and parameters
model_name = f"{EXPERIMENT_NAME}-Sarimax"
with mlflow.start_run(run_name="Sarimax") as run:
    mlflow.statsmodels.log_model(results,model_name,registered_model_name=model_name)
    mlflow.log_params({"order":(0,1,1),"seasonal_order":(0, 1, 1, 12),'enforce_stationarity':False,'enforce_invertibility':False})
    model_uri = f"runs:/{run.info.run_id}/{model_name}"
    print("Model saved in run %s" % run.info.run_id)
    print(f"Model URI: {model_uri}")
mlflow.end_run()
# Load the saved model
loaded_model = mlflow.statsmodels.load_model(model_uri)

4. lépés: A modell pontszáma és az előrejelzések mentése

A tényleges értékek integrálása az előrejelzett értékekkel Power BI-jelentés létrehozásához. Ezeket az eredményeket egy táblában tárolja a lakehouse-ban.

# Data preparation for Power BI visualization
Future = pd.DataFrame(predictions_future.predicted_mean).reset_index()
Future.columns = ['Date','Forecasted_Sales']
Future['Actual_Sales'] = np.NAN
Actual = pd.DataFrame(predictions.predicted_mean).reset_index()
Actual.columns = ['Date','Forecasted_Sales']
y_truth = y['2023-02-01':]
Actual['Actual_Sales'] = y_truth.values
final_data = pd.concat([Actual,Future])
# Calculate the mean absolute percentage error (MAPE) between 'Actual_Sales' and 'Forecasted_Sales' 
final_data['MAPE'] = mean_absolute_percentage_error(Actual['Actual_Sales'], Actual['Forecasted_Sales']) * 100
final_data['Category'] = "Furniture"
final_data[final_data['Actual_Sales'].isnull()]
input_df = y.reset_index()
input_df.rename(columns = {'Order Date':'Date','Sales':'Actual_Sales'}, inplace=True)
input_df['Category'] = 'Furniture'
input_df['MAPE'] = np.NAN
input_df['Forecasted_Sales'] = np.NAN
# Write back the results into the lakehouse
final_data_2 = pd.concat([input_df,final_data[final_data['Actual_Sales'].isnull()]])
table_name = "Demand_Forecast_New_1"
spark.createDataFrame(final_data_2).write.mode("overwrite").format("delta").save(f"Tables/{table_name}")
print(f"Spark DataFrame saved to delta table: {table_name}")

5. lépés: Vizualizáció a Power BI-ban

A Power BI-jelentés 16,58 százalékos átlagos abszolút százalékos hibát (MAPE) mutat. A MAPE metrika határozza meg az előrejelzési módszer pontosságát. Ez az előrejelzett mennyiségek pontosságát jelöli a tényleges mennyiségekkel összehasonlítva.

A MAPE egy egyszerű metrika. A 10%-os MAPE azt jelenti, hogy az előrejelzett értékek és a tényleges értékek közötti átlagos eltérés 10%, függetlenül attól, hogy az eltérés pozitív vagy negatív volt-e. A kívánatos MAPE-értékek szabványai iparágonként eltérőek.

A gráf világoskék vonala a tényleges értékesítési értékeket jelöli. A sötétkék vonal az előrejelzett értékesítési értékeket jelöli. A tényleges és az előrejelzett értékesítés összehasonlítása azt mutatja, hogy a modell 2023 első hat hónapjában hatékonyan előrejelzi a Furniture kategória értékesítéseit.

Screenshot of a Power BI report.

E megfigyelés alapján megbízhatunk a modell előrejelzési képességeiben, a 2023 utolsó hat hónapjának teljes értékesítésében, és 2024-ig terjedően. Ez a bizalom képes tájékoztatni a stratégiai döntéseket a készletkezelésről, a nyersanyagok beszerzéséről és más üzleti szempontokról.