Scikit-learn: Implemente o validador cruzado WalkForward para dados de série temporal.

Criado em 15 jul. 2019  ·  23Comentários  ·  Fonte: scikit-learn/scikit-learn

Descrição


Implemente o cv walk forward para dados de série temporal com lacuna entre o conjunto de trens e o conjunto de teste.

resultados esperados


image

Expandindo
image

Needs Decision New Feature

Comentários muito úteis

Acho que adicionar uma validação cruzada de série temporal melhor está no escopo.

Todos 23 comentários

@saninstein Por que a lacuna?

@clstaudt gap é um recurso útil para avaliação de modelos em negociação de ações. Na previsão de preços, é um caso muito comum quando o modelo tem um desempenho muito bom nos dados logo após o conjunto de treinamento e se degrada com o tempo. Portanto, em alguns casos, pode ser útil pular uma pequena quantidade de dados "bons" que ocorreram após o conjunto de treinamento.

Acho que nossa posição usual sobre recursos relacionados a séries temporais é que está fora do escopo do sklearn (pelo menos por agora). E, para mim, faria sentido revisitar o assunto, uma vez que temos propriedades de amostra, como timestamp anexado aos dados.

Eu gostaria de ter pelo menos outra opinião de @ scikit-learn / core-devs sobre isso, mas meu voto é uma resolução "não consertarei" por enquanto.

@adrinjalali sklearn já tem muitos bons modelos para a série do tempo,

Quais?

@adrinjalali existe o TimeSeriesSplit que já foi implementado no sklearn :)

TimeSeriesSplit é o caso específico do WalkForwardCV proposto (pode ser obtido com gap=0, expanding=True args), na verdade TimeSeriesSplit pode ser facilmente substituído por WalkForwardCV (apenas defina os argumentos padrão como mencionei antes).

Faço parte da equipe de ML de negociação de ações e usamos com sucesso vários recursos do sklearn e bibliotecas compatíveis com o sklearn. Faltou um divisor de CV adequado e decidimos contribuí-lo de volta para o sklearn, mas se não for o caso, vamos usá-lo internamente :)

TimeSeriesSplit é o caso específico do WalkForwardCV proposto (pode ser alcançado com gap = 0, expansion = True args), na verdade TimeSeriesSplit pode ser facilmente substituído por WalkForwardCV (apenas defina os argumentos padrão como mencionei antes).

Justo, mas provavelmente tentaria corrigir TimeSeriesSplit de uma forma compatível com versões anteriores para adicionar o recurso de que você precisa. Isso também tem uma chance maior de ser aceito pela comunidade.

A previsão da série temporal não é o único caso para WalkForwardCV. É útil quando a observação do conjunto de dados é ordenada em tempo e a validação precisa ser feita da mesma maneira.

Por exemplo, uma de nossas tarefas é perder o problema de classificação de filtragem de negociações quando tentamos melhorar a estratégia de negociação existente com o modelo ml que "dará permissão" para negociar.


Justo, mas provavelmente tentaria corrigir o TimeSeriesSplit de uma forma compatível com versões anteriores para adicionar o recurso de que você precisa. Isso também tem uma chance maior de ser aceito pela comunidade.

Acredito que seria a melhor solução.

Sou um cientista de dados que trabalha com modelos de previsão de séries temporais. Presumi que coisas específicas de séries temporais estão fora do escopo do scikit-learn, então comecei a implementar meu próprio código de validação, um pouco diferente do método descrito neste tópico.

Mais tarde, soube da existência do TimeSeriesSplit e me perguntei se comecei a reinventar a roda. Eu preferiria contribuir com o código de validação para um projeto existente e estabelecido.

Como há claramente uma demanda por esse tipo de avaliação de modelo, ainda me pergunto onde ele se encaixa.

Existem muitos padrões necessários para a previsão de séries temporais. eu
pensaria, por exemplo, que o transformador criando características de wavelet
ser muito útil.

No entanto, eles estão fora do escopo do scikit-learn. Seria útil
para criar um pacote que implemente tudo isso de maneira consistente. Isto
provavelmente ganharia impulso.

Seria útil criar um pacote que implementasse tudo isso de maneira consistente. Provavelmente ganharia impulso.

sim. Me inscreva.

Ficaríamos felizes em ter esse pacote em https://github.com/scikit-learn-contrib/

Fechando este então :)

Acho que adicionar uma validação cruzada de série temporal melhor está no escopo.

veja também # 13666 # 13204 # 6322 # 13761

Quanto ao escopo, concordo com

Mas, como @amueller também aponta, realmente a conversa deve continuar nas solicitações pull existentes, movendo-as para um estado agradável.

Claro, mas desconfio dos casos em que o carimbo de data / hora real dos dados deve importar na divisão (o que deve ser feito pela IMO), e não a mera contagem das linhas. Não acho que vamos lidar com os carimbos de data / hora tão cedo, certo?

Nos 5 anos desde que propus isso pela primeira vez em https://github.com/scikit-learn/scikit-learn/issues/3202 , essa questão surgiu pelo menos 50 vezes em conversas de ensino ou aplicação. @saninstein , você decidiu se pressiona pela inclusão aqui ou -contrib? Eu adoraria ajudar se houver algo que você precise de ajuda para resolver o problema (em algum lugar).

Eu também gostaria de contribuir. Escrevi em outra edição sobre isso e gostaria de expandir o TimeSeriesSplit ou colaborar na criação de outro pacote para isso. Eu sinto que isso é algo relacionado a divisões no domínio do CV e deveria estar no sklearn.
Para ser honesto, estou completamente confuso sobre aonde ir e o que fazer agora que quero contribuir. Estou atento ao meu tempo e gostaria de usá-lo da maneira certa para a comunidade.

@mjbommar Acho que, como eu e @jnothman acima dissemos, estamos bastante abertos para seguir em frente e há alguns PRs saindo, em particular # 13761 e # 13204 e comentários sobre as duas APIs seriam muito apreciados.

Eu acho que # 13204 parece ser o mais maduro, então talvez ir de lá faça mais sentido? Não tenho certeza se @kykosic ainda está trabalhando nisso, devido ao atraso em nossa resposta.

Hm, embora # 13204 não implemente WalkForward ... Queremos mesclar # 13204 primeiro e, em seguida, implementar WalkForward depois?
Deve ser um objeto de currículo separado?

@amueller Eu tinha esquecido sobre # 13204 até que este post apareceu. Vou abordar os comentários sobre ele na próxima semana e ver se ele ainda se encaixa.

@kykosic incrível, obrigado!

Estou curioso para saber por que este problema foi encerrado porque # 13204 foi concluído. Achei que # 13204 fosse um pré-requisito para este.

13204 adicionou gap a TimeSeriesSplit que era o recurso solicitado por esta edição.

Esta página foi útil?
0 / 5 - 0 avaliações