Süper mağaza satışları için tahmin modeli geliştirme, değerlendirme ve puanlama

Bu eğitim, Microsoft Fabric'te uçtan uca bir Veri Bilimi iş akışı örneği sunmaktadır. Senaryo, bir süper depodaki ürün kategorisi satışlarını tahmin etmek için geçmiş satış verilerini kullanan bir tahmin modeli oluşturur.

Tahmin, satıştaki önemli bir varlıktır. Gelecekteki eğilimler hakkında içgörüler sağlamak için geçmiş verileri ve tahmine dayalı yöntemleri birleştirir. Tahmin, desenleri tanımlamak için geçmiş satışları analiz edebilir. Ayrıca envanter, üretim ve pazarlama stratejilerini iyileştirmek için tüketici davranışından da bilgi edinebilir. Bu proaktif yaklaşım dinamik bir markette uyarlanabilirliği, yanıt hızını ve genel iş performansını geliştirir.

Bu öğretici şu adımları kapsar:

  • Verileri yükleme
  • Verileri anlamak ve işlemek için keşif veri analizini kullanma
  • Açık kaynak yazılım paketiyle makine öğrenmesi modeli eğitin
  • MLflow ve Fabric'in autologging özelliği ile deneyleri izleme
  • Son makine öğrenmesi modelini kaydetme ve tahminlerde bulunma
  • Power BI görselleştirmeleriyle model performansını gösterme

Önkoşullar

Not defterine not alarak takip et

Not defterinde takip etmek için şu seçeneklere sahipsiniz:

  • Veri Bilimi iş yükündeki yerleşik defteri açın ve çalıştırın
  • Defterinizi GitHub'tan Veri Bilimi iş yüküne yükleyin

Yerleşik not defterini açma

Örnek Satış tahmini not defteri bu öğretici ile birlikte gelir.

  1. Bu öğreticinin örnek not defterini açmak için Sisteminizi veri bilimi öğreticilerine hazırlamabaşlığındaki yönergeleri izleyin.

  2. Kodu çalıştırmaya başlamadan önce not defterine bir göl evi eklediğinizden emin olun.

Not defterini GitHub'dan içeri aktarma

AIsample - Superstore Forecast.ipynb not defteri bu öğreticiye eşlik eder.

  • Bu öğreticiyle birlikte verilen not defterini açmak için, sistemi veri bilimi öğreticilerine hazırlama yönergelerini takip edin () ve ardından not defterini çalışma alanınıza aktarın ().

  • Bu sayfadaki kodu kopyalayıp yapıştırmayı tercih ederseniz, yeni bir not defteri oluşturabilirsiniz.

  • Kod çalıştırmaya başlamadan önce not defteri bir göl evi eklemeyi unutmayın.

1. Adım: Verileri yükleme

Veri kümesinde çeşitli ürünlerin 9.995 satış örneği vardır. Ayrıca 21 öznitelik içerir. Not defteri Superstore.xlsxadlı bir dosya kullanır. Bu dosya şu tablo yapısına sahiptir:

Satır Kimliği Sipariş Kimliği Sipariş Tarihi Sevk Tarihi Nakliye Modu Müşteri Kimliği Müşteri Adı Parça Ülke Şehir Devlet Posta Kodu Bölge Ürün Kimliği Kategori Sub-Category Ürün Adı Satış Miktar İskonto Kâr
4 ABD-2015-108966 2015-10-11 2015-10-18 Standart Sınıf SO-20335 Sean O'Donnell Tüketici Amerika Birleşik Devletleri Fort Lauderdale Florida 33311 Güney FUR-TA-10000577 Mobilya Tablolar Bretford CR4500 Serisi İnce Dikdörtgen Masa 957,5775 5 0.45 -383.0310
11 CA-2014-115812 2014-06-09 2014-06-09 Standart Sınıf Standart Sınıf Brosina Hoffman Tüketici Amerika Birleşik Devletleri Los Angeles California 90032 Batı FUR-TA-10001539 Mobilya Tablolar Chromcraft Dikdörtgen Konferans Tabloları 1706.184 9 0.2 85.3092
31 ABD-2015-150630 2015-09-17 2015-09-21 Standart Sınıf TB-21520 Tracy Blumstein Tüketici Amerika Birleşik Devletleri Philadelphia Pennsylvania 19140 Doğu OFF-EN-10001509 Office Malzemeleri Zarf Polyester Kordonlu Zarflar 3,264 2 0.2 1.1016

Aşağıdaki kod parçacığı, bu not defterini farklı veri kümeleriyle kullanabilmeniz için belirli parametreleri tanımlar:

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

Veri kümesini indirin ve lakehouse'a yükleyin

Aşağıdaki kod parçacığı, veri kümesinin genel kullanıma açık bir sürümünü indirir ve ardından bu veri kümesini Fabric bir lakehouse'da depolar:

Önemli

Çalıştırmadan önce deftere bir lakehouse eklemeniz gerekir. Aksi takdirde bir hata alırsınız.

import os, requests
if not IS_CUSTOM_DATA:
    # Download data files into the lakehouse if they're not already there
    remote_url = "https://synapseaisolutionsa.z13.web.core.windows.net/data/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 deneme izlemesini ayarlama

Microsoft Fabric, siz eğittikçe bir makine öğrenmesi modelinin giriş parametresi değerlerini ve çıkış ölçümlerini otomatik olarak yakalar. Bu özellik, MLflow otomatik kaydetme özelliklerini genişletir. Daha sonra bilgiler çalışma alanına kaydedilir ve burada MLflow API'lerini veya çalışma alanında ilgili denemeyi kullanarak bu bilgilere erişebilir ve bunları görselleştirebilirsiniz. Otomatik kaydetme hakkında daha fazla bilgi için Microsoft Fabric'te otomatik kaydetme kaynağını ziyaret edin.

Microsoft Fabric otomatik günlüğe kaydetmeyi bir not defteri oturumunda kapatmak için aşağıdaki kod parçacığında gösterildiği gibi mlflow.autolog() öğesini çağırın ve disable=True öğesini ayarlayın.

# Set up MLflow for experiment tracking
import mlflow

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

Lakehouse'tan ham verileri okuma

Aşağıdaki kod parçacığı, lakehouse'un Dosyalar bölümünden ham verileri okur. Ayrıca, farklı tarih bölümleri için daha fazla sütun ekler. Aynı bilgiler bölümlenmiş bir delta tablosu oluşturur. Ham veriler bir Excel dosyası olarak depolandığından, bunu okumak için pandas kullanmanız gerekir.

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

2. Adım: Keşif veri analizi gerçekleştirme

Kitaplıkları içeri aktarma

Çözümlemeye başlamadan önce gerekli kitaplıkları içeri aktarın:

# 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

Ham verileri görüntüleme

Veri kümesini daha iyi anlamak için verilerin bir alt kümesini el ile gözden geçirin. DataFrame yazdırmak için display işlevini kullanın. Görünümler Chart , veri kümesinin alt kümelerini kolayca görselleştirebilir:

display(df)

Bu öğreticide öncelikli olarak Furniture kategori satış tahminlerine odaklanan bir not defteri incelenir. Bu yaklaşım hesaplamayı hızlandırır ve modelin performansını göstermeye yardımcı olur. Ancak, bu not defteri uyarlanabilir teknikler kullanır. Diğer ürün kategorilerinin satışlarını tahmin etmek için bu teknikleri genişletebilirsiniz. Aşağıdaki kod parçacığı ürün kategorisi olarak seçer Furniture :

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

Verileri ön işleme

Gerçek dünya iş senaryolarının genellikle üç ayrı kategoride satışları tahmin etmek gerekir:

  • Belirli ürün kategorisi
  • Belirli müşteri kategorisi
  • Ürün kategorisi ve müşteri kategorisinin özel birleşimi

Aşağıdaki kod parçacığı, verileri önceden işlemek için gereksiz sütunları bırakır. İlgileri olmadığından bazı sütunlara (Row ID, Order ID, Customer IDve Customer Name) ihtiyacınız yoktur. Belirli bir ürün kategorisiFurniture () için eyalet ve bölge genelindeki genel satışları tahmin etmek istiyorsunuz. Bu nedenle, State, Region, Country, City ve Postal Code sütunlarını kaldırabilirsiniz. Belirli bir konum veya kategori için satış tahmini yapmak için ön işleme adımını buna göre ayarlamanız gerekebilir.

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

Veri kümesi günlük olarak yapılandırılmıştır. Satışları aylık bazda tahmin edecek bir model geliştirmek istediğiniz için Order Date sütununda yeniden örnekleme yapmalısınız.

İlk olarak, Furniture kategorisini Order Dategöre gruplandırın. Ardından, her grup için Sales sütununun toplamını hesaplayarak her bir benzersiz Order Date değerine ait toplam satışları belirleyin. Verileri aya göre toplamak için Sales sütununu MS sıklığıyla yeniden örnekleme. Son olarak, her ay için ortalama satış değerini hesaplayın. Aşağıdaki kod parçacığı şu adımları gösterir:

# 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şağıdaki kod parçacığında, Order Date öğesinin Sales üzerinde Furniture kategorisi için etkisini gösterin.

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

İstatistiksel analizlerden önce Python modülünü içeri aktarın statsmodels . Bu modül, birçok istatistiksel modeli tahmin etmek için sınıflar ve işlevler sağlar. Ayrıca istatistiksel testler ve istatistiksel veri keşfi gerçekleştirmek için sınıflar ve işlevler sağlar. Aşağıdaki kod parçacığı bu adımı gösterir:

import statsmodels.api as sm

İstatistiksel analiz gerçekleştirme

Zaman serisi, bu öğelerin zaman serisi düzenindeki varyasyonunu belirlemek için bu veri öğelerini belirli aralıklarla izler:

  • Düzey: Belirli bir zaman aralığı için ortalama değeri temsil eden temel bileşendir.

  • Eğilim: Zaman serisinin azaldığını, sabit kaldığını veya zaman içinde arttığını açıklar.

  • Mevsimsellik: Zaman serisindeki periyodik sinyali açıklar ve artan veya azalan zaman serisi desenlerini etkileyen döngüsel oluşumları arar.

  • Gürültü/Artık: Modelin açıklayamadığı, zaman serisi verilerindeki rastgele dalgalanmaları, değişkenliği ifade eder.

Aşağıdaki kod parçacığı, ön işlemeden sonra veri kümeniz için bu öğeleri gösterir:

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

Çizimler tahmin verilerindeki mevsimselliği, eğilimleri ve gürültüyü açıklar. Alttaki desenleri yakalayabilir ve rastgele dalgalanmalara karşı dayanıklı, doğru tahminlerde bulunan modeller geliştirebilirsiniz.

3. Adım: Modeli eğitme ve izleme

Artık kullanılabilir verileriniz olduğuna göre tahmin modelini tanımlayın. Bu not defterinde, eksojen faktörlerle birlikte mevsimsel otomatik regresif tümleşik hareketli ortalama (SARIMAX) tahmin modelini uygulayın. SARIMAX, zaman serisi verileri için doğru ve esnek tahminler yapmak için otoregresif (AR) ve hareketli ortalama (MA) bileşenlerini, mevsimsel fark ve dışsal tahmin edicileri birleştirir.

Denemeleri izlemek için MLflow ve Fabric autologging özelliğini de kullanırsınız. Burada, delta tablosunu göl evinden yükleyin. Göl evi kaynak olarak kabul eden diğer delta tablolarını kullanabilirsiniz. Aşağıdaki kod parçacığı gerekli kitaplıkları içeri aktarır:

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

Hiper parametreleri ayarlama

SARIMAX, normal otomatik girişli tümleşik hareketli ortalama (ARIMA) modunda (p, d, q) yer alan parametreleri hesaplar ve mevsimsellik parametrelerini (P, D, , Qs) ekler. Bu SARIMAX model bağımsız değişkenleri sırasıyla order (p, d, q) ve mevsimsel düzen (P, D, Q, s) olarak adlandırılır. Bu nedenle, modeli eğitmek için önce yedi parametre ayarlamanız gerekir.

Sipariş parametreleri:

  • p: Geçerli değeri tahmin etmek için kullanılan zaman serisindeki geçmiş gözlemlerin sayısını temsil eden AR bileşeninin sırası.

    Genellikle, bu parametre negatif olmayan bir tamsayı değerine sahiptir. Ortak değerler 0 ile 3aralığındadır. Ancak, belirli veri özelliklerine bağlı olarak daha yüksek değerler mümkündür. Daha yüksek bir p değeri, modeldeki geçmiş değerlerin daha uzun bir belleğini gösterir.

  • d: Zaman serisinin sabitliğini sağlamak için kaç kez farkının alınması gerektiğini gösteren fark derecesi.

    Bu parametre negatif olmayan bir tamsayı değerine sahip. Ortak değerler 0 ile 2aralığındadır. d değeri 0, zaman serisinin zaten sabit olduğu anlamına gelir. Daha büyük değerler, sabit hale getirmek için gereken fark alma işlemlerinin sayısının daha yüksek olduğunu gösterir.

  • q: MA bileşeninin sırası. Bu parametre, geçerli değeri tahmin etmek için kullanılan geçmiş beyaz kirlilik hata terimlerinin sayısını temsil eder.

    Bu parametre negatif olmayan bir tamsayı değerine sahip. Ortak değerler 0 ile 3 aralığında, ancak bazı zaman serileri daha yüksek değerler gerektirebilir. Daha yüksek bir q değeri, tahminlerde bulunmak için geçmiş hata terimlerine daha güçlü bir şekilde bağlı olduğunu gösterir.

Mevsimsel sipariş parametreleri:

  • P: AR bileşeninin, parametresine p benzer ancak mevsimsel kısmını kapsayan mevsimsel sırası
  • D: d parametresine benzer şekilde, ancak mevsimsel kısmı kapsayan mevsimsel fark alma sırası
  • Q: MA bileşeninin mevsimsel sırası, parametresine q benzer ancak mevsimsel kısmı kapsar
  • s: Mevsimsel döngü başına adım sayısı (örneğin, yıllık mevsimselliği olan aylık veriler için 12)
# 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]))

SARIMAX'ın başka parametreleri vardır:

  • enforce_stationarity: SARIMAX modelini uygulamadan önce, modelin zaman serisi verilerinde sabitliği zorunlu kılıp kılmaması gerektiği.

    enforce_stationarity değeri True (varsayılan), SARIMAX modelinin zaman serisi verilerinde sabitliği zorunlu kılması gerektiğini gösterir. Modeli uygulamadan önce SARIMAX modeli, c0 ve c1 sıralamalarında belirtildiği gibi sabit hale getirmek için verilere otomatik olarak farklama uygular. Bu yaygın bir uygulamadır çünkü SARIMAX dahil olmak üzere birçok zaman serisi modeli sabit verilerin olduğunu varsayar.

    Durağan olmayan bir zaman serisi için (örneğin, eğilimler veya mevsimsellik gösteren bir seri), enforce_stationarity öğesini True olarak ayarlayın ve durağanlığı sağlamak için SARIMAX modelinin fark alma işlemini gerçekleştirmesine izin verin. Sabit bir zaman serisi için (örneğin, eğilimleri veya mevsimselliği olmayan bir zaman serisi), gereksiz farkları önlemek için enforce_stationarityFalse olarak ayarlayın.

  • enforce_invertibility: İyileştirme işlemi sırasında modelin tahmini parametrelerde ters çevrilebilirliği zorunlu kılıp uygulamayacağını denetler.

    enforce_invertibility değeri True (varsayılan) olduğunda, SARIMAX modelinin tahmini parametrelerde tersinirliği zorunlu kılması gerektiğini gösterir. Tersine çevrilebilirlik, iyi tanımlanmış bir modele ve tahmini AR ve MA katsayılarının durağanlık aralığında yerleşmesine olanak sağlar.

    Tersine çevrilebilirlik uygulaması, SARIMAX modelinin kararlı bir zaman serisi modeli için teorik gereksinimlere uymasını sağlamaya yardımcı olur. Ayrıca model tahmini ve kararlılığıyla ilgili sorunları önlemeye yardımcı olur.

Model AR(1) varsayılan değerdir. Bu, (1, 0, 0)anlamına gelir. Ancak, sipariş parametrelerinin ve mevsimsel sipariş parametrelerinin farklı birleşimlerini denemek ve bir veri kümesinin model performansını değerlendirmek yaygın bir uygulamadır. Uygun değerler bir zaman serisinden diğerine farklılık gösterebilir.

En uygun değerlerin belirlenmesi genellikle zaman serisi verilerinin otokorelasyon fonksiyonu (ACF) ve kısmi otokorelasyon fonksiyonunun (PACF) analizini içerir. Ayrıca genellikle model seçimi ölçütlerinin kullanılmasını da içerir. Örneğin, Akaike bilgi ölçütü (AIC) veya Bayes bilgi ölçütü (BIC).

Aşağıdaki kod parçacığında gösterildiği gibi hiper parametreleri ayarlayın:

# 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

Önceki sonuçların değerlendirmesinin ardından hem sipariş parametreleri hem de mevsimsel sipariş parametreleri için değerleri belirleyebilirsiniz. Seçim, en düşük AIC'yi (örneğin, 279,58) sunan order=(0, 1, 1) ve seasonal_order=(0, 1, 1, 12)' dir. Modeli eğitmek için bu değerleri kullanın. Aşağıdaki kod parçacığı bu adımı gösterir:

Modeli eğitin

# 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])

Bu kod, mobilya satış verileri için bir zaman serisi tahminini görselleştirir. Çizilen sonuçlar hem gözlemlenen verileri hem de güvenilirlik aralığı için gölgeli bir bölgeyle bir adım ileri tahminini gösterir. Aşağıdaki kod parçacıkları görselleştirmeyi gösterir:

# 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şağıdaki kod parçacığı, modelin performansını gerçek değerlerle karşıtlayarak değerlendirmek için kullanır predictions . predictions_future değeri gelecekteki tahminleri gösterir.

# 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. Adım: Modeli puanlayıp tahminleri kaydetme

Aşağıdaki kod parçacığı, bir Power BI raporu oluşturmak için gerçek değerleri tahmin edilen değerlerle tümleştirir. Ayrıca, bu sonuçları lakehouse içindeki bir tabloda depolar.

# 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. Adım: Power BI'da görselleştirme

Power BI raporu 16,58 ortalama mutlak yüzde hatası (MAPE) gösteriyor. MAPE ölçümü bir tahmin yönteminin doğruluğunu tanımlar. Gerçek miktarlarla karşılaştırıldığında tahmin edilen miktarların doğruluğunu temsil eder.

MAPE basit bir ölçümdür. 10% MAPE değeri, sapmanın pozitif veya negatif olmasına bakılmaksızın, tahmin edilen değerlerle gerçek değerler arasındaki ortalama sapmayı 10%temsil eder. İstenen MAPE değerlerinin standartları farklı sektörlerde farklılık gösterir.

Bu grafikteki açık mavi çizgi, gerçek satış değerlerini temsil eder. Koyu mavi çizgi, tahmin edilen satış değerlerini temsil eder. Gerçek ve tahmin edilen satışların karşılaştırması, modelin 2023'ün ilk altı ayında Furniture kategorisi için satışları etkili bir şekilde tahmin ettiğini ortaya koyuyor.

Power BI raporunun ekran görüntüsü.

Bu gözleme dayanarak, 2023'ün son altı ayındaki genel satışlar için modelin tahmin özelliklerine güvenebilir ve 2024'e kadar uzanabilirsiniz. Bu güven stok yönetimi, hammadde tedariki ve işle ilgili diğer konular hakkında stratejik kararları bilgilendirebilir.