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.
A kezdőlap bal oldalán található élménykapcsolóval válthat a Synapse Adattudomány felületre.
- 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:
Nyissa meg a Synapse Adattudomány kezdőlapját.
Válassza a Minta használata lehetőséget.
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.
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 ID
Customer 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
, , Q
s
). d
Ezeket a SARIMAX-modellargumentumokat sorrendnek (, , d
q
) és szezonális sorrendnek (P
, D
, Q
), s
nevezzü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ő
3
tartományba tartoznak0
, bár magasabb értékek is lehetségesek. A magasabbp
é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
Azd
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ő
3
tartományba tartoznak0
, de bizonyos idősorokhoz magasabb értékekre lehet szükség. A magasabbq
é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észhezp
hasonlóanD
: A különbség szezonális sorrendje, hasonló a szezonális részhezd
,Q
: A MA összetevő szezonális sorrendje, a szezonális részhezq
hasonlóans
: 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ékreTrue
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 ésD
ad
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 beenforce_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ékreTrue
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.
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.
Kapcsolódó tartalom
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: