Temporal Fusion Transformer: Time Series Forecasting dengan Deep Learning — Tutorial Lengkap

Buat prediksi yang akurat dan dapat ditafsirkan

Dibuat dengan DALLE [1]

Menurut [2], Transformator Fusi Temporal mengungguli semua model Deep Learning terkemuka untuk perkiraan deret waktu.

Termasuk unggulan Pohon Peningkat Gradien model untuk data deret waktu tabular.

Tapi apa itu Transformator Fusi Temporal (TFT)[3] dan mengapa begitu menarik?

Pada artikel ini, kami menjelaskan secara singkat hal-hal baru dari Transformator Fusi Temporal dan membangun proyek end-to-end Peramalan Permintaan Energi. Secara khusus, kami akan membahas:

  • Bagaimana menyiapkan data kita untuk format TFT.
  • Cara membuat, melatih, dan mengevaluasi model TFT.
  • Cara mendapatkan prediksi pada data validasi dan prediksi out-of-sample.
  • Cara menghitung kepentingan fitur, pola musiman, dan kekokohan peristiwa ekstrim menggunakan model bawaan perhatian yang dapat ditafsirkan mekanisme.

Ayo selami!

Untuk analisis mendalam tentang arsitektur Temporal Fusion Transformer, periksa sebelumnya artikel.

Tkerajaan Fpenggunaan Tpemindah (TFT) adalah model berbasis Transformer yang memanfaatkan perhatian diri untuk menangkap dinamika temporal yang kompleks dari berbagai urutan waktu.

TFT mendukung:

  • Deret waktu berganda: Kita dapat melatih model TFT pada ribuan deret waktu univariat atau multivariat.
  • Peramalan Multi-Horizon: Model menghasilkan prediksi multi-langkah dari satu atau beberapa variabel target — termasuk interval prediksi.
  • Fitur heterogen: TFT mendukung banyak jenis fitur, termasuk varian waktu dan variabel eksogen statis.
  • Prediksi yang dapat ditafsirkan: Prediksi dapat ditafsirkan dalam hal kepentingan variabel dan musiman.

Salah satu ciri itu unik untuk Transformator Fusi Temporal. Kami akan membahas ini di bagian selanjutnya.

Di antara model deret waktu DL yang terkenal (misalnya, Jauh[4]), TFT menonjol karena mendukung berbagai jenis fitur. Ini adalah:

  • Bervariasi waktu dikenal
  • Bervariasi waktu tidak dikenal
  • Waktu-invarian nyata
  • Waktu-invarian kategorikal

Misalnya, bayangkan kita memiliki a kasus perkiraan penjualan:

Katakanlah kita harus memprediksi penjualan 3 produk. Itu num sales adalah variabel sasaran. Itu CPI index atau itu number of visitors adalah waktu bervariasi tidak diketahui fitur karena mereka hanya diketahui sampai waktu prediksi. Namun, holidaysdan special days adalah bervariasi waktu diketahui acara.

Grafik product id is kategorikal waktu-invarian (statis). fitur. Fitur lain yang numerik dan tidak tergantung waktu seperti yearly_revenue dapat dikategorikan sebagai waktu-invarian nyata.

Sebelum pindah ke proyek kami, pertama-tama kami akan menunjukkan tutorial mini tentang cara mengonversi data Anda ke format deret waktu yang diperpanjang.

Catatan: Semua gambar dan figur dalam artikel ini dibuat oleh penulis.

Untuk tutorial ini, kami menggunakan TemporalFusionTransformer model dari Peramalan PyTorch perpustakaan dan Petir PyTorch:

pip instal obor pytorch-lightning pytorch_forecasting

Seluruh proses melibatkan 3 hal:

  1. Buat kerangka data panda dengan data deret waktu kami.
  2. Bungkus kerangka data kami menjadi a Kumpulan Data Rangkaian Waktu contoh.
  3. Lewati kami Kumpulan Data Rangkaian Waktu contoh untuk TemporalFusionTransformer.

Grafik Kumpulan Data Rangkaian Waktu sangat berguna karena membantu kami menentukan apakah fiturnya berubah-ubah waktu atau statis. Plus, itu satu-satunya format itu TemporalFusionTransformer menerima.

Mari buat set data pelatihan minimal untuk menunjukkan caranya Kumpulan Data Rangkaian Waktu karya:

Kita harus memformat data kita dengan cara berikut: Setiap kotak berwarna mewakili deret waktu yang berbeda, diwakili olehnya group nilai.

Gambar 1: Frame data panda sample_data

Kolom terpenting dari kerangka data kami adalah time_idx - itu menentukan urutan sampel. Jika tidak ada pengamatan yang hilang, nilainya harus bertambah +1 untuk setiap deret waktu.

Selanjutnya, kami membungkus kerangka data kami menjadi a Kumpulan Data Rangkaian Waktu contoh:

Semua argumen cukup jelas: The max_encoder_length menentukan periode lihat balik dan max_prediction_length menentukan berapa banyak titik data yang akan diprediksi. Dalam kasus kami, kami melihat kembali 3 langkah waktu di masa lalu untuk menghasilkan 2 prediksi.

Grafik Kumpulan Data Rangkaian Waktu instance sekarang berfungsi sebagai dataloader. Mari cetak batch dan periksa bagaimana data kita akan diteruskan ke TFT:

Batch ini berisi nilai-nilai pelatihan [0,1] dari rangkaian waktu pertama (group 0) dan nilai pengujian[2,3,4]. Jika Anda menjalankan kembali kode ini, Anda akan mendapatkan nilai yang berbeda karena data diacak secara default.

Proyek kami akan menggunakan Diagram Beban Listrik20112014 [5] kumpulan data dari UCI. Buku catatan untuk contoh ini dapat diunduh dari di sini:

Dataset ini berisi penggunaan daya (dalam KWs) dari 370 klien/konsumen dengan frekuensi 15 menit. Rentang data 4 tahun (2011–2014).

Beberapa konsumen dibuat setelah 2011, sehingga penggunaan daya awalnya nol.

Kami melakukan preprocessing data sesuai dengan [3]:

  • Agregat variabel target kita power_usage per jam.
  • Temukan tanggal paling awal untuk setiap deret waktu yang dayanya bukan nol.
  • Buat fitur baru: month, day, hour dan day_of_week.
  • Pilih antara semua hari 2014–01–01 dan 2014–09–07.

Ayo mulai:

Download Data

wget https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!buka zip
LD2011_2014.txt.zip

Pengolah Data

Setiap kolom mewakili konsumen. Paling awal power_usage nilainya adalah 0.

Selanjutnya, kami menggabungkan data per jam. Karena ukuran dan kerumitan model, kami melatih model kami hanya pada 5 konsumen (untuk konsumen dengan nilai bukan nol).

Sekarang, kami menyiapkan dataset kami untuk Kumpulan Data Rangkaian Waktu format. Perhatikan bahwa setiap kolom mewakili deret waktu yang berbeda. Oleh karena itu, kami 'melelehkan' kerangka data kami, sehingga semua deret waktu ditumpuk secara vertikal, bukan horizontal. Dalam prosesnya, kami membuat fitur baru kami.

Kerangka data praproses akhir disebut time_df. Mari kita cetak isinya:

Grafik time_df sekarang dalam format yang tepat untuk Kumpulan Data Rangkaian Waktu. Seperti yang sudah Anda duga sekarang, karena granularitasnya per jam, hours_from_start variabel akan menjadi indeks waktu.

Analisis Data Eksplorasi

Pilihan 5 konsumen/time-series tidak acak. Itu power usage dari setiap deret waktu memiliki properti yang berbeda, seperti nilai rata-rata:

time_df[['consumer_id','power_usage']].groupby('consumer_id').mean()

Mari plot bulan pertama dari setiap deret waktu:

Gambar 2: Bulan pertama dari semua 5 deret waktu/konsumen.

Tidak ada tren yang terlihat, tetapi setiap deret waktu memiliki musim dan amplitudo yang sedikit berbeda. Kita dapat bereksperimen lebih lanjut dan memeriksa stasioneritas, dekomposisi sinyal, dan seterusnya, tetapi dalam kasus kita, kita fokus pada aspek pembangunan model saja.

Juga, perhatikan bahwa metode peramalan deret waktu lainnya seperti ARIMA harus memenuhi beberapa persyaratan (misalnya, deret waktu harus menjadi stasioner terlebih dahulu.) Dengan TFT, kita dapat membiarkan data apa adanya.

Buat DataLoader

Pada langkah ini, kami melewati kami time_df ke Kumpulan Data Seri Waktu format yang sangat berguna karena:

  • Ini menghindarkan kami dari menulis Dataloader kami sendiri.
  • Kita dapat menentukan bagaimana TFT akan menangani fitur dataset.
  • Kami dapat menormalkan dataset kami dengan mudah. Dalam kasus kami, normalisasi adalah wajib karena semua urutan waktu berbeda besarnya. Jadi, kami menggunakan Pengnormal Grup untuk menormalkan setiap deret waktu satu per satu.

Model kami menggunakan jendela lihat balik satu minggu (7*24) untuk memprediksi penggunaan daya selama 24 jam ke depan.

Perhatikan juga bahwa hours_from_start adalah indeks waktu dan fitur yang bervariasi waktu. Itu power_usage adalah variabel target kami. Demi demonstrasi, set validasi kami adalah hari terakhir:

Model Dasar

Selanjutnya, langkah yang hampir semua orang lupakan: Model dasar. Khususnya dalam peramalan deret waktu, Anda akan terkejut betapa seringnya prediktor yang naif mengungguli model yang lebih bagus sekalipun!

Sebagai garis dasar yang naif, kami memperkirakan kurva penggunaan daya pada hari sebelumnya:

Melatih Model Transformer Fusi Temporal

Kita bisa melatih model TFT kita menggunakan familiar Pelatih antarmuka dari PyTorch Lightning.

Perhatikan hal-hal berikut:

  • Kami menggunakan Berhenti Dini callback untuk memantau hilangnya validasi.
  • Kami menggunakan Papan tarik untuk mencatat metrik pelatihan dan validasi kami.
  • Model kami menggunakan Kerugian Kuantil — jenis kerugian khusus yang membantu kami menampilkan interval prediksi. Untuk mengetahui lebih lanjut tentang fungsi Quantile Loss, lihat artikel ini.
  • Kami menggunakan 4 kepala perhatian, seperti kertas aslinya.

Kami sekarang siap untuk membangun dan melatih model kami:

Itu dia! Setelah 6 zaman, EarlyStopping dimulai dan menghentikan pelatihan.

Muat dan Simpan Model Terbaik

Jangan lupa untuk menyimpan model Anda. Meskipun kita dapat mengambilnya, opsi teraman adalah menyimpan zaman terbaik secara langsung:

!zip -r model.zip lightning_logs/lightning_logs/version_1/*

Untuk memuat model lagi, unzip model.zip dan jalankan yang berikut — ingat saja jalur model terbaik:

Periksa Papan Tensor

Lihat lebih dekat kurva pelatihan dan validasi dengan Tensorboard:

Evaluasi Model

Dapatkan prediksi pada set validasi dan hitung rata-ratanya P50 (median kuantil) lepas:

2 deret waktu terakhir memiliki kerugian yang sedikit lebih tinggi karena besaran relatifnya juga tinggi.

Prediksi Plot pada Data Validasi

Jika kita melewati mode=raw pada meramalkan() metode, kami mendapatkan lebih banyak informasi, termasuk prediksi untuk ketujuh kuantil. Kami juga memiliki akses ke nilai perhatian (lebih lanjut tentang itu nanti).

Perhatikan lebih dekat raw_predictions variabel:

Kami menggunakan plot_prediksi() untuk membuat plot kami. Tentu saja, Anda dapat membuat plot kustom sendiri — yaitu plot_prediksi() memiliki manfaat ekstra untuk menambahkan nilai perhatian.

Catatan: Model kami memprediksi 24 titik data berikutnya dalam sekali jalan. Ini bukan skenario peramalan bergulir di mana model memprediksi a tunggal nilai setiap waktu dan 'jahit' semua prediksi bersama.

Kami membuat satu plot untuk setiap konsumen (total 5).

Gambar 3: Prediksi data validasi untuk MT_002
Gambar 4: Prediksi data validasi untuk MT_004
Gambar 5: Prediksi data validasi untuk MT_005
Gambar 6: Prediksi data validasi untuk MT_006
Gambar 7: Prediksi data validasi untuk MT_008

Hasilnya cukup mengesankan.

Kami Transformator Fusi Temporal model mampu menangkap perilaku semua 5 deret waktu, baik dari segi musiman maupun besarnya!

Perhatikan juga bahwa:

  • Kami tidak melakukan penyetelan hyperparameter apa pun.
  • Kami tidak menerapkan teknik rekayasa fitur mewah apa pun.

Di bagian selanjutnya, kami menunjukkan cara meningkatkan model kami dengan pengoptimalan hyperparameter.

Prediksi Plot Untuk Deret Waktu Tertentu

Sebelumnya, kami memplot prediksi pada data validasi menggunakan idx argumen, yang mengulang semua deret waktu dalam kumpulan data kami. Kami dapat lebih spesifik dan menghasilkan prediksi pada deret waktu tertentu:

Gambar 7: Prediksi hari depan untuk MT_004 pada perangkat pelatihan

In Gambar 7, kami merencanakan hari ke depan MT_004 konsumen untuk indeks waktu = 26512.

Ingat, kolom pengindeksan waktu kami hours_from_start mulai dari 26304 dan kita bisa mendapatkan prediksi dari 26388 dan seterusnya (karena kita menetapkan sebelumnya min_encoder_length=max_encoder_length // 2 yang sama dengan 26304 + 168//2=26388

Prakiraan Out-of-Sample

Mari buat prediksi di luar sampel, di luar titik data akhir dari data validasi — yaitu 2014–09–07 23:00:00

Yang harus kita lakukan adalah membuat kerangka data baru yang berisi:

  • Jumlah N=max_encoder_length tanggal yang lalu, yang bertindak sebagai jendela lihat balik — itu data penyandi dalam terminologi TFT.
  • Tanggal masa depan ukuran max_prediction_length yang ingin kami hitung prediksi kami — yaitu data dekoder.

Kami dapat membuat prediksi untuk semua 5 deret waktu kami, atau hanya satu. Gambar 7 menunjukkan prediksi out-of-sampel untuk konsumen MT_002:

Gambar 7: Prediksi hari depan untuk MT_002

Peramalan yang akurat adalah satu hal, tetapi kemampuan menjelaskan juga sangat penting saat ini.

Dan lebih buruk lagi untuk model Deep Learning, yang dianggap sebagai kotak hitam. Metode seperti JERUK NIPIS dan BENTUK dapat memberikan penjelasan (sampai batas tertentu) tetapi tidak berfungsi dengan baik untuk deret waktu. Plus, mereka adalah metode post-hoc eksternal dan tidak terikat pada model tertentu.

Transformator Fusi Temporal menyediakan tiga jenis interpretabilitas:

  • Dari segi musiman: TFT memanfaatkan novelnya Perhatian Multi-Kepala yang Dapat Diartikan mekanisme untuk menghitung pentingnya langkah waktu lampau.
  • Dari segi fitur: TFT memanfaatkannya Jaringan Seleksi Variabel modul untuk menghitung pentingnya setiap fitur.
  • Kekokohan kejadian ekstrem: Kami dapat menyelidiki bagaimana deret waktu berperilaku selama peristiwa langka

Jika Anda ingin belajar secara mendalam tentang cara kerja batin Perhatian Multi-Kepala yang Dapat Diartikan dan Jaringan Seleksi Variabel, cek artikel saya sebelumnya.

Interpretabilitas berdasarkan musim

TFT mengeksplorasi bobot perhatian untuk memahami pola temporal lintas langkah waktu lampau.

Garis abu-abu di semua plot sebelumnya mewakili skor perhatian. Lihat plot itu lagi - apakah Anda memperhatikan sesuatu? Gambar 8 menunjukkan temuan dari Gambar 7 dan juga memperhitungkan skor perhatian:

Gambar 8: Prediksi hari depan untuk MT_001 dengan musim ditampilkan

Skor perhatian mengungkapkan seberapa besar dampak langkah waktu tersebut ketika model mengeluarkan prediksinya. Puncak kecil mencerminkan musiman harian, sedangkan puncak yang lebih tinggi menjelang akhir mungkin menyiratkan musiman mingguan.

Jika kita rata-ratakan kurva perhatian di semua langkah waktu dan deret waktu (bukan hanya 5 yang kita gunakan dalam tutorial ini), kita akan mendapatkan bentuk yang tampak simetris di Gambar 9 dari kertas TFT:

Gambar 9: Pola Temporal untuk dataset Listrik (sumber)

Pertanyaan: Apa bagusnya ini? Tidak bisakah kita memperkirakan pola musiman dengan metode seperti plot ACF, dekomposisi sinyal waktu, dll.?

Jawaban: BENAR. Namun, mempelajari bobot perhatian TFT memiliki keuntungan tambahan:

  1. Kami dapat mengonfirmasi bahwa model kami menangkap dinamika musiman yang tampak dari urutan kami.
  2. Model kami juga dapat mengungkapkan pola tersembunyi karena bobot perhatian jendela masukan saat ini mempertimbangkan semua masukan sebelumnya.
  3. Plot bobot perhatian tidak sama dengan plot autokorelasi: Plot autokorelasi mengacu pada urutan tertentu, sedangkan bobot perhatian di sini berfokus pada dampak setiap langkah waktu dengan melihat semua kovariat dan deret waktu.

Interpretabilitas berdasarkan fitur

Grafik Jaringan Seleksi Variabel komponen TFT dapat dengan mudah memperkirakan kepentingan fitur:

Gambar 10: Fitur penting pada data validasi

In Gambar 10, kami perhatikan hal berikut:

  • Grafik hour dan day_of_week memiliki skor yang kuat, baik sebagai pengamatan masa lalu dan kovariat masa depan. Tolok ukur dalam makalah asli berbagi kesimpulan yang sama.
  • Grafik power_usage jelas merupakan kovariat teramati yang paling berpengaruh.
  • Grafik consumer_id tidak terlalu signifikan di sini karena kami hanya menggunakan 5 konsumen. Dalam makalah TFT, di mana penulis menggunakan 370 konsumen, variabel ini lebih signifikan.

Catatan: Jika variabel statis pengelompokan Anda tidak penting, kemungkinan besar kumpulan data Anda juga dapat dimodelkan dengan baik oleh model distribusi tunggal (seperti ARIMA).

Deteksi Peristiwa Ekstrim

Deret waktu terkenal rentan terhadap perubahan mendadak pada propertinya selama peristiwa langka (juga disebut sebagai guncangan).

Lebih buruk lagi, peristiwa itu sangat sulit dipahami. Bayangkan jika variabel target Anda menjadi tidak stabil untuk waktu yang singkat karena kovariat secara diam-diam mengubah perilaku:

Apakah ini kebisingan acak atau pola persisten tersembunyi yang lolos dari model kita?

Dengan TFT, kami dapat menganalisis ketangguhan setiap fitur individu di seluruh rentang nilainya. Sayangnya, kumpulan data saat ini tidak menunjukkan volatilitas atau kejadian langka — hal itu lebih mungkin ditemukan di data keuangan, penjualan, dan sebagainya. Namun, kami akan menunjukkan cara menghitungnya:

Beberapa fitur tidak memiliki semua nilainya dalam kumpulan data validasi, jadi kami hanya menampilkan hour dan consumer_id:

Gambar 11: Prediksi vs aktual (rata-rata normal) pada jam
Gambar 12: Prediksi vs aktual (rata-rata yang dinormalisasi) di consumer_id

Di kedua Angka, hasilnya menggembirakan. Di dalam Gambar 12, kami memperhatikan konsumen itu MT_004 sedikit berkinerja buruk dibandingkan dengan konsumen lain. Kami dapat memverifikasi ini jika kami menormalkan kerugian P50 setiap konsumen dengan penggunaan daya rata-rata yang kami hitung sebelumnya.

Bilah abu-abu menunjukkan distribusi setiap variabel. Satu hal yang selalu saya lakukan adalah menemukan nilai mana yang memiliki frekuensi rendah. Kemudian, saya memeriksa performa model di area tersebut. Oleh karena itu, Anda dapat dengan mudah mendeteksi jika model Anda menangkap perilaku kejadian langka.

Secara umum, Anda dapat menggunakan fitur TFT ini untuk menyelidiki kelemahan model Anda dan melanjutkan penyelidikan lebih lanjut.

Kita dapat menggunakan dengan mulus Transformator Fusi Temporal dengan pilihan untuk melakukan penyetelan hyperparameter:

Masalahnya adalah karena TFT adalah model berbasis Transformer, Anda memerlukan sumber daya perangkat keras yang signifikan!

Transformator Fusi Temporal tidak diragukan lagi merupakan tonggak sejarah bagi komunitas Time-Series.

Model tidak hanya mencapai hasil SOTA, tetapi juga menyediakan kerangka kerja untuk interpretasi prediksi. Modelnya juga tersedia di Panahan perpustakaan python, yang didasarkan pada perpustakaan PyTorch Forecasting.

Terakhir, jika Anda penasaran untuk mempelajari tentang arsitektur bangunan tersebut Transformator Fusi Temporal secara rinci, periksa artikel pendamping pada kertas aslinya.

Temporal Fusion Transformer: Time Series Forecasting with Deep Learning — Tutorial Lengkap Dipublikasikan Ulang dari Sumber https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 melalui https://towardsdatascience.com/feed

<!–

->

Stempel Waktu:

Lebih dari Konsultan Blockchain