Séries temporais clássicas versus métodos de aprendizado de máquina

Um tutorial comparando métodos de previsão em Python

Fergus O'Boyle em Rumo à Ciência dos Dados Seguir no dia 9 de julho · 10 min ler Foto de Parij Borgohain em Unsplash

Em um artigo anterior , discuti o uso do aprendizado de máquina supervisionado para prever uma métrica da pobreza usando mais de 1.000 Indicadores de Desenvolvimento Mundial (WDIs). Neste artigo, usarei o mesmo conjunto de dados para comparar o laço com um método clássico de séries temporais (suavização exponencial) e alguns outros métodos de aprendizado de máquina, como floresta aleatória e XGBoost).

No final, o XGBoost foi, de longe, o melhor intérprete. O XGBoost pode manipular dados de entrada esparsos e, curiosamente, a melhor pontuação por uma grande margem foi obtida quando nenhuma tentativa de imputar valores ausentes nos dados de entrada foi feita. Mais sobre tudo isso mais adiante no artigo.

O problema, como discutido no artigo anterior, teve vários desafios:

  • Mais de 60% dos dados do WDI estavam faltando.
  • O número de recursos superava em muito o número de observações. Os WDIs são medidos anualmente e a maioria tem uma história entre apenas 20 e 40 anos.
  • Registros históricos descontínuos de nossa métrica da pobreza que estamos tentando prever (veja o primeiro gráfico abaixo)

No artigo anterior, vários métodos de regressão linear foram comparados com um previsor ingênuo. A regressão do laço realizou o melhor do lote. Eu especulava que o laço se dava tão bem por causa de sua tendência a produzir um modelo com muito menos variância em comparação com um modelo de Mínimos Quadrados Ordinários (MQO). Em segundo lugar, em comparação com a regressão de cumes, de acordo com An Introduction to Statistical Learning :

Em geral, pode-se esperar que o laço apresente um desempenho melhor em um cenário em que um número relativamente pequeno de preditores tenha coeficientes substanciais e os preditores restantes tenham coeficientes muito pequenos ou iguais a zero. A regressão de Ridge terá melhor desempenho quando a resposta for uma função de muitos preditores, todos com coeficientes de tamanho aproximadamente igual.

Métodos clássicos de séries temporais versus métodos de aprendizado de máquina

Livros-texto padrão sobre séries temporais, como Previsão: Princípios e Práticas discutir muitos métodos para previsão, como suavização exponencial, ARIMA e autorregressão vetorial (VAR). Embora esses métodos sejam dominantes em séries temporais (veja este post do economista Francis X.Diebold), o Aprendizado de Máquina está começando a emergir como um método alternativo em séries temporais, encontrando utilidade, especialmente em séries temporais multivariadas. Aqui está um artigo discutindo estratégias de aprendizado de máquina para séries temporais e aqui está um artigo interessante sobre o sucesso de modelos florestais aleatórios na previsão de surtos de influenza aviária.

Neste passo a passo, compararemos os resultados obtidos com a suavização exponencial e alguns métodos de aprendizado de máquina, como modelos lineares, floresta aleatória, ensacamento e XGBoost.

Apresentando os dados

Em 2014, a ONU pediu uma revolução de dados para colocar as melhores ferramentas e métodos disponíveis para trabalhar a serviço dos Objetivos de Desenvolvimento Sustentável (ODS). Aqui, tentamos usar o aprendizado de máquina para prever um dos indicadores do ODS 1, cujo objetivo é “acabar com a pobreza em todas as formas em todos os lugares”.

O aprendizado de máquina está começando a encontrar um lugar na compreensão do desenvolvimento da sociedade, ajudando a descobrir relações complexas entre diferentes indicadores econômicos e entre outras fontes de dados díspares. Para algumas pesquisas interessantes nessa área, confira este artigo. O Banco Mundial também está pesquisando sobre esses tópicos:

“Coletar dados de pesquisas domiciliares sobre a pobreza é caro e demorado, o que significa que os formuladores de políticas muitas vezes tomam decisões baseadas em dados antigos… o aprendizado de máquina pode mudar drasticamente o jogo, tornando a medição de pobreza mais barata e mais próxima do tempo real.” – Asli Demirguc-Kunt, diretor de pesquisa do Banco Mundial

Neste projeto, tentaremos prever um WDI em particular, “Índice de incidência de pobreza em US $ 1,90 por dia (2011 PPC) (% da população)”. Este é um dos principais indicadores utilizados para medir o progresso no cumprimento do primeiro Objetivo de Desenvolvimento Sustentável. Projetaremos o indicador para o ano de 2010 com técnicas de aprendizado de máquina usando dados até e incluindo o ano de 2009 de todos os indicadores (incluindo o indicador da meta). A escolha de um ano alvo (ou seja, 2010) para o qual já temos dados, nos permite medir nossas previsões em relação aos valores reais informados e medir o sucesso (ou falha) de nossos algoritmos. Isso nos dirá o quão bem o previsor irá executar no futuro em dados não vistos.

O próximo gráfico mostra os valores alvo até o ano de 2010. Onde há valores contínuos para um país, uma linha é desenhada, caso contrário, o valor é representado por uma marca. Vários países têm altos valores de SI.POV.DDAY em 2010, sem nenhum valor para o indicador por um número de anos antes. Devido à descontinuidade nos dados para esses países, eles provavelmente serão difíceis de prever com precisão. O gráfico é interativo, para que você possa exibir o país de origem de todos os dados passando o cursor sobre o ponto.

Para mais detalhes sobre a disputa de dados (usando Python e Pandas) necessários para analisar e limpar este conjunto de dados, consulte o meu blog anterior . Além disso, os valores omissos são imputados usando a interpolação linear própria do Pandas. A consideração dada ao processo de imputação é discutida no meu blog anterior também. Observe que, para algumas implementações de algoritmos de aprendizado baseados em árvore, os valores ausentes são acomodados. Alguma experimentação interessante com isso é detalhada abaixo.

O que acabamos depois de todos os dados acima é algo que se parece com isso:

Dados com janelas para 2 indicadores, para 2 países, se selecionarmos um comprimento de janela deslizante de 3 e se voltarmos 4 anos

Para treinar um algoritmo de aprendizado de máquina com dados de séries temporais, usamos uma janela deslizante para criar observações. A tabela acima mostra como isso pode parecer para 2 indicadores, para 2 países, se selecionarmos um comprimento de janela deslizante de 3 e se voltarmos 4 anos. Novamente, se isso não fizer sentido, dê uma olhada no meu artigo anterior sobre isso.

Na tabela acima, usei o ano como abreviação do valor de um determinado indicador e de um determinado país naquele ano. Cada linha é composta por um conjunto de recursos e um valor de variável de destino que pode ser usado como entrada para qualquer algoritmo de aprendizado de máquina supervisionado.

Para os métodos clássicos de séries temporais usados nessa comparação, nos atemos aos dados univariados das séries temporais. Portanto, em vez de usar os dados da janela acima, simplesmente usamos os valores históricos da variável de destino, SI.POV.DDAY.

O número de observações que criamos para cada país é um parâmetro ajustável, mas é seguro apostar que nosso modelo melhorará os dados que temos para treinamento. Eu estabeleci 10 observações por país. Considerando que temos 83 países no conjunto de dados e que a observação mais recente para cada país é reservada para um teste final, isso dá 747 observações. No entanto, descartamos observações que não têm valor para o alvo naquele ano. Isso nos deixa com 453 observações para treinamento, n .

O número de recursos que criamos para cada indicador também é ajustável. Vamos considerar o caso em que escolhemos criar três recursos por indicador. Existem 1594 indicadores no conjunto de dados WDI. Depois de podar os indicadores de acordo com a seção Reintroduzindo os dados acima, ficamos com 820 indicadores. Isso nos dá 2460 recursos no total, p .

Como você pode ver, p >> n. Podemos considerar esses dados como sendo de alta dimensionalidade. Isso torna a escolha de um modelo de aprendizado de máquina e método de avaliação um pouco mais difícil, como será discutido abaixo.

Modelagem Preditiva

Um número de preditores é considerado e comparado nesta seção. Começamos observando um previsor ingênuo para definir uma linha de base para nossos modelos preditivos.

Previsor ingênuo

Nosso previsor ingênuo usa o último valor de SI.POV.DDAY para um determinado país como uma previsão do alvo para esse país.

Suavização exponencial

Uma excelente introdução ao nivelamento exponencial pode ser encontrada no Capítulo 7 de Previsão: Princípios e Práticas . Aqui, eu implementei o método de tendência linear de Holt usando a biblioteca python, statsmodels , pois considero a melhor correspondência para os dados que possuem uma tendência, mas nenhum componente sazonal. Essa é uma extensão do método de suavização exponencial simples para incluir um termo separado na previsão da tendência. Para trabalhar com técnicas clássicas de séries temporais em python usando pandas, numpy e statsmodels, descobri que o curso de Jose Marcial Portilla sobre Udemy, Python para Análise de Dados de Séries Temporais, é um excelente recurso.

Observe que, para o método de suavização exponencial, um modelo separado é criado para cada país. Isso está em contraste com os métodos de aprendizado de máquina que se seguem, nos quais construí um modelo único, treinado a partir de dados de todos os países, que pode ser aplicado a qualquer país a partir de então.

O processo de agrupamento de dados que eu usei para preparar os dados para suavização exponencial foi diferente do descrito acima. Para suavização exponencial, é muito mais simples, pois apenas os valores históricos do indicador que estamos tentando prever são de interesse (SI.POV.DDAY). Primeiro, convertemos o índice de ano em um timestamp usando pandas to_datetime () antes de passar os dados para statsmodels. Os dados são organizados para ficar assim:

Cada coluna da tabela contém o valor de nossa métrica de pobreza, SI.POV.DDAY, para um determinado país até e inclusive 2009. Lembre-se que o objetivo do nosso algoritmo de previsão é prever o SI.POV.DDAY para o ano de 2010.

O código a seguir foi usado para executar a suavização exponencial de tendência linear de Holt. Para o notebook inteiro, consulte o código-fonte .

Regressão de Lasso

Lasso (e outros métodos lineares) aplicados a este conjunto de dados foram discutidos em detalhes em um artigo anterior . A regressão do laço realizou o melhor. Eu especulava que o laço se dava tão bem por causa de sua tendência a produzir um modelo com muito menos variância em comparação com um modelo de Mínimos Quadrados Ordinários (MQO). Em segundo lugar, em comparação com a regressão de cumes, de acordo com An Introduction to Statistical Learning :

Em geral, pode-se esperar que o laço apresente um desempenho melhor em um cenário em que um número relativamente pequeno de preditores tenha coeficientes substanciais e os preditores restantes tenham coeficientes muito pequenos ou iguais a zero. A regressão de Ridge terá melhor desempenho quando a resposta for uma função de muitos preditores, todos com coeficientes de tamanho aproximadamente igual.

Floresta Aleatória

Não vou apresentar um histórico sobre métodos de aprendizado de máquina baseados em árvore aqui. Uma ótima introdução à Floresta Aleatória pode ser encontrada no capítulo 15 dos Elementos de Aprendizagem Estatística ou você pode se referir a inúmeros artigos on-line.

A expectativa é que a floresta aleatória terá um bom desempenho com este conjunto de dados de alta dimensão, pois cada vez que uma divisão em uma árvore é considerada, uma amostra aleatória de m preditores é escolhida como candidatos divididos do conjunto completo de preditores p . Isso tem o efeito de decorrelating as árvores resultantes e, portanto, reduzindo a variância do resultado agregado. Com nosso conjunto de dados de alta dimensão, isso é exatamente o que o médico receitou.

XGBoost

Uma boa explicação do aumento do gradiente é apresentada aqui . O aumento de gradiente é um método pelo qual as árvores são construídas uma de cada vez, onde cada nova árvore ajuda a corrigir os erros cometidos pela árvore construída anteriormente. O risco de overfitting é maior do que em florestas aleatórias, portanto, o ajuste de parâmetros para ajudar a garantir que o modelo seja bem generalizado é importante. No meu caderno , eu passo por algumas iterações de ajuste de alguns dos parâmetros que tornam o modelo mais conservador e previnem overfitting como gamma, max_depth, min_child_weight, regularização alpha L1 e regularização lambda L2.

Um dos recursos interessantes da implementação do XGBoost é que ele é capaz de manipular valores ausentes na entrada. Durante o processo de treinamento, uma direção padrão (para valores omissos) é aprendida para cada nó no sistema. Isso é descrito em detalhes no documento XGBoost . Como resultado, experimentei usar o XGBoost sem nenhuma tentativa de atribuir valores ausentes, como eu fiz para todos os outros modelos preditivos. Isso acabou sendo, de longe, o modelo mais bem sucedido que eu corri (veja os resultados abaixo).

Avaliação dos modelos

Devido à alta natureza dimensional de nossos dados, qualquer medida de desempenho em nosso conjunto de treinamento, como R², valores de p, etc., pode ser muito enganosa devido ao alto risco de overfitting. Portanto, é vital que utilizemos alguma medida em um conjunto de testes separado. Isso pode ser uma pontuação em um conjunto de testes de retenção ou as pontuações associadas aos conjuntos de testes de validação cruzada usados no treinamento. Neste projeto, eu meço o desempenho usando dados de teste de retenção.

Observe, no entanto, que a validação cruzada também é usada durante o processo de treinamento para evitar o ajuste excessivo. A métrica de desempenho que usamos para cada dobra da validação cruzada é o Root Mean Squared Error (RMSE). É também a métrica de desempenho que usamos no teste final de desempenho usando o conjunto de teste de retenção. O RMSE é escolhido porque penaliza grandes erros de previsão mais em comparação com o erro médio absoluto (MAE).

Resultados

A tabela de resultados a seguir mostra o RMSE obtido de vários modelos lineares diferentes em comparação com o modelo ingênuo na previsão de nossa variável de meta, SI.POV.DDAY para todos os países em nosso ano alvo, 2010 em comparação com os valores reais.

XGBoost sem qualquer tentativa de imputar dados antes do treinamento acabou sendo o modelo mais bem-sucedido que eu tentei. Fiz alguns ajustes manuais nos parâmetros do XGBoost para obter a pontuação RMSE de 3.11. Os parâmetros que usei foram:

Parâmetros para XGBoost (sem imputação)

Curiosamente, um parâmetro chave para o sucesso com o XGBoost foi o ajuste de reg_lambda. Este é o termo de regularização de L2, semelhante ao usado na regressão linear de crista. Portanto, nossos dois modelos de melhor desempenho, XGBoost e lasso, executam a regularização.

A regressão do laço continua sendo um dos nossos melhores modelos. De acordo com uma Introdução à Aprendizagem Estatística , o laço lida muito bem com o caso em que a maioria dos preditores não está relacionada à variável alvo e isso pode explicar por que o lasso é tão eficaz.

Seria ótimo ouvir alguma opinião sobre por que você acha que o XGBoost teve um desempenho tão bom nesse conjunto de dados esparso de alta dimensionalidade e por que a imputação usando a interpolação linear parece ser tão prejudicial ao desempenho?