Prakiraan Seri-Waktu multi-dimensi dan multivarian (RNN / LSTM) Keras

12

Saya telah mencoba memahami bagaimana cara merepresentasikan dan membentuk data untuk membuat perkiraan deret waktu multidimensional dan multivarian menggunakan Keras (atau TensorFlow) tetapi saya masih sangat tidak jelas setelah membaca banyak posting blog / tutorial / dokumentasi tentang cara menyajikan data dalam bentuk yang benar (sebagian besar contoh sedikit kurang

Kumpulan Data Saya:

  • beberapa kota
  • yang saya punya info tentang suhu, lalu lintas mobil, kelembaban
  • untuk mengatakan 2 tahun terakhir (satu catatan untuk setiap hari)

Apa yang ingin saya lakukan: Saya ingin meramalkan untuk setiap kota suhu yang dapat saya harapkan untuk tahun depan menggunakan versi yang mungkin tertinggal suhu, lalu lintas mobil dan kelembaban (tentu saja akan ada beberapa fitur lagi tetapi ini hanya sebuah contoh untuk dipikirkan).

Yang saya bingung: Jika saya memiliki 2 kota, di mana saya mencatat 3 fitur selama 365 hari. Bagaimana saya harus membentuk input saya sehingga model dapat menampilkan perkiraan untuk 365 hari untuk dua kota ini (yaitu 2 rangkaian waktu suhu selama 365 hari)?

Secara intuitif bentuk tensor akan (?, 365, 3)selama 365 hari dan 3 fitur. Tetapi saya tidak yakin apa yang harus dimasukkan ke dimensi pertama dan, yang paling penting, saya akan terkejut jika itu harus untuk jumlah kota. Tetapi pada saat yang sama, saya tidak tahu bagaimana menentukan ke dalam model yang harus memahami dimensi dengan benar.

Petunjuk apa pun akan sangat membantu. Saya cukup akrab dengan sisa masalah (yaitu bagaimana Anda membangun jaringan di Keras dll karena saya telah melakukan ini untuk jaringan saraf lain, tetapi lebih khusus bagaimana cara terbaik untuk menyandikan urutan untuk input yang diinginkan.)

Oh dan juga , saya kira saya bisa melatih dan memprediksi untuk setiap kota secara mandiri, tetapi saya yakin semua orang akan setuju mungkin ada hal-hal yang harus dipelajari yang tidak khusus untuk kota mana pun tetapi yang hanya dapat dilihat jika mempertimbangkan beberapa dari mereka, maka dari itu mengapa saya pikir penting untuk menyandikannya dalam model.

Bastien
sumber
1
Inilah tutorial yang bagus tentang topik ini: tensorflow.org/beta/tutorials/text/time_series
CubeBot88

Jawaban:

13

Bentuk input untuk LSTM harus (num_samples, num_time_steps, num_features). Dalam contoh kasus Anda, menggabungkan kedua kota sebagai input, num_featuresakan 2x3 = 6.

Jika Anda mengelompokkan semua langkah 365 waktu Anda ke dalam satu sampel, maka dimensi pertama akan menjadi 1 - satu sampel tunggal! Anda juga dapat melakukan pemeriksaan kewarasan dengan menggunakan jumlah total poin data. Anda memiliki 2 kota, masing-masing dengan 365 langkah-waktu dan 3 fitur: 2x365x3 = 2190. Ini jelas sama dengan 1x365x6 (seperti yang saya katakan di atas) - jadi itu kemungkinan (Keras akan berjalan) - tetapi jelas tidak akan belajar untuk menggeneralisasi sama sekali, hanya memberikan satu sampel.

Lihatlah pertanyaan yang relevan ini , yang baru-baru ini saya jawab. Di sana saya berbicara sedikit tentang menggunakan jendela bergulir (periksa komentar jawabannya untuk info lebih lanjut). Itu akan membeli Anda lebih banyak sampel jika Anda membutuhkannya.

Jika Anda ingin melatih model tunggal dengan data untuk kedua kota sebagai input, maka membuat prediksi untuk kedua kota pada setiap langkah waktu adalah semudah mendefinisikan Denselapisan akhir , yang menghasilkan 2 unit. Data validasi / tes Anda tentunya harus mengandung tuple of (city1, city2).

Cara yang mungkin lebih canggih untuk melakukan pendekatan ini adalah dengan membuat set data berdasarkan kota tunggal, kemudian melatih beberapa sub-model pada setiap kota secara individual (katakanlah untuk 5 layer), lalu Merge/ Concatenatemereka dan letakkan beberapa layer lebih lanjut di atas. Ini berarti Anda menggabungkan fitur yang dipelajari dari setiap kota, yang pada gilirannya digabungkan ke tingkat abstraksi yang lebih tinggi. Ini adalah gambar pertama yang saya dapatkan dari mesin pencari , yang membuat sketsa ide.

n1k31t4
sumber
Terima kasih banyak telah meluangkan waktu untuk menjawab dengan sangat jelas! Masuk akal sekarang. Tapi, memang, yang saya takutkan adalah melakukan solusi pertama yang Anda jelaskan akan mencegah banyak generalisasi. Akankah pendekatan sliding window benar-benar memungkinkan banyak generalisasi lintas kota?
Bastien
Sama-sama! Jaring yang dalam selalu mendapat manfaat dari lebih banyak data. Saran saya di atas akan mengandung banyak parameter - dengan hanya 365 poin, Anda berisiko overfitting ke kota-kota tersebut (yaitu tidak ada generalisasi)! Anda dapat mencoba augmentasi data - caranya , tergantung pada data Anda. Jika Anda memiliki cukup data, Anda dapat menggeneralisasi dengan baik - Saya bisa membayangkan hasil tipe Word2Vec (umum dalam analisis teks / NLP), di mana hubungan antara variabel menjadi dapat ditafsirkan. Lihat ini untuk info , dan ini untuk intuisi / kesenangan lainnya . Hasil Anda dapat merencanakan peta cuaca!
n1k31t4
ya masuk akal, jadi bekerja dengan beberapa jendela bergulir agak akan menipu "lebih banyak data" dalam semacam jika saya mengerti apa yang Anda katakan?
Bastien
Dengan asumsi Anda memperkirakan besok berdasarkan 100 hari terakhir, keadaan sistem tidak akan berubah sama sekali sejak kemarin (jika melakukan rolling windows), dibandingkan dengan satu tahun yang lalu (tidak menggunakan rolling windows). Meskipun secara teknis membuat lebih banyak sampel, Anda tidak membuat titik data baru - melainkan memprediksi memungkinkan model untuk fokus pada potongan kecil satu per satu. Granularitas yang lebih tinggi ini akan memungkinkan Anda untuk membuat pernyataan statistik yang lebih baik (lebih halus) tentang hasilnya, dibandingkan dengan mencocokkan semua data satu, dan membuat satu prediksi. Anda mengurangi ketidakpastian dalam hasil.
n1k31t4
sepakat! Dan apakah jendela bergulir tidak mencegah sel memori dari belajar ketergantungan kemarahan yang panjang sama sekali?
Bastien