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.
1import pandas as pd2import numpy as np3from sklearn.preprocessing import MinMaxScaler4from sklearn.model_selection import train_test_split56# Örnek zaman serisi7data = pd.DataFrame({8'gun': range(100),9'fiyat': np.random.randn(100).cumsum() + 10010})1112# 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=4215)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ü")2021# DOĞRU: Kronolojik bölme22train_size = int(len(data) * 0.7)23val_size = int(len(data) * 0.15)2425train_data = data.iloc[:train_size]26val_data = data.iloc[train_size:train_size + val_size]27test_data = data.iloc[train_size + val_size:]2829# Her set için ayrı scaler30scaler_train = MinMaxScaler()31scaler_val = MinMaxScaler()32scaler_test = MinMaxScaler()3334train_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']])3738print(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: 152DOĞ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.
3 yorum
ö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.
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.
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ı.