Zaman Serisi Veri Sızıntısı: Geçmiş Bilgisiyle Geleceği Tahmin Tuzağı

# Zaman Serisi Veri Sızıntısı: Geçmiş Bilgisiyle Geleceği Tahmin Tuzağı

Zaman serisi tahmin modellerinde en yaygın hata veri sızıntısıdır. Model, eğitim sırasında geleceğe ait bilgiyi "yanlışlıkla" görerek, gerçekçi olmayan yüksek doğruluk oranları gösterir. Gerçek dünyaya uygulandığında ise floppy.

Yanlış Veri Bölme: Veriyi rasgele bölerseniz, gelecek bilgisi geçmişe karışır.

Normalizasyon Hatası: Tüm veri üzerinde min-max normalizasyonu yaparsan, model geleceğin değer aralığını öğrenir.

Özellik Mühendisliği: Gelecek hedefini hesaplamada kullanılan bilgi eğitim setine girer.

Zaman serilerinde kronolojik sıra korunmalı. Geçmiş Eğitim, Orta Validasyon, Gelecek Test.

Her aşamada normalizasyon ayrı yapılır.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import pandas as pd
2import numpy as np
3from sklearn.preprocessing import MinMaxScaler
4from sklearn.model_selection import train_test_split
5
6# Örnek zaman serisi
7data = pd.DataFrame({
8'gun': range(100),
9'fiyat': np.random.randn(100).cumsum() + 100
10})
11
12# YANLIŞ: Rasgele bölme (veri sızıntısı!)
13X_train_yanlis, X_test_yanlis = train_test_split(
14data[['gun']], test_size=0.2, random_state=42
15)
16# Tüm veri ile normalize (geleceği görüyor!)
17scaler_yanlis = MinMaxScaler()
18data_normalized_yanlis = scaler_yanlis.fit_transform(data[['fiyat']])
19print("YANLIŞ: Scaler tüm veriyi gördü")
20
21# DOĞRU: Kronolojik bölme
22train_size = int(len(data) * 0.7)
23val_size = int(len(data) * 0.15)
24
25train_data = data.iloc[:train_size]
26val_data = data.iloc[train_size:train_size + val_size]
27test_data = data.iloc[train_size + val_size:]
28
29# Her set için ayrı scaler
30scaler_train = MinMaxScaler()
31scaler_val = MinMaxScaler()
32scaler_test = MinMaxScaler()
33
34train_norm = scaler_train.fit_transform(train_data[['fiyat']])
35val_norm = scaler_val.fit_transform(val_data[['fiyat']])
36test_norm = scaler_test.fit_transform(test_data[['fiyat']])
37
38print(f"Eğitim: {len(train_data)}, Validasyon: {len(val_data)}, Test: {len(test_data)}")
39print("DOĞRU: Her set kendi normalizer'ını kullandı")

Çıktı:

1Eğitim: 70, Validasyon: 15, Test: 15
2DOĞRU: Her set kendi normalizer'ını kullandı

Veriyi zaman sırasına göre böldün mü?

Eğitim setinde sadece geçmiş var mı?

Normalizasyon, özellik mühendisliği eğitim setinde mi başladı?

Test seti hiçbir eğitim işlemine katılmadı mı?

Bu adımları takip etmezsen modelinin gerçek performansı %40 daha düşük çıkabilir.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • kahvemolasi

    veri sızıntısı gerçekten çok tuzak, ben de yaşadım bunu. modeli test ederken %95 doğruluk görünce çok sevinmiştim, ama gerçek veriye koyunca hiç işe yaramadı.

  • birazsessiz

    normalizasyon kısmı çok kritik, bunu kaç kez yanlış yapıyordum. tüm veri üzerinde min-max yapıp sonra bölüyordum, tabii ki model iyi çıkıyordu.

  • dusukpil

    özellik mühendisliği kısmı da aynı şekilde, gelecek değerini hesaplarken geçmiş verilerden türettiğin şey eğitim setine giriyor fark etmeden. sonra modeli test ediyorsun, harika görünüyor ama canlıya çıktığında patlıyor.