Codificando recursos como mês e hora como categoriais ou numéricos?

23

É melhor codificar recursos como mês e hora como fator ou numérico em um modelo de aprendizado de máquina?

Por um lado, acho que a codificação numérica pode ser razoável, porque o tempo é um processo progressivo (o quinto mês é seguido pelo sexto mês), mas, por outro lado, acho que a codificação categorial pode ser mais razoável por causa da natureza cíclica de anos e dias (o 12º mês é seguido pelo primeiro).

Existe uma solução ou convenção geral para isso?

Julian
fonte
Eu enfrentei o mesmo problema ao definir a variável hora do dia (1 a 24) no modelo de RF. Se eu converter a variável como categórica, a função VarImp mostrará um valor de importância para cada hora e ela parecerá muito desorganizada. Estou apenas pensando que é necessário converter a variável numérica do tipo 'hora do dia' para categórica?
Mahmudur Rahman

Respostas:

19

Você considerou adicionar a transformação (seno, cosseno) da variável hora do dia? Isso garantirá que as 0 e as 23 horas, por exemplo, estejam próximas uma da outra, permitindo assim que a natureza cíclica da variável brilhe.

( Mais informações )

Pablo O
fonte
tipo de ter problema com isso, porque se eu fizer: sin (pi * X / 24) onde X em [0, 23], temos a mesma avaliação para 6:00 e 6:00 como sin (pi * 6/24) == sin (pi * 18/24). mas estes são totalmente diferentes horas
Eran Moshe
Pode fazer o ciclo assim: sin (pi * X / 12). Obrigado Eran:]
Eran Moshe
@EranMoshe fyi no post do link acima, eles usam um fator de 2 * pi em vez disso, então seria pecado (2 * pi * X / 12) - eles dão algum motivo para isso nos comentários
tsando
E é (2 * pi X / 24) que é (pi X / 12):] Como você vê, lutei com exatamente o mesmo problema que o autor de blog.davidkaleko.com/feature-engineering-cyclical-features.html foi lutado com. E nos comentários, você pode ver "Mariel G" corrigindo-o exatamente como eu percebi: pi * X / 12 circulará por uma hora do dia. O que também aprendi é que você deve usar os componentes cos e sin para definir um verdadeiro período de 24 horas! (você precisa de um círculo de verdade, e não a apenas uma função periódica)
Eran Moshe
@EranMoshe ah sim, se você quiser fazer horas, ele pode ser reduzido para piX / 12, mas se você quiser fazer meses, seria 2piX / 12, ou seja, pi / 6. Então, em geral, seria 2piX / período #
tsando
9

A resposta depende do tipo de relacionamento que você deseja representar entre o recurso de horário e a variável de destino.

Se você codificar o tempo como numérico, estará impondo certas restrições ao modelo. Para um modelo de regressão linear, o efeito do tempo agora é monotônico, ou o alvo aumentará ou diminuirá com o tempo. Para árvores de decisão, os valores de tempo próximos um do outro serão agrupados.

Codificar o tempo como categórico oferece ao modelo mais flexibilidade, mas em alguns casos, o modelo pode não ter dados suficientes para aprender bem. Uma técnica que pode ser útil é agrupar valores de tempo em algum número de conjuntos e usar o conjunto como um atributo categórico.

Alguns exemplos de agrupamentos:

  • Por mês, agrupe em trimestres ou temporadas, dependendo do caso de uso. Por exemplo: Jan-Mar, Abr-Jun, etc.
  • Para a hora do dia, agrupe em baldes da hora do dia: manhã, noite, etc,
  • Para o dia da semana, agrupe em dia da semana, fim de semana.

Cada uma das opções acima também pode ser usada diretamente como um atributo categórico, com dados suficientes. Além disso, os agrupamentos também podem ser descobertos por análise de dados, para complementar uma abordagem baseada no conhecimento do domínio.

raghu
fonte
4

Eu recomendo usar recursos numéricos. O uso de recursos categóricos significa essencialmente que você não considera a distância entre duas categorias como relevante (por exemplo, a categoria 1 é tão próxima à categoria 2 quanto à categoria 3). Definitivamente, esse não é o caso por horas ou meses.

No entanto, a questão que você levanta é que deseja representar horas e meses de uma maneira em que 12 seja o mais próximo de 11 e o de 1. Para conseguir isso, recomendo seguir o que foi sugerido nos comentários e usar uma função seno / cosseno antes de usar as horas / meses como recursos numéricos.

Tanguy Coatalem
fonte
3

Depende do algoritmo que você está usando.

Se você estiver usando algoritmos baseados em árvore, como floresta aleatória, basta passar esta pergunta. A codificação categórica não é necessária para algoritmos baseados em árvore.

Para outros algoritmos como a rede neural, sugiro tentar os dois métodos (contínuo e categórico). O efeito difere entre diferentes situações.

Lâmina gelada
fonte
Depende da implementação baseada em árvore. Pacotes amplamente utilizados, como o scikit-learn e o xgboost, não reconhecem variáveis ​​categóricas. Você deve codificá-los um a um.
Ricardo Cruz
Neste post: direçãodatascience.com/…, você não deve usar um hot para nada baseado em árvores de decisão, que é praticamente o que estou descobrindo da maneira mais difícil.
ashley
1

Como todos os dados que você possui estão bem definidos, sugiro uma codificação categórica, que também é mais fácil de aplicar.

simonepi
fonte
1

Para reformular a resposta fornecida por @raghu . Uma grande diferença entre as características categóricas e numéricas é se a magnitude dos números é comparável, ou seja, 2019 é maior que 2018 ou dezembro (12) maior que março (3)? Na verdade não. Embora exista uma ordem seqüencial nesses números, sua magnitude não é comparável. Assim, transformar em um valor categórico pode fazer mais sentido.

CathyQian
fonte