Pratik Tahminleme Rehberi
ARIMA mı, Prophet mı, LightGBM mı, derin öğrenme mi? Tahminleme problemini çözmek için doğru yaklaşımı seçmenin pratik kılavuzu.
Önce baseline kur
Bir tahminleme projesine "doğrudan LSTM" diye başlamak en sık görülen hatadır. Önce basit bir baseline kur:
- Naive forecast: "yarın bugünle aynı olacak."
- Mevsimsel naive: "gelecek pazartesi geçen pazartesiye benzer olacak."
- Hareketli ortalama: "son 7 günün ortalaması."
Bu baseline'lar utanç verecek kadar iyi olur. ARIMA / LightGBM / LSTM ile aldığın iyileşme bu baseline'a göre ölçülür. "%5 MAPE" demek yetmiyor — "naive baseline %12, modelim %5, %58 iyileşme" demek anlamlı.
import pandas as pd
from sklearn.metrics import mean_absolute_percentage_error
df = pd.read_csv("orders.csv", parse_dates=["date"]).sort_values("date")
# Naive: yarın = bugün
naive = df["orders"].shift(1).dropna()
actual = df["orders"][1:]
print(f"Naive baseline MAPE: {mean_absolute_percentage_error(actual, naive):.3f}")
# Mevsimsel naive: bu pazartesi = geçen pazartesi
seasonal_naive = df["orders"].shift(7).dropna()
actual = df["orders"][7:]
print(f"Seasonal naive MAPE: {mean_absolute_percentage_error(actual, seasonal_naive):.3f}")
# Bu sayıları yenmek hedefin.Hangi model ne zaman?
ARIMA / SARIMA
İstatistiksel modellerin en köklüsü. Trend ve mevsimselliği ayrıştırır, otoregresyon ile tahmin yapar.
Ne zaman: tek seri, küçük-orta veri (1000-10.000 nokta), açıklanabilirlik kritik, dış değişken yok ya da az. Ne zaman değil: çok serili (1000 SKU her birine ARIMA = 1000 model bakım kabusu), yüksek frekanslı veri, dış değişken çok ve karmaşık.
Prophet
Facebook'un açık kaynak kütüphanesi. Trend + mevsimsellik + tatil etkisi otomatik. Az eğitimle iyi sonuç.
from prophet import Prophet
import pandas as pd
df = pd.DataFrame({"ds": dates, "y": orders})
m = Prophet(
yearly_seasonality=True,
weekly_seasonality=True,
seasonality_mode="multiplicative", # büyüme oranıyla mevsimsellik
)
m.add_country_holidays(country_name="TR")
m.fit(df)
future = m.make_future_dataframe(periods=30)
forecast = m.predict(future)
# yhat: tahmin, yhat_lower / yhat_upper: %80 güven aralığı
print(forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail(10))Ne zaman: belirgin yıllık + haftalık mevsimsellik, tatil etkisi var, hızlı sonuç istiyorsun. Ne zaman değil: dış değişken çok ve etkileri karmaşıksa (hava durumu, pazarlama bütçesi, fiyat gibi), Prophet'in
add_regressorözelliği yeter ama LightGBM zaten daha güçlü.
LightGBM + lag özellikleri (modern gözde)
Tabular ML'in zaman serisine uyarlanmış hâli. Lag'leri özellik olarak ver, tarih özelliklerini ekle, dış değişkenleri ekle. Çoğu üretim senaryosunda en iyi cost/quality.
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_absolute_percentage_error
df = pd.read_csv("orders.csv", parse_dates=["date"]).sort_values("date")
# Lag özellikleri
for lag in [1, 7, 14, 30, 365]:
df[f"lag_{lag}"] = df["orders"].shift(lag)
# Hareketli ortalamalar
df["ma_7"] = df["orders"].rolling(7).mean()
df["ma_30"] = df["orders"].rolling(30).mean()
# Takvim özellikleri
df["dow"] = df["date"].dt.dayofweek
df["month"] = df["date"].dt.month
df["is_weekend"] = df["dow"].isin([5, 6]).astype(int)
# Dış değişkenler (varsa)
df["weather_temp"] = ...
df["campaign_active"] = ...
df = df.dropna()
# Zaman tabanlı bölme
cutoff = "2025-09-01"
train = df[df["date"] < cutoff]
test = df[df["date"] >= cutoff]
features = [c for c in df.columns if c not in ["date", "orders"]]
model = lgb.LGBMRegressor(
n_estimators=1000,
learning_rate=0.05,
num_leaves=63,
min_child_samples=20,
)
model.fit(
train[features], train["orders"],
eval_set=[(test[features], test["orders"])],
callbacks=[lgb.early_stopping(50)],
)
preds = model.predict(test[features])
mape = mean_absolute_percentage_error(test["orders"], preds)
print(f"Test MAPE: {mape:.3f}")
# Özellik önemleri — ne neyi etkiliyor?
import pandas as pd
imp = pd.Series(model.feature_importances_, index=features).sort_values(ascending=False)
print(imp.head(10))Ne zaman: dış değişken bol, çok sayıda seri (binlerce SKU), karmaşık etkileşimler, doğruluk öncelikli. Ne zaman değil: çok kısa seri (<100 nokta) — overfit riski yüksek; yorumlanabilirlik mutlaksa.
Derin öğrenme (LSTM, TFT, N-BEATS)
Uzun bağımlılıklar, çok sayıda seri ortak modellenecekse, multivariate ile karmaşık etkileşimler varsa.
Ne zaman: binlerce seri, uzun zaman bağımlılıkları (örn. saatlik enerji tüketimi), çok değişkenli serilerde ortak öğrenme. Ne zaman değil: küçük veri, açıklanabilirlik şart, ekipte derin öğrenme deneyimi yok. Çoğu zaman LightGBM aynı kaliteyi 10x daha hızlı verir.
Doğru cross-validation
Zaman serisinde sıradan k-fold geleceği eğitime sokar → şişmiş skorlar. TimeSeriesSplit veya rolling forecasting origin kullan:
from sklearn.model_selection import TimeSeriesSplit
tss = TimeSeriesSplit(n_splits=5, test_size=30)
for fold, (train_idx, test_idx) in enumerate(tss.split(df)):
train_data = df.iloc[train_idx]
test_data = df.iloc[test_idx]
print(f"Fold {fold}: train {train_data['date'].min()}–{train_data['date'].max()}, "
f"test {test_data['date'].min()}–{test_data['date'].max()}")Her fold geçmişi eğitir, geleceği test eder. Hata oranı tipik olarak gerçek senaryoyu yansıtır.
Tahmin aralığı (uncertainty)
İş kararı kesin sayıyla değil, aralıkla alınır. "Yarın tam 1250 satarız" yerine "%80 olasılıkla 1100-1400 arası" ifadesi ürün ekibine çok daha değerli.
Quantile regression ile
LightGBM birden fazla quantile için ayrı modeller eğitebilir:
import lightgbm as lgb
# Üç ayrı model: %10, %50, %90 quantile'ları
quantiles = {0.1: None, 0.5: None, 0.9: None}
for q in quantiles:
quantiles[q] = lgb.LGBMRegressor(
objective="quantile",
alpha=q,
n_estimators=500,
learning_rate=0.05,
)
quantiles[q].fit(train[features], train["orders"])
preds_low = quantiles[0.1].predict(test[features]) # %10 quantile
preds_med = quantiles[0.5].predict(test[features]) # medyan
preds_high = quantiles[0.9].predict(test[features]) # %90 quantile
# %80 olasılıkla gerçek değer [low, high] aralığındaConformal prediction ile
Daha matematiksel garanti veren modern yöntem; herhangi bir tahminci için %95 güvenle "gerçek değer şu aralıkta" diyebilirsin.
Yaygın hatalardan kaçınma
Veri sızıntısı
Lag özellikleri en sık sızıntı kaynağıdır. "Yarınki sipariş için bugünkü siparişi özellik olarak" vermeden önce, gerçek üretim koşulunda tahmin yapmak istediğin anda bu özelliğin elimde olacak mı? sorusunu sor.
Klasik tuzak: "geçen haftanın toplam siparişini" özellik olarak ver — geleceği tahmin ederken bu zaten geçmiş, sorun yok. Ama "bu haftanın ortalaması" eğer hâlâ devam ediyorsa, sızıntı.
Mevsimselliğin yıllık değişimi
E-ticarette Black Friday'in tarihi her yıl değişir; "geçen yıl bu tarihte" özelliği yanıltıcıdır. Tatil bayraklarını mutlak tarihe değil, mantıksal olaya bağla (örn. "Black Friday gününden N gün önce/sonra").
Yapısal kırılmalar
Pandemi başlangıcı, ürün lansmanı, fiyat değişikliği — bunlar geçmişin geleceğe benzemediği anlardır. Modeli kırılma sonrası yeniden eğit; öncesini eğitime almaktan kaçın.
Outlier kontrolü
Bir günlük 10x sıçrama (sistem hatası, veri yükleme bozukluğu) modeli berbat eder. Açıkça etkinlik bağlı değilse temizle ya da winsorize et.
Production'a alma
Backtest sonrası deployment
Modeli son 12 ayın her ayında test et — performans tutarlı mı, son 2-3 ayda kötüleşiyor mu? Konsept kayması varsa retrain frekansını arttır.
Retrain stratejisi
- Tam yeniden eğitim: her hafta/ay tüm veriyle baştan
- Online güncelleme: modeli son k haftayla güncelle
- Trigger'lı retrain: son tahmin hatası eşik üstüne çıkarsa retrain başlat
Çoğu üretim sistemi haftalık + trigger karması kullanır.
İzleme
Tahmin kalitesi tek skor değil, dağılımdır. İzlenecekler:
- MAPE (genel)
- Hata dağılımı (residual histogramı)
- Sezon başına performans (Black Friday, Ramazan ayrı incele)
- En kötü hata yapılan günler
Pratik karar tablosu
| Durum | İlk seçenek |
|---|---|
| Tek seri, küçük, mevsimsellik var | Prophet |
| Tek seri, küçük, dış değişken yok | ARIMA / SARIMA |
| Çok seri, dış değişken bol | LightGBM + lag |
| Çok seri, uzun bağımlılık | TFT veya LightGBM |
| Saatlik / dakikalık yüksek frekans | LightGBM (basit) ya da DeepAR |
| Tek seferlik analiz | Prophet (hızlı sonuç) |
| Üretim, çok sayıda seri | LightGBM + reranker |
Devamı için
- Tahminleme — kavramın özeti ve hangi sorunlara uygulanır.
- Zaman Serisi — sıralı verinin yapısal özellikleri ve ön işleme yolları.
- Çapraz Doğrulama — zaman serisinde doğru CV nasıl yapılır.
- Gradient Boosting — pratik tahminlemenin baş işçisi.
- Anomali Tespiti — beklenen ile gerçek arasındaki sapmayı yakalama.