Tahmin nesnesiyle çalışmak

Üretim için Tahmin (Forecasting) Hatları Tasarlama

Rami Krispin

Senior Manager, Data Science and Engineering

Bir tahmin nesnesiyle çalışın

  • Veri hazırlığı
  • Birden çok tahmin modelini eğitip test etme
  • Modellerin performansını değerlendirme
  • statsforecast paketi
    • alıştırmalarda mlforecast
Üretim için Tahmin (Forecasting) Hatları Tasarlama

Eğitim Bölümü

Zaman Serisi

Test Bölümü

Test Bölümü

Üretim için Tahmin (Forecasting) Hatları Tasarlama

Gerekli kütüphaneler

import pandas as pd 
import datetime 
Üretim için Tahmin (Forecasting) Hatları Tasarlama

Gerekli kütüphaneler

from statsforecast import StatsForecast

from statsforecast.models import (
    DynamicOptimizedTheta,
    SeasonalNaive,
    AutoARIMA,
    HoltWinters,
    MSTL
)

from utilsforecast.plotting import plot_series
Üretim için Tahmin (Forecasting) Hatları Tasarlama

statsforecast veri biçimi

Veri giriş biçimi:

  1. unique_id - seri kimliği
  2. ds - seri zaman damgası
  3. y - seri değerleri
Üretim için Tahmin (Forecasting) Hatları Tasarlama

Veri hazırlığı - veri yükleme

ts = pd.read_csv("data/data.csv")
ts["ds"] = pd.to_datetime(ts["ds"])
ts = ts.sort_values("ds")
ts = ts[["unique_id", "ds", "y"]]

os.environ['NIXTLA_ID_AS_COL'] = '1'
 unique_id        ds             y
0    1    2022-11-11 23:00:00    456403
1    1    2022-11-12 00:00:00    458842
2    1    2022-11-12 01:00:00    455111
3    1    2022-11-12 02:00:00    448035
4    1    2022-11-12 03:00:00    438165
Üretim için Tahmin (Forecasting) Hatları Tasarlama

Veri hazırlığı - eğitim/test ayrımı

  • Zaman serisini eğitim ve test bölümlerine ayırın
    • datetime.timedelta kullanarak
    • son 72 saati test olarak bırakın
test_length = 72

train_end = end  - datetime.timedelta(hours = test_length)

train = ts[ts["ds"] <= train_end]
test = ts[ts["ds"] > train_end]
Üretim için Tahmin (Forecasting) Hatları Tasarlama

Veri hazırlığı

plot_series(train, engine = "plotly")

Zaman Serisi

plot_series(test, engine = "plotly")

Test Bölümü

Üretim için Tahmin (Forecasting) Hatları Tasarlama

StatsModels ile tahminleme

# Saatlik mevsimsellik ile modelleri başlatın
auto_arima = AutoARIMA()
s_naive = SeasonalNaive(season_length=24)
theta =  DynamicOptimizedTheta(season_length=24)

# Saatlik ve haftalık mevsimsellik ile modelleri başlatın mstl1 = MSTL(season_length=[24, 24 * 7], trend_forecaster=AutoARIMA(), alias="MSTL_ARIMA_trend") mstl2 = MSTL(season_length=[24, 24 * 7], trend_forecaster=HoltWinters(), alias="MSTL_Holt_trend")
Üretim için Tahmin (Forecasting) Hatları Tasarlama

StatsModels ile tahminleme

# Modelleri bir listede birleştirin
stats_models = [auto_arima, s_naive, theta, mstl1, mstl2]

# Model nesnesini oluşturun sf = StatsForecast( models=stats_models, freq="h", fallback_model = AutoARIMA(), n_jobs= -1)
Üretim için Tahmin (Forecasting) Hatları Tasarlama

StatsModels ile tahminleme

# Modelleri bir listede birleştirin
stats_models = [auto_arima, s_naive, theta, mstl1, mstl2]

# Model nesnesini oluşturun sf = StatsForecast( models=stats_models, freq="h", fallback_model = AutoARIMA(), n_jobs= -1)
# Tahmini oluşturun forecast_stats = sf.forecast(df=train, h=72, level=[95])
Üretim için Tahmin (Forecasting) Hatları Tasarlama

StatsModels ile Tahminleme

p = sf.plot(test, forecast_stats, engine = "plotly", level=[95])
p.update_layout(height=400)

Tahmin Grafiği

Üretim için Tahmin (Forecasting) Hatları Tasarlama

Model değerlendirme

def mape(y, yhat):
    mape = mean(abs(y - yhat)/ y) 
    return mape

def rmse(y, yhat):
    rmse = (mean((y - yhat) ** 2 )) ** 0.5
    return rmse

def coverage(y, lower, upper):
    coverage = sum((y <= upper) & (y >= lower)) / len(y)
    return coverage
Üretim için Tahmin (Forecasting) Hatları Tasarlama

Model değerlendirme

fc = forecast_stats.merge(test, how="left", on="ds")
fc_performance = None

for i in [str(m) for m in stats_models]:
    m = mape(y = fc["y"], yhat = fc[i])
    r = rmse(y = fc["y"], yhat = fc[i])
    c = coverage(y = fc["y"], lower = fc[i + "-lo-95"], upper = fc[i + "-hi-95"])

perf = {"model": i, "mape": m, "rmse": r, "coverage": c} if fc_performance is None: fc_performance = pd.DataFrame([perf]) else: fc_performance = pd.concat([fc_performance, pd.DataFrame([perf])]) fc_performance.reset_index(drop=True, inplace=True)
Üretim için Tahmin (Forecasting) Hatları Tasarlama

Model değerlendirme

print(fc_performance.sort_values("rmse"))
     model                    mape        rmse            coverage
1    SeasonalNaive            0.041340    22410.483959    1.000000
4    MSTL_Holt_trend          0.053939    30201.299395    0.513889
3    MSTL_ARIMA_trend         0.053771    30428.240235    0.666667
2    DynamicOptimizedTheta    0.090566    45189.869437    0.916667
0    AutoARIMA                0.149790    70483.617198    1.000000
Üretim için Tahmin (Forecasting) Hatları Tasarlama

Model değerlendirme

print(fc_performance.sort_values("rmse"))
     model                    mape        rmse            coverage
1    SeasonalNaive            0.041340    22410.483959    1.000000
4    MSTL_Holt_trend          0.053939    30201.299395    0.513889
3    MSTL_ARIMA_trend         0.053771    30428.240235    0.666667
2    DynamicOptimizedTheta    0.090566    45189.869437    0.916667
0    AutoARIMA                0.149790    70483.617198    1.000000

Sonuçları iyileştirebilir miyiz?

  • Daha iyi doğruluk için farklı ayarlar
  • Deneyler yardımcı olur
Üretim için Tahmin (Forecasting) Hatları Tasarlama

Vamos praticar!

Üretim için Tahmin (Forecasting) Hatları Tasarlama

Preparing Video For Download...