import warnings
"ignore")
warnings.filterwarnings(
# gerekli çerçevelerlin içeri alınması
import pandas as pd
import numpy as np
import hts
import matplotlib.pyplot as plt
import seaborn as sns
Zaman Serileri Analizi 9: Güncel Öngörü Yaklaşımları
1. Giriş
Zaman serileri yazı dizimizde, tanımından başlayıp doğrusal ve varsayımlara dayalı öngörü modellerine ve çok değişkenli öngörü modellerine kadar farklı konuları ele aldık. Bu son yazıda ise bazı güncel öngörü yaklaşımlarına göz atacağız. Bu yaklaşımlar, genel olarak doğrusal modellerin varsayımlarını içermez. Fakat model karmaşıklığı da bir o kadar fazladır.
2. Hiyerarşik Zaman Serisi Öngörü Modelleri
Zaman serileri öngörüsü ile ilgili çalışmaların çoğu, belirli bir toplulaştırma düzeyine odaklanmaktadır. Ancak, aynı serileri daha ayrıntılı bir düzeyde gözlemlemek için toplulaştırılmış verileri detaylandırabildiğimiz zaman zorluklar ortaya çıkar. Böyle bir durumda, genellikle daha düşük düzeyler için öngörülerin toplulaştırılmış öngörülerine dahil lmadığını görebiliriz - bunlar tutarlı değildir. Durumun böyle olmadığından emin olmak için hiyerarşik zaman serileri (hierarchical time series-HTS) öngörüleri adı verilen bir yaklaşım kullanabiliriz.
Hiyerarşik zaman serileri genellikle coğrafi bölünmeler nedeniyle ortaya çıkar. Örneğin, toplam alkol satışları ülkeye göre, ardından her ülke içinde bölgeye göre, bölge içinde illere ve bu şekilde başlangıç seviyesine kadar ayrıştırılabilir. Aşağıdaki hiyerarşik yapıyı ele alalım:
Herhangi bir \(t\) zamanı için, hiyerarşinin en alt seviyesindeki gözlemler, yukarıdaki serinin gözlemlerini toplulaştıracaktır. Örneğin,
\[ y_{t}=y_{\mathrm{AA}, t}+y_{\mathrm{AB}, t}+y_{\mathrm{AC}, t}+y_{\mathrm{BA}, t}+y_{\mathrm{BB}, t} \] \[ y_{\mathrm{A}, t}=y_{\mathrm{AA}, t}+y_{\mathrm{AB}, t}+y_{\mathrm{AC}, t} \quad \text { ve } \quad y_{\mathrm{B}, t}=y_{\mathrm{BA}, t}+y_{\mathrm{BB}, t} \]
ikinci denklemi, birincide yerine koyarsak: \(y_{t}=y_{\mathrm{A}, t}+y_{\mathrm{B}, t}\)
Burada önemli bir husus, hiyerarşik zaman serisi öngörülerinin kendi başına bir zaman serisi öngörü (ARIMA, ETS veya Prophet gibi) yöntemi olmadığıdır. Bunun yerine, verilen bir tekil zaman serileri hiyerarşisinde öngörüleri tutarlı kılan farklı tekniklerin bir birleşimidir. Bu noktada, dört yaklaşımdan bahsetmek uygun olur:
- Aşağıdan yukarıya yaklaşımda, hiyerarşinin en altındaki seviyesi öngörülür ve daha sonra daha yüksek seviyeler için öngörüler oluşturmak için öngörüler birleştirilir.
- Yukarıdan aşağıya yaklaşım, hiyerarşinin en üst seviyesini öngörmeyi ve ardından da öngörüyü daha lat düzeydeki serilere bölmeyi içerir.
- Ortadan dışa yaklaşımı, yukarıda açıklanan iki yöntemin bir kombinasyonudur ve yalnızca katı hiyerarşik zaman serileri için kullanılabilir. Bu yaklaşımda orta seviyeyi seçip doğrudan öngörü yapılır. Sonra da, yukarıdaki iki yaklaşımla öngörüler gerçekleştirilir.
- Yukarıda açıklanan üç yaklaşım, zaman serilerini tek bir düzeyde öngörmeye ve ardından bunları geri kalan düzeyleri çıkarmak için kullanmaya odaklanır. Bunların aksine, optimal uzlaşma (optimal reconciliation) yönteminde, verilen hiyerarşinin sunabileceği tüm bilgileri ve ilişkileri kullanarak seviyelerin her birini tahmin ederiz.
Örnek: Avustralya Çeyreklik Turizm Hacmi
Örnek olarak 1998 ve 2016 dönemi için, Avustralya’ya ait bölge, eyalet ve amaç düzeyinde gözlemlenmiş turizm hacmi verileri ile hiyerarşik zaman serileri öngörü modelini oluşturacağız. Model için scikit-hts
çerçevesini kullanacağız.
Veriyi içeri alıp düzenleyelim:
# load the data
= pd.read_csv("tourism.csv").drop(columns=["Unnamed: 0"])
turizm_verisi # değişken isimlerini küçük harfe dönüştürme
= [col_name.lower() for col_name in turizm_verisi.columns]
turizm_verisi.columns # turizm amacı bazında gezintilerin toplanması
= turizm_verisi.groupby(["quarter", "region", "state"])["trips"] \
turizm_verisi sum() \
.=False)
.reset_index(drop# bölge isimlerinin temizlenmesi
"region"] = turizm_verisi["region"].apply(lambda x: x.replace(" ", "_").replace("'", ""))
turizm_verisi[# eyalet isimlerinin kısaltmaya dönüştürülmesi
= {
kısaltma_haritası "New South Wales": "NSW",
"Northern Territory": "NT",
"Queensland": "QLD",
"South Australia": "SA",
"Victoria": "VIC",
"Western Australia": "WA",
"ACT": "ACT",
}"state"] = turizm_verisi["state"].map(kısaltma_haritası)
turizm_verisi[# alt seviye için id oluşturulması
"state_region"] = turizm_verisi.apply(lambda x: f"{x['state']}_{x['region']}", axis=1) turizm_verisi[
Düzenlemelerden sonra verinin görünüşü:
print(turizm_verisi.head())
quarter region state trips \
0 1998-01-01 Adelaide SA 658.553895
1 1998-01-01 Adelaide_Hills SA 9.798630
2 1998-01-01 Alice_Springs NT 20.207638
3 1998-01-01 Australias_Coral_Coast WA 132.516409
4 1998-01-01 Australias_Golden_Outback WA 161.726948
state_region
0 SA_Adelaide
1 SA_Adelaide_Hills
2 NT_Alice_Springs
3 WA_Australias_Coral_Coast
4 WA_Australias_Golden_Outback
Bir sonraki adım için scikit-hts
çerçevesi için veriyi hazırlayalım:
# alt seviye verisi
= turizm_verisi.pivot(index="quarter", columns="state_region", values="trips")
alt_seviye # orta seviye verisi
= turizm_verisi.groupby(["quarter", "state"]) \
orta_seviye sum() \
.=False) \
.reset_index(drop="quarter", columns="state", values="trips")
.pivot(index# üst seviye verisi
= turizm_verisi.groupby("quarter")["trips"] \
üst_seviye sum() \
.\
.to_frame() ={"trips": "total"})
.rename(columns
# veri çerçevelerinin birleştirilmesi
= alt_seviye.join(orta_seviye).join(üst_seviye)
hiyerarşik_veri = pd.to_datetime(hiyerarşik_veri.index)
hiyerarşik_veri.index = hiyerarşik_veri.resample("QS").sum() hiyerarşik_veri
Hiyerarşi nesnesini oluşturalım:
= turizm_verisi["state"].unique()
eyaletler = turizm_verisi["state_region"].unique()
bölgeler = {'total': list(eyaletler)}
toplam = {k: [v for v in bölgeler if v.startswith(k)] for k in eyaletler}
eyalet = {**toplam, **eyalet} hiyerarşi
Hiyerarşik yapıyı görmek için ağaç yapısını çizelim:
= hts.hierarchy.HierarchyTree.from_nodes(hiyerarşi, hiyerarşik_veri, root='total')
ağaç print(ağaç)
- total
|- SA
| |- SA_Adelaide
| |- SA_Adelaide_Hills
| |- SA_Barossa
| |- SA_Clare_Valley
| |- SA_Eyre_Peninsula
| |- SA_Fleurieu_Peninsula
| |- SA_Flinders_Ranges_and_Outback
| |- SA_Kangaroo_Island
| |- SA_Limestone_Coast
| |- SA_Murraylands
| |- SA_Riverland
| - SA_Yorke_Peninsula
|- NT
| |- NT_Alice_Springs
| |- NT_Barkly
| |- NT_Darwin
| |- NT_East_Coast
| |- NT_Hobart_and_the_South
| |- NT_Kakadu_Arnhem
| |- NT_Katherine_Daly
| |- NT_Lasseter
| |- NT_Launceston,_Tamar_and_the_North
| |- NT_MacDonnell
| |- NT_North_West
| |- NT_Tasmania
| - NT_Wilderness_West
|- WA
| |- WA_Australias_Coral_Coast
| |- WA_Australias_Golden_Outback
| |- WA_Australias_North_West
| |- WA_Australias_South_West
| - WA_Experience_Perth
|- VIC
| |- VIC_Ballarat
| |- VIC_Bendigo_Loddon
| |- VIC_Central_Highlands
| |- VIC_Central_Murray
| |- VIC_Geelong
| |- VIC_Gippsland
| |- VIC_Goulburn
| |- VIC_High_Country
| |- VIC_Lakes
| |- VIC_Macedon
| |- VIC_Mallee
| |- VIC_Melbourne
| |- VIC_Melbourne_East
| |- VIC_Murray_East
| |- VIC_Peninsula
| |- VIC_Phillip_Island
| |- VIC_Spa_Country
| |- VIC_Upper_Yarra
| |- VIC_Western
| |- VIC_Western_Grampians
| - VIC_Wimmera
|- NSW
| |- NSW_Blue_Mountains
| |- NSW_Capital_Country
| |- NSW_Central_Coast
| |- NSW_Central_NSW
| |- NSW_Hunter
| |- NSW_New_England_North_West
| |- NSW_North_Coast_NSW
| |- NSW_Outback_NSW
| |- NSW_Riverina
| |- NSW_Snowy_Mountains
| |- NSW_South_Coast
| |- NSW_Sydney
| - NSW_The_Murray
|- QLD
| |- QLD_Brisbane
| |- QLD_Bundaberg
| |- QLD_Central_Queensland
| |- QLD_Darling_Downs
| |- QLD_Fraser_Coast
| |- QLD_Gold_Coast
| |- QLD_Mackay
| |- QLD_Northern
| |- QLD_Outback
| |- QLD_Sunshine_Coast
| |- QLD_Tropical_North_Queensland
| - QLD_Whitsundays
- ACT
- ACT_Canberra
Yukarıdan aşağıya yaklaşımla, auto_arima
yöntemiyle 4 dönemlik öngörüleri gerçekleştirelim:
= hts.HTSRegressor(model="auto_arima", revision_method='AHP', n_jobs=0)
model_arima = model_arima.fit(hiyerarşik_veri, hiyerarşi)
model_arima = model_arima.predict(steps_ahead=4) arima_öngörüleri
Fitting models: 100%|██████████████████████████████████████████████████████████████████| 85/85 [03:06<00:00, 2.20s/it]
Fitting models: 100%|█████████████████████████████████████████████████████████████████| 85/85 [00:00<00:00, 303.80it/s]
Öngörüleri çizelim:
#arima_öngörüleri
3. Bayesyen Yaklaşıma Dayanan Öngörü Modelleri
Bayesyen yaklaşım, belirsizliği azaltmak ve önsel (prior) bilgiyi biraraya getirmek için zaman serilerine olasılıksal bir yaklaşım sunar. Bu modeller Dinamik Doğrusal Modeller veya Yapısal Zaman Serileri (durum uzay modelleri) olarak da adlandırılır. Bir zaman serisindeki yapısal değişiklikleri dinamik olarak uydurarak (fit) çalışırlar - başka bir deyişle, yeni bilgilerin eklenmesiyle model parametrelerini zaman içinde geliştirip güncellerler. Buna karşılık, ARIMA, sabit kalan seriler için parametreleri tahmin eder ve daha sonra zaman serisi öngörülerini belirlemek için Maksimum Olabilirlik tahminini kullanır. Bayes yöntemleri, dağılımlardan tahminler oluşturmak için MCMC’yi (Monte Carlo Markov Zincirleri-Monte Carlo Markov Chains) kullanır.
Aşağıdaki özbağlanımlı süreci düşünelim:
\[ Y_{t}=a+\beta_{1} Y_{t-1}+\beta_{2} Y_{t-2}+\ldots+\beta_{p} Y_{t-p}+\varepsilon_{t} \]
Seriyi trendden arındırdığımızda:
\[ Y_{t}=a+\Phi_{1} \varepsilon_{t-1}+\Phi_{2} \varepsilon_{t-2}+\ldots+\Phi_{q} \varepsilon_{t-q} \]
ARIMA ile bu süreci modellemiş olsaydık, a parametresine bağlı olduğumuzu görebiliriz.
Spesifik olarak, bayesyen model, zaman serimizi oluşturan gerçek dünyaya ilişkin gözlemlerimizin (\(y_{t}\)), bir Markov sürecine göre (her bir durumun bağımlı olduğu bir süreç) zaman içinde gelişen gizli bir durumun (\(\alpha_{t}\)) bir fonksiyonu olarak belirlendiğini belirtir. Bayesyen yapısal zaman serimizi bir dizi denklem ile ifade edebiliriz:
\[y_{t}=Z_{t}^{\top} \alpha_{t}+\epsilon_{t}, \epsilon_{t} \sim N\left(0, H_{t}\right)\] \[\alpha_{t+1}=T_{t} \alpha_{t}+R_{t} \eta_{t}, \eta t \sim N\left(0, Q_{t}\right)\]
Gizli durumumuzu (hidden state) gözlemlenen durumumuza (observed state) bağladığı için ilk gözlem denklemini ve her bir iç durumu bir önceki iç duruma bağladığı için geçiş (transition) denklemini etiketliyoruz. Yukarıda açıklanan ARIMA modeli de dahil olmak üzere birçok farklı model bu formda ifade edilebilir.
Python ile bayesyen zaman serileri öngörü modelleri oluşturmak için birçok çerçeve mevcuttur: tensorflow-probability
, pyro
, PyBATS
, GluonTS
, DeepAR
, prophet
, darts
ve orbit-ml
bu çerçevelerden bazılarıdır. Burada bir örnek vermek amacıyla orbit-ml
çerçevesini kullanacağız. İlgilenenler için, sayılan çerçevelerin kullanıcı rehberleri daha detaylı fikir sağlayacaktır.
Örnek: iclaims verisi
iclaims verileri, Ocak 2010 - Haziran 2018 arasında birkaç ilgili google trend sorgusuna (işsizlik, doldurma ve iş) karşı ABD işsizlik yardımları için haftalık ilk talepleri içerir. St. Louis Federal Rezerv Bankası’ndan talep sayısı alınırken, google sorguları gibi açıklayıcı değişkenler de Google Trends API üzerinden elde edilmiştir. Hem açıklanan hem de açıklayıcı değişkenler, çarpımsal bir modeli göstermek için logaritmik dönüşüm yapılmıştır. İlgili çerçeveleri içeri alalım:
import orbit
from orbit.utils.dataset import load_iclaims
from orbit.models import ETS
from orbit.diagnostics.plot import plot_predicted_data
Şimdi, veriyi çalışma ortamına alalım:
# verinin alınması
= load_iclaims()
veri = 'week'
tarih_değişkeni = 'claims'
hedef_değişken
# veri hakkında bilgi
veri.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 443 entries, 0 to 442
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 week 443 non-null datetime64[ns]
1 claims 443 non-null float64
2 trend.unemploy 443 non-null float64
3 trend.filling 443 non-null float64
4 trend.job 443 non-null float64
5 sp500 443 non-null float64
6 vix 443 non-null float64
dtypes: datetime64[ns](1), float64(6)
memory usage: 27.7 KB
Verinin görünümü:
print(veri.head())
week claims trend.unemploy trend.filling trend.job sp500 \
0 2010-01-03 13.386595 0.219882 -0.318452 0.117500 -0.417633
1 2010-01-10 13.624218 0.219882 -0.194838 0.168794 -0.425480
2 2010-01-17 13.398741 0.236143 -0.292477 0.117500 -0.465229
3 2010-01-24 13.137549 0.203353 -0.194838 0.106918 -0.481751
4 2010-01-31 13.196760 0.134360 -0.242466 0.074483 -0.488929
vix
0 0.122654
1 0.110445
2 0.532339
3 0.428645
4 0.487404
Veriyi bölüp, modeli oluşturalım:
# verinin bölünmesi
= 52
test_hacmi = veri[:-test_hacmi]
eğitim_verisi = veri[-test_hacmi:]
test_verisi
# modelin oluşturulması
= ETS(
ets =hedef_değişken,
response_col=tarih_değişkeni,
date_col=52,
seasonality=8888,
seed
)
# modelin çalışması
=eğitim_verisi) ets.fit(df
WARNING:pystan:Maximum (flat) parameter count (1000) exceeded: skipping diagnostic tests for n_eff and Rhat.
To run all diagnostics call pystan.check_hmc_diagnostics(fit)
<orbit.forecaster.full_bayes.FullBayesianForecaster at 0x23af9b52400>
Test verisi için öngörüleri yapalım:
= ets.predict(df=test_verisi) öngörü_verisi
Öngörülerin grafiğini çizelim:
= plot_predicted_data(eğitim_verisi, öngörü_verisi, tarih_değişkeni, hedef_değişken, title='ETS ile Öngörü', use_orbit_style=False) _
Sonsal (posterior) örneklemleri çıkaralım:
= ets.get_posterior_samples()
sonsal_örneklemler sonsal_örneklemler.keys()
odict_keys(['l', 'lev_sm', 'obs_sigma', 's', 'sea_sm'])
Sonsal örneklem parametrelerini çizelim:
import arviz as az
= ets.get_posterior_samples(permute=False)
sonsal_örneklemler
# example from https://arviz-devs.github.io/arviz/index.html
"arviz-darkgrid")
az.style.use(
az.plot_pair(
sonsal_örneklemler,=["sea_sm", "lev_sm", "obs_sigma"],
var_names="kde",
kind=True,
marginals=15,
textsize
) plt.show()
4. Yapay Öğrenme Algoritmaları ile Öngörü
Yakın zamanlarda, yapay öğrenme modelleri, zaman serisi öngörülerinde dikkat çekti ve öngörü alanında klasik istatistiksel modellere ciddi rakip olarak yerleşti. Özbağlanımlı bir zaman serisi modeli aşağıdaki gibi yazılabilir:
\[ y_{t}=f\left(y_{t-d}, y_{t-d-1}, \ldots, y_{t-d-n+1}\right)+w(t) \]
Böyle bir zaman serisi modelini yapay öğrenme algoritmaları ile modelleyebilmek için birkaç farklı yaklaşım mevcuttur (Bontempi vd., 2013):
- Tek dönemlik öngörü: Gözetimli öğrenme, Yerel öğrenme ile örnekleme
- Çok dönmelik öngörü: Özyinelemeli strateji, doğrudan strateji, özyinelemeli ve doğrudan hibrit strateji
- Çok çıktılı öngörü
Örnek: Havayolu Yolcu Sayısı Öngörü Modeli
Daha önceki yazılarda örnek olarak çalıştığımız AirPassengers verileri için LightGBM algoritması ile öngörüler oluşturalım. Bunun için darts
çerçevesi bize kolaylık sağlar:
from darts import TimeSeries
# verinin içeri alınması
= pd.read_csv('AirPassengers.csv', delimiter=",")
veri
# TimeSeries nesnesi oluşturulması
= TimeSeries.from_dataframe(veri, 'Month', '#Passengers')
zaman_serisi
# son 36 ayı test verisi olarak ayıralım
= zaman_serisi[:-36], zaman_serisi[-36:] eğitim_verisi, test_verisi
Modeli oluşturalım:
from darts.models import LightGBMModel
# modelin oluşturulması
= LightGBMModel(lags=12)
model
# modelin uydurulması
model.fit(eğitim_verisi)
# öngörülerin alınması
= model.predict(len(test_verisi)) öngörüler
%5 ve %95 yüzdelikler içinde öngörülerin ve gerçek verinin çizilmesi:
zaman_serisi.plot()='öngörü', low_quantile=0.05, high_quantile=0.95)
öngörüler.plot(label; plt.legend()
Öngörüler, varsayılan model parametreleri ile çok tutarlı görünmese de, çalışmayı görmek adına yeterlidir. Farklı model parametreleri ile daha tutarlı öngörüler türetilebilir.
Yapay öğrenme yaklaşımlarıyla öngörülerden bahsetmişken, özel olarak N-BEATS ve Transformers yaklaşımlarından da bahsetmek yerinde olacaktır. İzleyen altbölümlerde bu yaklaşımları ele alacağız.
4.1. N-BEATS Modeli
Oreshkin vd.(2019) çalışmasına dayanan model, M4 veri kümesi tarafından temsil edilen tek değişkenli zaman serisi öngörü görevleri kümesinde istatistiksel modellerden ve bunların yapay öğrenme ile kombinasyonlarından daha iyi performans göstermek için saf bir derin öğrenme modeli olarak ortaya atılmıştır. Modelin genel yapısı aşağıdaki gibidir:
Örnek: Havayolu Yolcu Sayıları için NBEATS Öngörü Modeli
Önceki örnekte ele aldığımız veri için, yine darts
çerçevesi ile NBEATS öngörü modelinin hızlı bir uygulamasını gerçekleştirelim:
from darts.models import NBEATSModel
from darts.metrics import mape, smape
# modelin oluşturulması
= NBEATSModel(
model =24,
input_chunk_length=12,
output_chunk_length=200,
n_epochs=0
random_state
)
# modelin uydurulması
=True) model.fit(eğitim_verisi, verbose
[2022-02-05 16:57:53,207] INFO | darts.models.forecasting.torch_forecasting_model | Train dataset contains 73 samples.
[2022-02-05 16:57:53,207] INFO | darts.models.forecasting.torch_forecasting_model | Train dataset contains 73 samples.
INFO:darts.models.forecasting.torch_forecasting_model:Train dataset contains 73 samples.
[2022-02-05 16:57:53,277] INFO | darts.models.forecasting.torch_forecasting_model | Time series values are 64-bits; casting model to float64.
[2022-02-05 16:57:53,277] INFO | darts.models.forecasting.torch_forecasting_model | Time series values are 64-bits; casting model to float64.
INFO:darts.models.forecasting.torch_forecasting_model:Time series values are 64-bits; casting model to float64.
Training loss: 72.1767534
Öngörüleri ve gerçek değerleri çizelim:
= model.predict(n=36, series=eğitim_verisi)
öngörüler
="eğitim")
eğitim_verisi.plot(label="test")
test_verisi.plot(label="öngörü")
öngörüler.plot(label
plt.legend()print("MAPE = {:.2f}%".format(mape(test_verisi, öngörüler)))
MAPE = 13.03%
4.2. Dönüştürücü (Transformers) Modeller
Bu yaklaşım, zaman serisi verilerinden karmaşık kalıpları ve dinamikleri öğrenmek için öz-dikkat (self-attention) mekanizmalarından yararlanarak çalışır. Ayrıca, genel bir çerçevedir ve tek değişkenli ve çok değişkenli zaman serisi verilerine ve ayrıca zaman serisi yerleştirmelerine (embedding) uygulanabilir (Wu vd, 2020). Aşağıda, model mimarisi gösterilmiştir:
from darts.models import TransformerModel
from darts.dataprocessing.transformers import Scaler
# verinin ölçeklenmesi
= Scaler()
ölçekleyici = ölçekleyici.fit_transform(eğitim_verisi)
ölçeklenmiş_eğitim_verisi = ölçekleyici.transform(test_verisi)
ölçeklenmiş_test_verisi = ölçekleyici.transform(zaman_serisi)
ölçeklenmiş_veri
# modelin oluşturulması
= TransformerModel(
model =24,
input_chunk_length=12,
output_chunk_length=32,
batch_size=200,
n_epochs="transformer_model",
model_name=10,
nr_epochs_val_period=64,
d_model=32,
nhead=2,
num_encoder_layers=2,
num_decoder_layers=128,
dim_feedforward=0.1,
dropout="relu",
activation=42,
random_state=True,
save_checkpoints=True,
force_reset
)
# modelin uydurulması
=ölçeklenmiş_eğitim_verisi, val_series=ölçeklenmiş_test_verisi, verbose=True) model.fit(series
[2022-02-05 17:53:31,707] INFO | darts.models.forecasting.torch_forecasting_model | Train dataset contains 73 samples.
[2022-02-05 17:53:31,707] INFO | darts.models.forecasting.torch_forecasting_model | Train dataset contains 73 samples.
INFO:darts.models.forecasting.torch_forecasting_model:Train dataset contains 73 samples.
[2022-02-05 17:53:31,719] INFO | darts.models.forecasting.torch_forecasting_model | Time series values are 64-bits; casting model to float64.
[2022-02-05 17:53:31,719] INFO | darts.models.forecasting.torch_forecasting_model | Time series values are 64-bits; casting model to float64.
INFO:darts.models.forecasting.torch_forecasting_model:Time series values are 64-bits; casting model to float64.
Training loss: 0.0074, validation loss: 0.0798, best val loss: 0.0626
Modeli geliştirelim:
def model_geliştirme(model, n, veri, test_verisi):
= model.predict(n=n)
öngörü =(12, 8))
plt.figure(figsize="gerçek")
veri.plot(label="öngörü")
öngörü.plot(label"MAPE: {:.2f}%".format(mape(öngörü, test_verisi)))
plt.title(
plt.legend()
36, ölçeklenmiş_veri, ölçeklenmiş_test_verisi) model_geliştirme(model,