Fitur pengkodean seperti bulan dan jam sebagai kategori atau numerik?

23

Apakah lebih baik untuk menyandikan fitur seperti bulan dan jam sebagai faktor atau angka dalam model pembelajaran mesin?

Di satu sisi, saya merasa pengkodean numerik mungkin masuk akal, karena waktu adalah proses maju maju (bulan kelima diikuti oleh bulan keenam), tetapi di sisi lain saya pikir pengkodean kategororial mungkin lebih masuk akal karena sifat sikliknya tahun dan hari (bulan ke-12 diikuti oleh yang pertama).

Apakah ada solusi atau konvensi umum untuk ini?

Julian
sumber
Saya menghadapi masalah yang sama dalam mendefinisikan jam dalam sehari (1 hingga 24) variabel dalam model RF. Jika saya mengonversi variabel sebagai kategorikal, fungsi VarImp menunjukkan nilai penting untuk setiap jam dan tampilannya sangat tidak teratur. Saya hanya ingin tahu apakah perlunya mengubah variabel numerik tipe 'hour of the day' menjadi kategori?
Mahmudur Rahman

Jawaban:

19

Sudahkah Anda mempertimbangkan untuk menambahkan transformasi (sinus, kosinus) variabel waktu hari? Ini akan memastikan bahwa 0 dan 23 jam misalnya dekat satu sama lain, sehingga memungkinkan sifat siklus variabel untuk bersinar.

( Info Lebih Lanjut )

Pablo O
sumber
agak memiliki masalah dengan ini karena jika saya lakukan: sin (pi * X / 24) di mana X di [0, 23] kita memiliki evaluasi yang sama untuk 6 pagi dan 6 sore sebagai dosa (pi * 6/24) == sin (pi * 18/24). tetapi ini adalah jam yang sama sekali berbeda
Eran Moshe
Dapat melakukan siklus seperti ini: sin (pi * X / 12). Terima kasih Eran:]
Eran Moshe
@EranMoshe fyi di pos dari tautan di atas mereka menggunakan faktor 2 * pi sebagai gantinya, jadi itu akan menjadi dosa (2 * pi * X / 12) - mereka memberikan beberapa alasan untuk ini dalam komentar
tsando
Dan (2 * pi X / 24) yaitu (pi X / 12):] Seperti yang Anda lihat saya telah berjuang dengan masalah yang sama persis penulis blog.davidkaleko.com/feature-engineering-cyclical-features.html telah berjuang dengan. Dan dalam komentar Anda dapat melihat "Mariel G" mengoreksinya persis seperti yang saya sadari: pi * X / 12 akan beredar selama satu jam sehari. Apa yang saya juga pelajari adalah bahwa Anda harus mengambil komponen cos dan sin untuk mendefinisikan periode 24 jam yang sebenarnya! (Anda membutuhkan lingkaran sejati, dan bukan hanya fungsi periodik)
Eran Moshe
@EranMoshe ah ya, jika Anda ingin melakukan lebih dari jam maka dapat dikurangi menjadi piX / 12, tetapi jika Anda ingin melakukan bulan, maka itu akan menjadi 2piX / 12 yaitu pi / 6. Jadi secara umum akan menjadi 2piX / periode
tsando
9

Jawabannya tergantung pada jenis hubungan yang ingin Anda wakili antara fitur waktu, dan variabel target.

Jika Anda menyandikan waktu sebagai angka, maka Anda menerapkan batasan tertentu pada model. Untuk model regresi linier, efek waktu sekarang monotonik, baik targetnya akan bertambah atau berkurang seiring waktu. Untuk pohon keputusan, nilai waktu yang berdekatan satu sama lain akan dikelompokkan bersama.

Pengkodean waktu sebagai kategori memberikan model lebih banyak fleksibilitas, tetapi dalam beberapa kasus, model mungkin tidak memiliki cukup data untuk belajar dengan baik. Salah satu teknik yang mungkin berguna adalah mengelompokkan nilai-nilai waktu bersama menjadi beberapa set, dan menggunakan set sebagai atribut kategorikal.

Beberapa contoh pengelompokan:

  • Untuk bulan, kelompokkan ke kuartal atau musim, tergantung pada kasus penggunaan. Misalnya: Jan-Mar, Apr-Jun, dll.
  • Untuk jam sehari, kelompokkan ke ember waktu: pagi, malam, dll,
  • Untuk hari-minggu, kelompok ke hari kerja, akhir pekan.

Masing-masing di atas juga dapat digunakan secara langsung sebagai atribut kategori juga, mengingat data yang cukup. Selanjutnya, pengelompokan juga dapat ditemukan dengan analisis data, untuk melengkapi pendekatan berbasis pengetahuan domain.

raghu
sumber
4

Saya sarankan menggunakan fitur numerik. Menggunakan fitur-fitur kategorikal pada dasarnya berarti Anda tidak menganggap jarak antara dua kategori sebagai relevan (misalnya kategori 1 sedekat dengan kategori 2 seperti halnya dengan kategori 3). Ini jelas tidak terjadi berjam-jam atau berbulan-bulan.

Namun, masalah yang Anda ajukan adalah bahwa Anda ingin merepresentasikan jam dan bulan dengan cara di mana 12 mendekati 11 dibandingkan dengan 1. Untuk mencapai itu, saya sarankan pergi dengan apa yang disarankan dalam komentar dan menggunakan fungsi sinus / kosinus sebelum menggunakan jam / bulan sebagai fitur numerik.

Tanguy Coatalem
sumber
3

Itu tergantung pada algoritma yang Anda gunakan.

Jika Anda menggunakan algoritma berbasis pohon seperti hutan acak, cukup ajukan pertanyaan ini. Pengkodean kategorikal tidak diperlukan untuk algoritma berbasis pohon.

Untuk algoritma lain seperti jaringan saraf, saya sarankan mencoba kedua metode (kontinu & kategorikal). Efeknya berbeda antara situasi yang berbeda.

Icyblade
sumber
Itu tergantung pada implementasi berbasis pohon. Paket yang banyak digunakan seperti scikit-learn dan xgboost tidak mengenali variabel kategori. Anda diharapkan melakukan satu kali hot encoding.
Ricardo Cruz
Dari posting ini: menujudatascience.com/... Anda tidak boleh menggunakan satu hot untuk apa pun berdasarkan pohon keputusan, yang cukup banyak apa yang saya temukan dengan cara yang sulit.
ashley
1

Karena semua data yang Anda miliki terdefinisi dengan baik, saya sarankan Anda melakukan pengkodean kategoris, yang juga lebih mudah diterapkan.

simonepi
sumber
1

Untuk mengulangi jawaban yang diberikan oleh @raghu . Salah satu perbedaan utama antara fitur kategorikal dan fitur numerik adalah apakah besarnya angka-angka tersebut sebanding, yaitu apakah 2019 lebih besar dari 2018, atau Desember (12) lebih besar dari Maret (3)? Tidak juga. Meskipun ada urutan berurutan dalam angka-angka ini, besarnya tidak sebanding. Jadi, mentransformasikannya menjadi nilai kategorikal mungkin lebih masuk akal.

CathyQian
sumber