Aprendizado de máquina - apresenta engenharia a partir de dados de data / hora

45

Quais são as práticas comuns / melhores para lidar com dados de tempos para aplicativos de aprendizado de máquina?

Por exemplo, se no conjunto de dados houver uma coluna com registro de data e hora do evento, como "05-05-2014", como você pode extrair recursos úteis dessa coluna, se houver?

Desde já, obrigado!

Igor Bobriakov
fonte

Respostas:

44

Começaria por representar graficamente a variável tempo versus outras variáveis ​​e procurar tendências.

Por exemplo

insira a descrição da imagem aqui

Nesse caso, há uma tendência semanal periódica e uma tendência ascendente de longo prazo. Então, você deseja codificar duas variáveis ​​de tempo:

  • day_of_week
  • absolute_time

Em geral

Existem vários prazos comuns em que as tendências ocorrem:

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

Procure tendências em tudo isso.

Tendências estranhas

Procure tendências estranhas também. Por exemplo, você pode ver tendências raras, mas persistentes, baseadas no tempo:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

Isso geralmente exige que você faça referência cruzada de seus dados a alguma fonte externa que mapeie eventos para o tempo.

Por que gráfico?

Há duas razões pelas quais acho que a representação gráfica é tão importante.

  • Tendências estranhas
    Embora as tendências gerais possam ser automatizadas com bastante facilidade (basta adicioná-las sempre), tendências estranhas geralmente exigem um olho humano e conhecimento do mundo para serem encontradas. Essa é uma das razões pelas quais os gráficos são tão importantes.

  • Erros de dados Com
    muita frequência, os dados apresentam erros sérios. Por exemplo, você pode achar que as datas foram codificadas em dois formatos e apenas um deles foi carregado corretamente no seu programa. Existem inúmeros problemas e eles são surpreendentemente comuns. Essa é a outra razão pela qual acho que a representação gráfica é importante, não apenas para séries temporais, mas para quaisquer dados.

Ben Haley
fonte
7

Divida os dados em janelas e encontre recursos para essas janelas, como coeficientes de autocorrelação, wavelets etc., e use esses recursos para aprender.

Por exemplo, se você tiver dados de temperatura e pressão, divida-os em parâmetros individuais e calcule recursos como o número de mínimos locais nessa janela e em outros e use esses recursos para o seu modelo.

Gurpreet Mohaar
fonte
7

Mais uma coisa a considerar, além de tudo o que Ben Haley disse, é converter para o horário local do usuário . Por exemplo, se você está tentando prever algo que ocorre por volta das 20h para todos os usuários, se você observar a hora UTC, será mais difícil prever.

Amir
fonte
6

Em vários casos, dados e eventos em uma série temporal são sazonais. Nesses casos, o mês e o ano do evento são muito importantes. Portanto, nesses cenários, você pode usar variáveis ​​binárias para representar se o evento ocorre durante um determinado mês / ano ou não.

espero que isso responda sua pergunta. Se não, por favor, seja um pouco mais específico sobre o que exatamente você está tentando alcançar

show_stopper
fonte
4

Como Ben e Nar explicaram muito bem, dividir o objeto de data e hora em intervalos de partes de data e hora ajudaria a detectar tendências sazonais, nas quais o objeto de data e hora completo (e geralmente ainda pior - único) iria perdê-lo

Você não mencionou nenhum algoritmo específico de aprendizado de máquina no qual está interessado, mas, caso também esteja interessado em cluster baseado em distância, como k-means, generalizaria o objeto de data e hora no formato unix-time . Isso permitiria uma comparação de distância numérica simples para o algoritmo, simplesmente indicando a que distância estão os valores de 2 datas.

No seu exemplo, generalizaria o valor somente de data 05/05/2014 para 1399248000 (a hora unix que representa o início de 5 de maio de 2014, UTC).

[Alguém poderia argumentar que você pode conseguir isso juntando a data e hora em todas as partes possíveis da data e hora ... mas isso aumentaria significativamente as dimensões do conjunto de dados. Então, sugiro combinar a hora unix, para medir a distância e alguns dos intervalos de data e hora]

mork
fonte
3

Ben está falando sobre os recursos estáticos e faz uso dos recursos de carimbo de data / hora.

Como extensão, apresentarei os recursos de lag , não estou falando das séries temporais brutas, mas dos agregados.

A parte mais mística é que o valor futuro não é visto por nós, como podemos usar esses recursos agregados nos dados de treinamento?

Um pequeno exemplo: existem dados anuais sobre o consumo de eletricidade de 1991 a 2015, quero prever o consumo de eletricidade nos próximos 5 anos, de 2016 a 2020. Vou calcular a média móvel dos últimos 5 anos do consumo de energia elétrica conforme os valores de recursos de 2020, mas o período de 2016 a 2020 é desconhecido para nós; portanto, liderando (em frente ao atraso) a série temporal de cinco anos, vamos fazer a média móvel de 2010 a 2015 e, em seguida, usar esse valor como valores de recursos de 2020. Assim, podemos construir os dados dos próximos 5 anos.

O próximo passo é apenas usar a função de movimento (count \ mean \ median \ min \ max.etc) e tentar janelas diferentes, e você construirá muitos recursos!

wolfe
fonte
2

Dependendo do seu interesse com as informações de data / hora, convém apenas lixá-las. Por exemplo, se você estiver interessado na distância de um ponto de partida (1 de janeiro de 2015) e quiser medi-lo em meses, eu o codificaria como mês 1 (de 1 a 31 de janeiro de 2015), 2 (1 a 28 de fevereiro de 2015), 3, 4, 5, 6, etc. Como a distância entre as datas de início é aproximadamente a mesma, isso representa a distância do tempo em um formato contínuo direto. E digo contínuo porque você pode dizer o mês 6,5 e sabe que está na metade de junho de 2015. Então você não precisa se preocupar com a codificação da data real e pode usar todos os seus métodos típicos de classificação.

Se você deseja medir em dias, sei que o MySQL tem uma função 'to_days', se você usar isso para extrair dados antes da classificação. O Python provavelmente tem algo semelhante, ou use o formato de tempo unix sugerido por mork.

Espero que isto ajude!

pmp
fonte
1

Plote gráficos com diferentes variações de tempo em relação à variável de resultado para ver seu impacto. Você pode usar mês, dia, ano como recursos separados e, como o mês é uma variável categórica, tente um gráfico de caixa / bigode e veja se há algum padrão. Para variáveis ​​numéricas, você pode usar um gráfico de dispersão.

RAM
fonte
1

Não sei se essa é uma prática comum / melhor, mas é outro ponto de vista do assunto.

Se você tem, digamos, uma data, pode tratar cada campo como uma "variável de categoria" em vez de uma "variável contínua". O dia teria um valor no conjunto {1, 2 ..., 31}, o mês teria um valor em {1, ..., 12} e, para o ano, você escolheria um valor mínimo e um valor máximo e construa um conjunto.

Então, como os valores numéricos específicos de dias, meses e anos podem não ser úteis para encontrar tendências nos dados, use uma representação binária para codificar os valores numéricos, sendo cada bit um recurso. Por exemplo, o mês 5 seria 0 0 0 0 1 0 0 0 0 0 0 0(11 0 e a 1 na 5ª posição, cada bit sendo um recurso).

Assim, tendo, por exemplo, 10 anos no "conjunto do ano", uma data seria transformada em um vetor de 43 elementos (= 31 + 12 + 10). Usando "vetores esparsos", a quantidade de recursos não deve ser um problema.

Algo semelhante poderia ser feito para dados de horas, dia da semana, dia do mês ...

Tudo depende da pergunta que você deseja que seu modelo de aprendizado de máquina responda.

Paco Barter
fonte
Isso falha em capturar relacionamentos que provavelmente existem, como os dias 14 e 15 do mês, são "semelhantes". Na medida em que você acredita que todos os dias são literalmente diferentes, também acredita que a previsão para amanhã não é possível. Também não é necessário codificar categorias quentes, não necessariamente.
Sean Owen
Não vejo por que falha ao capturar a "proximidade" de datas próximas. Se você, por exemplo, alimentar o vetor binário com um NN, ele descobrirá por si próprio após o treinamento adequado. O uso de vetores binários é apenas uma maneira de representar categorias.
Paco Barter
Nesse caso, você efetivamente possui colunas como "is_12th" e "is_13th", que são, no espaço de entrada, não relacionadas e não relacionadas a "is_1st" etc. em certo sentido, mais perto do que o 1º e o 12º são. Você está apelando para o que um modelo pode inferir, mas estou falando sobre o que os recursos de entrada codificam.
Sean Owen
OK eu vejo. Você está certo, um recurso contínuo captura melhor a qualidade da "proximidade" das datas. O que quero dizer é que pode haver tendências nos dados para quais valores numéricos de datas são irrelevantes (por exemplo, um certo padrão de compra de clientes apenas aos sábados). Daí oferecer outro ponto de vista para lidar com datas.
Paco Barter 03/03
Na realidade, como disse o @PacoBarter, a codificação de um ponto a ponto ignora a distância diferente entre as categorias. Isso não é tão fácil de resolver, pois esses recursos são intrinsecamente informações de fase, enquanto a maioria dos modelos de aprendizado de máquina não possui entrada de tipo de fase. Alguns DIY sobre métricas à distância podem ser úteis.
plpopk 19/03
0

Contexto da minha resposta : Houve ótimas respostas até agora. Porém, quero estender a conversa supondo que você esteja falando sobre um aplicativo de aprendizado de máquina para prever valores futuros dessa série temporal específica. Com esse contexto em mente, meu conselho está abaixo.

Conselho : Examine primeiro as estratégias tradicionais de previsão estatística (por exemplo, suavização exponencial, SARIMAX ou regressão dinâmica) como uma linha de base para o desempenho da previsão. Embora o aprendizado de máquina tenha mostrado grande promessa para uma variedade de aplicações, para séries temporais, existem métodos estatísticos experimentados e verdadeiros que podem atendê-lo melhor para sua aplicação. Gostaria de chamar sua atenção para dois artigos recentes:

  1. Métodos de previsão estatística e de aprendizado de máquina: preocupações e caminhos a seguir por Spyros Makridakis et al. O artigo destaca que, para muitas séries temporais, a análise estatística tradicional de séries temporais supera os modelos de aprendizado de máquina (ML). Em essência, o ML tem tendência a superestimar e qualquer suposição do modelo de ML referente a entradas independentes é violada.
  2. Previsão simples versus complexa: as evidências de Kesten C Green et al. O artigo compara e examina a produção de séries temporais de artigos de periódicos revisados ​​por pares que relatam análises de séries temporais com e sem comparações com uma variedade de modelos. Em conclusão, os pesquisadores complicam demais suas análises com modelos mais difíceis de interpretar e com pior desempenho. Geralmente, isso ocorre devido a estruturas de incentivos ruins.

Se você está procurando um bom desempenho, escolha uma métrica para comparar com vários modelos (como o MASE) e varra vários modelos estatísticos (referências abaixo) e de aprendizado de máquina (com estratégias de desenvolvimento de recursos mencionadas acima).

Felicidades,

Recursos para aprender previsão estatística : Eu começaria revisando o livro de Rob J Hyndman aqui: https://otexts.org/fpp2/ . O texto é baseado em um pacote R que você pode incorporar facilmente em sua análise: https://otexts.org/fpp2/appendix-using-r.html . Por fim, esteja ciente da diferença entre a validação cruzada transversal e a validação cruzada de séries temporais, conforme explicado aqui: https://robjhyndman.com/hyndsight/tscv/ .

jranisau
fonte