Modelagem Bayesiana para o Ridership da Ford GoBike com PyMC3 – Parte I

Jay Franck Blocked Desbloquear Seguir Seguindo 13 de janeiro Foto por Andrew Gook em Unsplash

As ações de bicicletas são uma grande parte da equação de transporte para cidades ao redor do mundo. Em San Francisco, um dos principais participantes do jogo de compartilhamento de bicicletas é a Ford, com seu programa GoBike. Convenientemente, eles gentilmente liberam seus dados para pessoas como eu estudarem. Gostaria de saber se é possível prever facilmente o número de passageiros do dia seguinte para garantir que bicicletas suficientes estejam disponíveis para os passageiros, com base em informações anteriores?

Esta seria uma tarefa bastante trivial para concluir se eu usasse o sklearn para construir um modelo de regressão linear. Muitas vezes, encontro-me à procura de conjuntos de dados para aprender uma nova ferramenta ou habilidade em Machine Learning. Eu tenho tentado encontrar uma desculpa para experimentar um dos pacotes de programação probabilística (como o PyStan ou o PyMC3) há anos, e esses dados de compartilhamento de bicicletas pareciam um ótimo ajuste.

Várias empresas estão considerando a inferência bayesiana para seus modelos preditivos internos. À medida que o custo computacional diminui, o tempo de treinamento notoriamente longo para esses sistemas diminui. Notavelmente, o Uber lançou o Pyro , uma estrutura de código aberto que pode parecer bastante flexível e fácil de usar. Quantopian é um usuário freqüente do PyMC3. Booz Allen Hamilton e GoDaddy são duas outras empresas que eu conheço e que estão buscando esses tipos de modelos de ML.

Neste post eu construí um exemplo simples que espero ser instrutivo para um iniciante do PyMC3. Fiz o download dos dados do GoBike de 2017 a setembro de 2018. Agrupei os dados diariamente para reunir informações sobre os detalhes da viagem (por exemplo, idade média, associação à assinatura), a duração de suas viagens e o número de pilotos totais.

O problema com essas ferramentas de ML Bayesianas é que elas podem levar muito tempo para treinar, especialmente em dados massivos. Para este conjunto de dados agregado, tenho apenas 100 s de linhas, o que é facilmente treinável em um laptop. Depois de uma pequena pesquisa, decidi aprender o PyMC3 como meu pacote de escolha. Parece que tem vários ótimos tutoriais, uma comunidade vibrante e um framework bastante fácil de usar.

Eu inicio este exemplo ilustrativo escalando os dados com um RobustScaler e plotando o mapa de calor de correlação sea para ver se há algum padrão que nosso modelo possa aprender. Estamos tentando prever o valor de nextDay. A partir do mapa de calor, podemos ver algumas relações simples entre variáveis,
ambos positivos ( scaled_total_riders ) e negativos ( scaled_duration_hrs ).

Vamos fazer uma previsão ingênua e usar isso como uma linha de base. Qual seria o RMSE se pegássemos o número médio de passageiros diários e o usássemos como nossa previsão? Nós esperamos estar fora por aproximadamente 1900 cavaleiros por dia tomando esta aproximação fácil.

Um modelo linear com sklearn apresenta um desempenho um pouco melhor no RMSE e é bastante fácil de implementar. O modelo é uma série de pesos para cada variável em nossos dados, além de uma interceptação. Como interpretamos a confiança que nosso modelo tem em cada um desses parâmetros individuais?

Pode ser onde a magia bayesiana realmente brilha. Sem dúvida, é preciso mais linhas de código, mais pensamento e mais tempo de treinamento do que o exemplo acima. Eu prometo a você, caro leitor, que tudo pode valer a pena.

Primeiro, PyMC3 é executado em Theano sob o capô. Temos que fazer algumas pequenas mudanças em nossos dados de pandas / numpy, e a mudança mais importante é a configuração de um tensor compartilhado, como segue.

Quando olhamos para fazer previsões para o nosso modelo, podemos trocar o X_train pelo X_test e usar o mesmo nome da variável.

Agora que temos nossos dados configurados, precisamos construir nosso modelo, que inicializamos chamando pm.Model (). Dentro desse contexto de modelo, precisamos construir nosso conjunto completo de suposições sobre nossas prioridades (parâmetros) e saída. Distribuições normais (gaussianas) são apostas razoavelmente seguras para o seu primeiro modelo.

Isso constitui nossa especificação de modelo. Agora temos que aprender qual seria a distribuição posterior dos pesos do nosso modelo. Ao contrário de sklearn, os coeficientes são agora uma distribuição de valores, não um único ponto. Nós experimentamos uma série de possíveis pesos, e os coeficientes que parecem se ajustar bem aos nossos dados são retidos em algo chamado rastreamento . As funções de amostragem (NUTS, Metropolis, et al. ) Estão bem além do escopo deste post, mas existem vastos repositórios de conhecimento descrevendo-os. Aqui nós construímos nosso traço a partir do nosso modelo:

O amostrador NUTS reclama que usar o find_MAP () não é uma boa ideia, mas freqüentemente isso é usado em tutoriais e não parece prejudicar meu desempenho.

Também podemos tentar um sampler diferente que tente aproximar as distribuições posteriores:

O traço pode ser plotado e geralmente se parece com isso. Os parâmetros beta parecem bastante restritos na distribuição (gráficos à esquerda) e parecem ser razoavelmente consistentes nos últimos 1000 itens amostrados em nosso traço (gráfico à direita). O parâmetro alfa parece menos certo.

Agora que temos nossas amostras posteriores, podemos fazer algumas previsões. Geralmente, observamos um período chamado 'burn in' em PyMC3, onde descartamos as primeiras mil amostras de nosso rastreio ( trace [1000:] ), pois esses valores podem não ter convergido. Nós extraímos 1000 pesos de amostra desse traço, calculamos quais seriam as previsões e tomamos a média desse valor como nossa previsão mais provável para esse ponto de dados. A partir daqui, simplesmente calculamos o RMSE.

Se quisermos testar no nosso conjunto de dados de validação:

Portanto, esse modelo que construímos funciona melhor do que nossa abordagem ingênua (número médio de passageiros), mas um pouco pior do que o nosso modelo sklearn. Em um exemplo incluído no repositório do Github, consegui criar um modelo semelhante que superou o modelo sklearn, dimensionando o valor Y e modelando-o como uma variável normalmente distribuída.

Um ajuste adicional dos parâmetros do modelo, usando escalonamentos diferentes, assumindo uma faixa mais ampla de possíveis parâmetros beta, pode ser empregado para reduzir o RMSE deste exemplo. O objetivo deste post é apresentar os fundamentos do desenvolvimento de modelos e fornecer um exemplo editável com o qual você pode brincar e aprender! Encorajo-vos a fornecer feedback na seção de comentários abaixo.

Para recapitular, há um preço a pagar pelos modelos bayesianos. Certamente leva mais tempo para implementar e escrever um modelo. Requer algum conhecimento prévio sobre estatísticas Bayesianas. O tempo de treinamento é maior que o uso de sklearn. No entanto, ferramentas como o PyMC3 podem oferecer maior controle, compreensão e valorização de seus dados e dos artefatos do modelo.

Embora existam vários bons tutoriais no PyMC3 (incluindo sua página de documentação ), o melhor recurso que encontrei foi um vídeo de Nicole Carlson. Explora como um cientista de dados familiarizado com o sklearn construiria um modelo PyMC3. Leitores cuidadosos encontrarão numerosos exemplos que eu adotei daquele vídeo. Eu também aprendi muito com Programação Probabilística e Métodos Bayesianos para Hackers , que é um tutorial baseado em notebooks grátis sobre modelos bayesianos práticos usando PyMC3. Esses dois recursos são absolutamente incríveis. Duke também tem um site de exemplo que tem inúmeras situações de dados que achei informativas. Rumo à Data Science também recebeu uma série de posts interessantes durante o ano que se concentraram na análise bayesiana e ajudaram a inspirar este post.

Na próxima postagem do blog, ilustrarei como criar um Modelo Linear Hierárquico (HLM) que melhorará muito o desempenho de nossa abordagem inicial. Abaixo está um kernel Kaggle que você pode bifurcar e um repositório Github que você pode clonar para brincar com os dados e desenvolver seus próprios modelos PyMC3 com. Obrigado pela leitura!

DayByDayPredictions | Kaggle
Editar descrição www.kaggle.com

Github Repo

Texto original em inglês.