Notebook Bab 10 ini punya dua bagian. Bagian Demo tinggal Anda jalankan lalu amati keluarannya; bagian Mini Project berisi soal dan data yang Anda kerjakan sendiri.
Pada deret waktu, fitur hanya boleh memakai informasi masa lalu dan validasinya harus kronologis. Melanggar keduanya menimbulkan look-ahead leakage dan skor palsu.
Persiapan
import warningswarnings.filterwarnings('ignore')import numpy as npimport pandas as pdfrom sklearn.linear_model import Ridgefrom sklearn.model_selection import cross_val_score, TimeSeriesSplit, KFoldRANDOM_STATE =42rng = np.random.default_rng(RANDOM_STATE)print('Setup selesai.')
Setup selesai.
Section 1 - Demo: Fitur Lag dan Validasi Temporal
Data: dua sensor dan target autoregresif
Target y mengikuti proses autoregresif (bergantung pada nilainya sendiri di masa lalu) plus pengaruh sensor. Fitur yang kita bangun hanya lag sensor, jadi sengaja tidak menangkap seluruh memori y.
Look-ahead leakage: fitur yang menyentuh masa depan
bocor = buat_fitur(ts)bocor['y_masa_depan'] = ts['y'].shift(-1) # LOOK-AHEAD: memakai target masa depanB = bocor.assign(y=ts['y']).dropna().reset_index(drop=True)Xb = B.drop(columns='y').to_numpy()yb = B['y'].to_numpy()r_kausal = cross_val_score(Ridge(), X, yv, cv=tscv, scoring='r2').mean()r_leak = cross_val_score(Ridge(), Xb, yb, cv=tscv, scoring='r2').mean()print(f'Fitur kausal (hanya lag sensor) R2 = {r_kausal:.3f}')print(f'Dengan target masa depan (bocor) R2 = {r_leak:.3f}')
Fitur kausal (hanya lag sensor) R2 = 0.805
Dengan target masa depan (bocor) R2 = 0.934
🔎 Amati. Fitur kausal (hanya lag sensor) menangkap sebagian sinyal. Menambahkan target masa depan y.shift(-1) melonjakkan R2 secara semu karena deret ini berkorelasi kuat antar-waktu: itulah look-ahead leakage, dan fitur seperti itu tidak tersedia saat prediksi nyata. Random split juga sedikit lebih optimistis daripada temporal split karena menaruh titik bertetangga waktu di latih dan uji sekaligus. Aturannya: fitur hanya dari masa lalu, validasi kronologis.
Section 2 - Mini Project
Soal
Anda diberi deret waktu multivariat (tiga sensor) dengan satu target y.
Tugas:
Bangun fitur lag dan rolling yang kausal (hanya masa lalu, pakai shift).
Evaluasi model dengan TimeSeriesSplit (tambahkan gap bila perlu).
Bandingkan dengan KFold(shuffle=True) dan jelaskan mengapa hasilnya bisa menyesatkan.
Luaran: kode fitur + kedua skema validasi, plus 2-3 kalimat kesimpulan.
Kriteria penilaian: (a) semua fitur kausal; (b) validasi temporal benar; (c) analisis perbedaan temporal vs random.
# DATA AWAL (jangan diubah) - tiga sensor, target autoregresif.T =1800t = np.arange(T)a = np.sin(2* np.pi * t /120) + rng.normal(0, 0.3, T)b = np.cos(2* np.pi * t /200) + rng.normal(0, 0.3, T)c = rng.normal(0, 1, T).cumsum() *0.02y = np.zeros(T)for i inrange(2, T): y[i] =0.7* y[i -1] +0.4* a[i -1] +0.3* b[i -2] +0.2* c[i -1] + rng.normal(0, 0.4)sensor = pd.DataFrame({'a': a, 'b': b, 'c': c, 'y': y})print('Data:', sensor.shape)sensor.head()
Data: (1800, 4)
a
b
c
y
0
-0.150064
0.831895
0.035560
0.000000
1
-0.394081
1.470670
0.060504
0.000000
2
0.430211
0.782777
0.057327
-0.115630
3
-0.235866
0.924158
0.033161
0.014069
4
0.446995
0.668242
0.059909
0.257067
# Kerjakan di sini.# Petunjuk: sensor['a'].shift(1), .rolling(k).mean() setelah shift; TimeSeriesSplit(n_splits=5, gap=...).