Pembelajaran mesin - fitur rekayasa dari data tanggal / waktu

45

Apa praktik umum / terbaik untuk menangani data waktu untuk aplikasi pembelajaran mesin?

Misalnya, jika dalam kumpulan data ada kolom dengan stempel waktu acara, seperti "2014-05-05", bagaimana Anda dapat mengekstrak fitur yang berguna dari kolom ini jika ada?

Terima kasih sebelumnya!

Igor Bobriakov
sumber

Jawaban:

44

Saya akan mulai dengan membuat grafik variabel waktu vs variabel lain dan mencari tren.

Sebagai contoh

masukkan deskripsi gambar di sini

Dalam hal ini ada tren mingguan berkala dan tren kenaikan jangka panjang. Jadi, Anda ingin menyandikan dua variabel waktu:

  • day_of_week
  • absolute_time

Secara umum

Ada beberapa kerangka waktu umum yang menjadi tren:

  • absolute_time
  • day_of_year
  • day_of_week
  • month_of_year
  • hour_of_day
  • minute_of_hour

Cari tren di semua ini.

Tren yang aneh

Cari tren aneh juga. Misalnya, Anda mungkin melihat tren berbasis waktu yang jarang namun terus-menerus:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

Ini sering mengharuskan Anda melakukan lintas referensi data terhadap beberapa sumber eksternal yang memetakan peristiwa ke waktu.

Mengapa grafik?

Ada dua alasan yang menurut saya grafik sangat penting.

  • Tren aneh
    Sementara tren umum dapat diotomatisasi dengan mudah (cukup tambahkan setiap waktu), tren aneh sering membutuhkan mata manusia dan pengetahuan dunia untuk menemukannya. Ini adalah salah satu alasan mengapa grafik sangat penting.

  • Kesalahan data Data
    terlalu sering memiliki kesalahan serius di dalamnya. Misalnya, Anda mungkin menemukan bahwa tanggal dikodekan dalam dua format dan hanya satu yang telah dimuat dengan benar ke dalam program Anda. Ada banyak sekali masalah seperti itu dan itu sangat umum terjadi. Inilah alasan lain mengapa saya pikir grafik itu penting, bukan hanya untuk deret waktu, tetapi untuk data apa pun.

Ben Haley
sumber
7

Bagilah data ke dalam windows dan temukan fitur untuk windows tersebut seperti koefisien autokorelasi, wavelet, dll. Dan gunakan fitur tersebut untuk belajar.

Misalnya, jika Anda memiliki data suhu dan tekanan, pisahkan ke parameter individual dan hitung fitur seperti jumlah minimum lokal di jendela itu dan lainnya, dan gunakan fitur ini untuk model Anda.

Gurpreet Mohaar
sumber
7

Satu hal lagi yang perlu dipertimbangkan, di luar semua yang dikatakan Ben Haley, adalah beralih ke waktu pengguna lokal . Misalnya, jika Anda mencoba memprediksi sesuatu yang terjadi sekitar jam 8 malam untuk semua pengguna, jika Anda melihat waktu UTC, itu akan lebih sulit untuk diprediksi.

Amir
sumber
6

Dalam beberapa kasus, data dan acara dalam rangkaian waktu bersifat musiman. Dalam kasus seperti itu, bulan dan tahun acara sangat penting. Karenanya dalam skenario seperti itu Anda dapat menggunakan variabel biner untuk mewakili jika acara tersebut selama bulan / tahun tertentu atau tidak.

Semoga ini menjawab pertanyaan Anda. Jika tidak berbaik hati, lebih spesifik tentang apa yang sebenarnya ingin Anda capai

show_stopper
sumber
4

Seperti yang dijelaskan Ben dan Nar dengan baik, memecah objek tanggal menjadi beberapa bagian tanggal dan waktu akan membantu mendeteksi tren musiman, di mana objek tanggal-waktu yang lengkap (dan biasanya lebih buruk - unik) akan melewatkannya

Anda tidak menyebutkan algoritma pembelajaran mesin spesifik yang Anda minati, tetapi jika Anda juga tertarik dengan pengelompokan berbasis jarak, seperti k-means, saya akan menggeneralisasi objek tanggal-waktu ke dalam format unix-time . Ini akan memungkinkan perbandingan jarak numerik sederhana untuk algoritme, cukup dengan menyatakan sejauh mana 2 nilai tanggal.

Dalam contoh Anda, saya akan menggeneralisasi nilai tanggal saja 2014-05-05 hingga 1399248000 (waktu unix mewakili awal Mei 5 2014, UTC).

[Orang bisa berpendapat bahwa Anda dapat mencapainya dengan memasukkan tanggal-waktu ke dalam setiap bagian tanggal-waktu yang mungkin .. tetapi itu akan secara signifikan meningkatkan dimensi dataset Anda. Jadi, saya sarankan menggabungkan waktu unix, untuk pengukuran jarak, dan beberapa ember tanggal-waktu]

mork
sumber
3

Ben berbicara tentang fitur statis , dan memanfaatkan fitur cap waktu.

Sebagai ekstensi, saya akan memperkenalkan fitur lag , saya tidak berbicara tentang seri waktu mentah, tetapi agregat di atasnya.

Bagian yang paling mistis adalah bahwa nilai masa depan tidak terlihat bagi kita, bagaimana kita bisa menggunakan fitur agregat itu dalam data pelatihan?

Contoh kecil: Ada data konsumsi listrik tahunan dari 1991 hingga 2015, saya ingin memprediksi konsumsi listrik dalam 5 tahun ke depan, 2016 hingga 2020. Saya akan menghitung rata-rata bergerak 5 tahun terakhir konsumsi listrik sebagai nilai fitur tahun 2020, tetapi tahun 2016 hingga 2020 tidak diketahui bagi kami, jadi kami memimpin (berlawanan dengan lagging) seri waktu 5 tahun, mari lakukan rata-rata bergerak dari 2010 hingga 2015, kemudian gunakan nilai ini sebagai nilai fitur tahun 2020. Jadi, kita bisa membuat data fitur 5 tahun ke depan.

Langkah selanjutnya adalah hanya menggunakan fungsi bergerak (hitung \ mean \ median \ min \ max.etc) dan coba windows yang berbeda, maka Anda akan membangun banyak fitur!

serigala
sumber
2

Tergantung pada apa yang Anda minati dengan info tanggal / waktu, Anda mungkin hanya ingin membuangnya. Misalnya, jika Anda tertarik pada jarak dari titik awal (misalnya, 1 Januari 2015), dan Anda ingin mengukurnya dalam beberapa bulan, saya hanya akan mengkodekannya sebagai bulan 1 (untuk 1-31 Januari, 2015), 2 (1-28 Februari 2015), 3, 4, 5, 6, dll. Karena jarak antara tanggal mulai kira-kira sama, ini mewakili jarak waktu dalam format kontinu langsung. Dan saya katakan terus menerus karena Anda bisa mengatakan bulan 6,5 dan tahu bahwa itu setengah jalan sampai Juni 2015. Maka Anda tidak perlu khawatir tentang kode tanggal aktual dan Anda dapat menggunakan semua metode klasifikasi khas Anda.

Jika Anda ingin mengukur dalam beberapa hari, saya tahu MySql memiliki fungsi 'to_days', jika Anda menggunakannya untuk menarik data sebelum klasifikasi. Python mungkin memiliki sesuatu yang mirip, atau menggunakan format unix-time yang disarankan oleh mork.

Semoga ini membantu!

pmp
sumber
1

Plot grafik dengan variasi waktu yang berbeda terhadap variabel hasil untuk melihat dampaknya. Anda dapat menggunakan bulan, hari, tahun sebagai fitur terpisah dan karena bulan adalah variabel kategorikal, Anda dapat mencoba plot kotak / kumis dan melihat apakah ada pola. Untuk variabel numerik, Anda bisa menggunakan plot pencar.

Ram
sumber
1

Saya tidak tahu apakah ini merupakan praktik umum / terbaik, tetapi ini merupakan sudut pandang lain dari masalah ini.

Jika Anda memiliki, katakanlah, tanggal, Anda dapat memperlakukan setiap bidang sebagai "variabel kategori" alih-alih "variabel kontinu". Hari akan memiliki nilai dalam set {1, 2 ..., 31}, bulan akan memiliki nilai dalam {1, ..., 12} dan, untuk tahun tersebut, Anda memilih nilai minimum dan maksimum dan membangun satu set.

Kemudian, karena nilai numerik tertentu dari hari, bulan, dan tahun mungkin tidak berguna untuk menemukan tren dalam data, gunakan representasi biner untuk menyandikan nilai numerik, karena masing-masing bit merupakan fitur. Misalnya, bulan 5 akan menjadi 0 0 0 0 1 0 0 0 0 0 0 0(11 0 dan 1 di posisi 5, setiap bit menjadi fitur).

Jadi, setelah, misalnya, 10 tahun dalam "tahun set", tanggal akan diubah menjadi vektor 43 fitur (= 31 + 12 + 10). Menggunakan "vektor jarang", jumlah fitur seharusnya tidak menjadi masalah.

Hal serupa dapat dilakukan untuk data waktu, hari dalam seminggu, hari dalam sebulan ...

Itu semua tergantung dari pertanyaan yang Anda ingin model mesin pembelajaran Anda untuk menjawab.

Paco Barter
sumber
Ini gagal menangkap hubungan yang mungkin ada, seperti, bahwa tanggal 14 dan 15 bulan itu 'mirip'. Sejauh Anda percaya bahwa setiap hari benar-benar berbeda, Anda juga percaya bahwa prediksi tentang hari esok tidak mungkin. Ini juga tidak perlu untuk meng-encode kategorikal satu-panas, tidak harus.
Sean Owen
Saya tidak bisa melihat mengapa gagal menangkap "kedekatan" dari tanggal dekat. Jika Anda, misalnya, memberi makan vektor biner ke NN, ia akan mencari tahu sendiri setelah pelatihan yang tepat. Menggunakan vektor biner hanya satu cara mewakili kategori.
Paco Barter
Dalam contoh ini, Anda secara efektif memiliki kolom seperti "is_12th" dan "is_13th" yang, dalam ruang input, tidak terkait, dan tidak terkait dengan "is_1st", dll. Sebagai fitur berkelanjutan, ia akan menangkap dengan benar bahwa tanggal 12 dan 13 adalah dalam arti tertentu lebih dekat dari 1 dan 12. Anda tertarik pada apa yang mungkin disimpulkan model, tetapi, saya berbicara tentang apa yang dikodekan fitur input.
Sean Owen
Ok aku paham. Anda benar, fitur berkelanjutan lebih baik menangkap kualitas "kedekatan" dari tanggal. Maksud saya adalah bahwa mungkin ada tren dalam data untuk apa nilai numerik tanggal tidak relevan (misalnya, pola pembelian pelanggan tertentu hanya pada hari Sabtu). Karena itu menawarkan sudut pandang lain untuk berurusan dengan tanggal.
Paco Barter
Sebenarnya seperti yang dikatakan @PacoBarter, pengkodean satu-panas mengabaikan perbedaan jarak antar kategori. Ini tidak mudah diatasi karena fitur-fitur ini pada dasarnya adalah informasi fase, sementara sebagian besar model pembelajaran mesin tidak memiliki input jenis fase. Beberapa DIY pada metrik jarak mungkin dilakukan.
plpopk
0

Konteks Tanggapan saya : Sejauh ini sudah ada tanggapan yang luar biasa. Tapi, saya ingin memperluas percakapan dengan mengasumsikan Anda berbicara tentang aplikasi pembelajaran mesin untuk memprediksi nilai masa depan dari seri waktu tertentu ini. Dengan mengingat konteks itu, saran saya ada di bawah ini.

Saran : Pertama-tama perhatikan strategi peramalan statistik tradisional (mis. Penghalusan Eksponensial, SARIMAX atau Regresi Dinamis) sebagai dasar untuk kinerja prediksi. Meskipun pembelajaran mesin telah menunjukkan harapan besar untuk berbagai aplikasi, untuk deret waktu, ada metode statistik yang telah dicoba dan benar yang dapat membantu Anda lebih baik untuk aplikasi Anda. Saya akan menarik perhatian Anda pada dua artikel terbaru:

  1. Metode Peramalan Statistik dan Pembelajaran Mesin: Kekhawatiran dan Cara Maju oleh Spyros Makridakis et al. Artikel tersebut menunjukkan bahwa untuk banyak rangkaian waktu, analisis deret waktu statistik tradisional mengungguli model pembelajaran mesin (ML). Intinya, ML memiliki kecenderungan untuk mengenakan pakaian berlebih dan asumsi model ML mengenai entri independen dilanggar.
  2. Peramalan Sederhana vs. Kompleks: Bukti oleh Kesten C Green et al. Artikel ini membandingkan dan meneliti keluaran seri waktu dari artikel jurnal yang diulas sejawat, analisis deret waktu pelaporan dengan dan tanpa perbandingan dengan berbagai model. Sebagai kesimpulan, peneliti terlalu mempersulit analisis mereka dengan model yang lebih sulit untuk ditafsirkan dan memiliki kinerja yang lebih buruk. Umumnya, ini terjadi karena struktur insentif yang buruk.

Jika Anda mencari kinerja yang baik, pilih metrik untuk dibandingkan dengan beberapa model (mis. Seperti MASE) dan sapu beberapa statistik (referensi di bawah) dan model pembelajaran mesin (dengan strategi pengembangan fitur yang disebutkan di atas).

Tepuk tangan,

Sumber daya untuk Mempelajari Peramalan Statistik : Saya akan mulai dengan meninjau buku teks gratis oleh Rob J Hyndman di sini: https://otexts.org/fpp2/ . Teks ini didasarkan pada paket R yang dapat Anda gabungkan dengan mudah ke dalam analisis Anda: https://otexts.org/fpp2/appendix-using-r.html . Akhirnya, harap perhatikan perbedaan antara validasi silang cross sectional dan validasi seri waktu seperti yang dijelaskan di sini: https://robjhyndman.com/hyndsight/tscv/ .

jranisau
sumber