Funzioni di codifica come mese e ora come categoriali o numeriche?


23

È meglio codificare funzioni come il mese e l'ora come fattore o numerico in un modello di apprendimento automatico?

Da un lato, ritengo che la codifica numerica potrebbe essere ragionevole, perché il tempo è un processo che avanza in avanti (il quinto mese è seguito dal sesto mese), ma dall'altro lato penso che la codifica categoriale potrebbe essere più ragionevole a causa della natura ciclica di anni e giorni (il 12 ° mese è seguito dal primo).

Esiste una soluzione generale o una convenzione per questo?


Ho riscontrato lo stesso problema nel definire la variabile dell'ora del giorno (da 1 a 24) nel modello RF. Se converto la variabile come categorica, la funzione VarImp mostra il valore di importanza per ogni ora e sembra molto disorganizzata. Mi chiedo solo che sia necessario convertire la variabile numerica del tipo "ora del giorno" in categoriale?
Mahmudur Rahman,

Risposte:


19

Hai preso in considerazione l'aggiunta della trasformazione (seno, coseno) della variabile ora del giorno? Ciò assicurerà che le 0 e le 23 ore, ad esempio, siano vicine tra loro, permettendo così alla natura ciclica della variabile di brillare.

( Ulteriori informazioni )


tipo di problema con questo perché se lo faccio: sin (pi * X / 24) dove X in [0, 23] abbiamo la stessa valutazione per 6 am e 6 pm di sin (pi * 6/24) == sin (pi * 18/24). ma queste sono ore totalmente diverse
Eran Moshe,

Può fare il ciclo in questo modo: sin (pi * X / 12). Grazie Eran:]
Eran Moshe,

@EranMoshe Fyi nel post dal link sopra usano invece un fattore 2 * pi, quindi sarebbe peccato (2 * pi * X / 12) - danno alcuni ragionamenti per questo nei commenti
tsando

Ed è (2 * pi X / 24) che è (pi X / 12):] Come vedi ho lottato con lo stesso identico problema l'autore di blog.davidkaleko.com/feature-engineering-cyclical-features.html è stato lottato con. E nei commenti puoi vedere "Mariel G" che lo corregge esattamente come ho capito: pi * X / 12 circolerà per l'ora del giorno. Ciò che vengo anche a sapere è che devi prendere le componenti cos e sin di questo per definire un vero periodo di 24 ore! (hai bisogno di un vero cerchio, e non solo di una funzione periodica)
Eran Moshe,

@EranMoshe ah sì, se vuoi farlo per ore, allora può essere ridotto a piX / 12, ma se vuoi fare mesi, allora sarebbe 2piX / 12, cioè pi / 6. Quindi in generale sarebbe 2piX / periodo
tsando

9

La risposta dipende dal tipo di relazioni che si desidera rappresentare tra la funzione tempo e la variabile target.

Se si codifica il tempo come numerico, si stanno imponendo alcune restrizioni sul modello. Per un modello di regressione lineare, l'effetto del tempo è ora monotonico, o il bersaglio aumenterà o diminuirà con il tempo. Per gli alberi decisionali, i valori temporali vicini l'uno all'altro saranno raggruppati insieme.

La codifica del tempo come categoriale offre al modello una maggiore flessibilità, ma in alcuni casi il modello potrebbe non disporre di dati sufficienti per apprendere bene. Una tecnica che può essere utile è quella di raggruppare i valori temporali in un certo numero di insiemi e utilizzare l'insieme come attributo categoriale.

Alcuni raggruppamenti di esempio:

  • Per mese, raggruppare in quarti o stagioni, a seconda del caso d'uso. Ad esempio: gennaio-marzo, aprile-giugno, ecc.
  • Per l'ora del giorno, raggruppa in secchi dell'ora del giorno: mattina, sera, ecc.
  • Per il giorno della settimana, raggruppa in giorno della settimana, fine settimana.

Ognuno dei precedenti può anche essere usato direttamente come attributo categoriale, dati sufficienti. Inoltre, i raggruppamenti possono anche essere scoperti mediante analisi dei dati, a complemento di un approccio basato sulla conoscenza del dominio.


4

Consiglio di utilizzare le funzioni numeriche. L'uso delle funzionalità categoriali significa essenzialmente che non consideri rilevante la distanza tra due categorie (ad es. La categoria 1 è vicina alla categoria 2 quanto alla categoria 3). Questo non è sicuramente il caso per ore o mesi.

Tuttavia, il problema che sollevi è che vuoi rappresentare ore e mesi in un modo in cui 12 è vicino a 11 come a 1. Per ottenere ciò, ti consiglio di seguire ciò che è stato suggerito nei commenti e di utilizzare una funzione seno / coseno prima di usare le ore / i mesi come caratteristiche numeriche.


3

Dipende dall'algoritmo che stai usando.

Se stai usando algoritmi basati su alberi come la foresta casuale, basta passare questa domanda. La codifica categorica non è necessaria per gli algoritmi basati su alberi.

Per altri algoritmi come la rete neurale, suggerisco di provare entrambi i metodi (continui e categorici). L'effetto differisce tra diverse situazioni.


Dipende dall'implementazione basata su alberi. Pacchetti ampiamente usati come scikit-learn e xgboost non riconoscono le variabili categoriali. Ci si aspetta che li codifichi a uno.
Ricardo Cruz,

Da questo post: versodatascience.com/… non dovresti usarne uno caldo per nulla in base agli alberi delle decisioni, che è praticamente quello che sto scoprendo nel modo più duro.
Ashley,

1

Dato che tutti i dati che hai sono ben definiti, ti suggerirei una codifica categorica, che è anche più facile da applicare.


1

Per riformulare la risposta fornita da @raghu . Una delle principali differenze tra le caratteristiche categoriche e numeriche è se l'entità dei numeri è comparabile, ovvero se il 2019 è più grande del 2018 o dicembre (12) più grande di marzo (3)? Non proprio. Mentre c'è un ordine sequenziale in questi numeri, la loro grandezza non è comparabile. Pertanto, trasformarsi in un valore categorico può avere più senso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.