Validasi silang data deret waktu

Machine Learning untuk Data Deret Waktu di Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Validasi silang dengan scikit-learn

# Melakukan iterasi pada metode "split" menghasilkan indeks train/test
for tr, tt in cv.split(X, y):
    model.fit(X[tr], y[tr])
    model.score(X[tt], y[tt])
Machine Learning untuk Data Deret Waktu di Python

Jenis validasi silang: KFold

  • Validasi silang KFold membagi data menjadi beberapa "fold" berukuran sama
  • Ini adalah salah satu rutin validasi silang yang paling umum

      from sklearn.model_selection import KFold
      cv = KFold(n_splits=5)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning untuk Data Deret Waktu di Python

Memvisualisasikan prediksi model

fig, axs = plt.subplots(2, 1)

# Plot indeks yang dipilih untuk validasi pada tiap loop
axs[0].scatter(tt, [0] * len(tt), marker='_', s=2, lw=40)
axs[0].set(ylim=[-.1, .1], title='Indeks set uji (warna=loop CV)', 
           xlabel='Indeks data mentah')

# Plot prediksi model pada tiap iterasi
axs[1].plot(model.predict(X[tt]))
axs[1].set(title='Prediksi set uji pada tiap loop CV', 
           xlabel='Indeks prediksi')
Machine Learning untuk Data Deret Waktu di Python

Visualisasi perilaku CV KFold

Machine Learning untuk Data Deret Waktu di Python

Catatan tentang mengacak data Anda

  • Banyak iterator CV memungkinkan pengacakan data sebagai bagian dari proses validasi silang.
  • Ini hanya berlaku jika data i.i.d., yang pada deret waktu biasanya tidak.
  • Anda sebaiknya tidak mengacak data saat membuat prediksi dengan deret waktu.

      from sklearn.model_selection import ShuffleSplit
    
      cv = ShuffleSplit(n_splits=3)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning untuk Data Deret Waktu di Python

Visualisasi perilaku CV teracak

Machine Learning untuk Data Deret Waktu di Python

Menggunakan iterator CV deret waktu

  • Sejauh ini, kita memutus alur waktu linear dalam validasi silang
  • Namun, secara umum Anda tidak boleh memakai titik data masa depan untuk memprediksi masa lalu
  • Satu pendekatan: Selalu gunakan data latih dari masa lalu untuk memprediksi masa depan
Machine Learning untuk Data Deret Waktu di Python

Memvisualisasikan iterator validasi silang deret waktu

# Impor dan inisialisasi iterator validasi silang
from sklearn.model_selection import TimeSeriesSplit
cv = TimeSeriesSplit(n_splits=10)

fig, ax = plt.subplots(figsize=(10, 5))
for ii, (tr, tt) in enumerate(cv.split(X, y)):
    # Plot indeks training dan test
    l1 = ax.scatter(tr, [ii] * len(tr), c=[plt.cm.coolwarm(.1)], 
                    marker='_', lw=6)
    l2 = ax.scatter(tt, [ii] * len(tt), c=[plt.cm.coolwarm(.9)], 
                    marker='_', lw=6)
    ax.set(ylim=[10, -1], title='Perilaku TimeSeriesSplit', 
           xlabel='indeks data', ylabel='Iterasi CV')
    ax.legend([l1, l2], ['Training', 'Validasi'])
Machine Learning untuk Data Deret Waktu di Python

Visualisasi iterator validasi silang TimeSeriesSplit

Machine Learning untuk Data Deret Waktu di Python

Fungsi penilaian kustom di scikit-learn

def myfunction(estimator, X, y):
    y_pred = estimator.predict(X)
    my_custom_score = my_custom_function(y_pred, y)
    return my_custom_score
Machine Learning untuk Data Deret Waktu di Python

Fungsi korelasi kustom untuk scikit-learn

def my_pearsonr(est, X, y):
    # Hasilkan prediksi dan ubah menjadi vektor 
    y_pred = est.predict(X).squeeze()

    # Gunakan fungsi numpy "corrcoef" untuk menghitung matriks korelasi
    my_corrcoef_matrix = np.corrcoef(y_pred, y.squeeze())

    # Kembalikan satu nilai korelasi dari matriks
    my_corrcoef = my_corrcoef[1, 0]
    return my_corrcoef
Machine Learning untuk Data Deret Waktu di Python

Ayo berlatih!

Machine Learning untuk Data Deret Waktu di Python

Preparing Video For Download...