5 de fevereiro de 2021
Neste artigo, Maxime Lutel, cientista da Data, resume o que aprendeu na competição de previsão de vendas M5, que consistia em prever as vendas futuras em várias lojas do Walmart. Ele apresentará aos senhores a nossa solução e discutirá qual modelo de aprendizado de máquina funcionou melhor para essa tarefa.

Usando o aprendizado de máquina para resolver os desafios comerciais dos varejistas
Uma previsão de vendas precisa é fundamental para que as empresas de varejo produzam a quantidade necessária no momento certo. Mas mesmo que evitar o desperdício e a escassez seja uma de suas principais preocupações, os varejistas ainda têm muito espaço para melhorias. Pelo menos, é isso que as pessoas que trabalham no Walmart pensam, pois lançaram um desafio científico aberto data em março de 2020- A competição M5 - para ver como eles poderiam aprimorar seus modelos de previsão.
O objetivo da competição era prever vendas futuras no nível do produto, com base no histórico do data. Mais de 5.000 equipes de amantes do data e especialistas em previsão discutiram durante meses sobre os métodos, recursos e modelos que funcionariam melhor para resolver esse conhecido problema de aprendizado de máquina. Esses debates destacaram alguns problemas recorrentes encontrados em quase todos os projetos de previsão. E, ainda mais importante, trouxeram à tona uma grande variedade de abordagens para resolvê-los.
Este artigo pretende resumir alguns principais percepções que surgiram do desafio. Na Artefact, acreditamos em aprender fazendo, por isso decidimos tentar e codificar nossa própria solução para ilustrá-la. Agora vamos percorrer todo o pipeline de previsão e parar ao longo do caminho para entender o que funcionou e o que falhou.
Declaração do problema: Previsão hierárquica de séries temporais
O dataset contém um histórico de vendas de 5 anos, de 2011 a 2016, para vários produtos e lojas. Algumas informações adicionais são fornecidas, como preços de venda e eventos do calendário. O Data é organizado hierarquicamente: as lojas são divididas em 3 estados e os produtos são agrupados por categorias e subcategorias.

Nossa tarefa é prever as vendas de todos os produtos em cada loja, nos dias logo após o dataset disponível. Isso significa que 30.490 previsões devem ser feitas para cada dia no horizonte de previsão.
Essa hierarquia orientará nossas escolhas de modelagem, pois as interações dentro das categorias de produtos ou lojas contêm informações muito úteis para fins de previsão. De fato, itens nas mesmas lojas e categorias podem ter uma evolução de vendas semelhante ou, ao contrário, podem canibalizar uns aos outros. Portanto, vamos descrever cada amostra por meio de recursos que capturam essas interações e priorizar abordagens baseadas em aprendizado de máquina em relação às abordagens tradicionais de previsão, para considerar essas informações ao treinar o modelo.
Dois desafios principais: valores intermitentes e um horizonte de previsão estendido
A essa altura, o senhor pode pensar que esse é um problema de previsão muito comum. O senhor está certo e é por isso que ele é interessante: pode estar relacionado a uma ampla gama de outros projetos, mesmo que cada setor tenha suas próprias características. Entretanto, esse desafio tem duas especificidades importantes que tornarão a tarefa mais difícil do que o esperado.
A primeira é que a série temporal com a qual estamos trabalhando tem muitos valores intermitentes, ou seja, longos períodos de dias consecutivos sem vendas, conforme ilustrado no gráfico abaixo. Isso pode ser devido à falta de estoque ou à área limitada das prateleiras nas lojas. De qualquer forma, isso complica a tarefa, pois o erro aumentará muito se as vendas forem previstas em um nível regular enquanto o produto estiver fora das prateleiras.

O segundo vem da própria tarefa e, mais precisamente, da tamanho do horizonte de previsão. Os concorrentes devem gerar previsões não apenas para a próxima semana, mas para um período de quatro semanas. O senhor prefere confiar na previsão do tempo para o dia seguinte ou para daqui a um mês? O mesmo vale para a previsão de vendas: um horizonte de previsão estendido torna o problema mais complexo, pois a incerteza aumenta com o tempo.
Engenharia de recursos - Modelagem dos fatores determinantes das vendas
Agora que entendemos a tarefa que temos em mãos, podemos começar a calcular os recursos que modelam todos os fenômenos que podem afetar a evolução das vendas. O objetivo aqui é descrever cada tripla Dia x Produto x Loja por um conjunto de indicadores que capturem os efeitos de fatores como sazonalidade, tendências ou preços.
Sazonalidade
Em vez de usar a data de vendas diretamente como um indicador, geralmente é mais relevante decompô-la em vários recursos para caracterizar a sazonalidade: ano, mês, número da semana, dia da semana... Esse último é particularmente perspicaz porque o problema tem uma forte periodicidade semanal: os volumes de vendas são maiores nos finais de semana, quando as pessoas passam mais tempo nos supermercados.
Eventos do calendário como feriados ou finais da NBA também têm um forte impacto sazonal. Foi criado um recurso para cada evento, com os seguintes valores:
A ideia é modelar o impacto sazonal não apenas no dia D, mas também antes e depois. Por exemplo, um produto que será muito oferecido como presente de Natal terá um pico de vendas nos dias anteriores e uma queda logo depois.
Tendências
As tendências recentes também fornecem informações úteis sobre vendas futuras e são modeladas graças ao recursos de atraso. Uma defasagem é o valor da variável-alvo deslocado por um determinado período. Para qualquer item específico em uma determinada loja, o valor de defasagem de uma semana seria as vendas feitas há uma semana para esse item e loja específicos. Diferentes valores de deslocamento podem ser considerados, e a média de várias defasagens também é computada, para obter preditores mais robustos. As defasagens também podem ser calculadas em vendas agregadas para capturar tendências mais globais, por exemplo, no nível da loja ou no nível da categoria do produto.
Preços
O preço de um produto pode mudar de uma loja para outra, e até mesmo de uma semana para outra dentro da mesma loja. Essas variações influenciam fortemente as vendas e, portanto, devem ser descritas por algumas características. Em vez de preços absolutos, as diferenças de preços relativos entre produtos relevantes têm maior probabilidade de explicar a evolução das vendas. É por isso que os seguintes preditores foram calculados:
Codificação de variáveis categóricas
As variáveis categóricas, como o estado, a loja, o nome do produto ou sua categoria, também têm um poder preditivo significativo. Essas informações precisam ser codificadas em recursos para ajudar o modelo a aproveitar a hierarquia do dataset. A codificação de um ponto não é uma opção aqui porque algumas dessas variáveis categóricas têm uma cardinalidade muito alta (3049 produtos distintos). Em vez disso, usamos uma codificação de destino ordenada, o que significa que cada observação é codificada pela média de vendas de observações anteriores com o mesmo valor categórico. O conjunto de data é ordenado por tempo para essa tarefa a fim de evitar vazamento de data.
Todas as variáveis categóricas e algumas de suas combinações foram codificadas com esse método. Isso resulta em recursos muito informativos, sendo o melhor deles a codificação da combinação de produto e loja. Se quiser experimentar outros codificadores, o senhor pode encontrar uma grande variedade de métodos aqui.
Perda de Tweedie para lidar com valores intermitentes
Diferentes estratégias possíveis podem ser usadas para lidar com a questão dos valores intermitentes. Alguns participantes decidiram criar dois modelos separados: um para prever se o produto estará ou não disponível em um dia específico e outro para prever as vendas. Como muitos outros, escolhemos outra opção, que é confiar em uma função objetiva adaptada ao problema: o perda de tweedie.
Sem entrar em detalhes matemáticos, vamos tentar entender por que essa função de perda é adequada ao nosso problema, comparando a distribuição de vendas no data de treinamento e a distribuição tweedie:

Elas são bastante semelhantes e ambas têm valores concentrados em torno de 0. Definir a perda de tweedie como uma função objetiva basicamente forçará o modelo a maximizar a probabilidade dessa distribuição e, assim, prever a quantidade certa de 0s. Além disso, essa função de perda vem com um parâmetro - cujos valores variam de 1 a 2 - que pode ser ajustado para se adequar à distribuição do problema em questão:

Com base em nossa distribuição dataset, podemos esperar que o valor ideal esteja entre 1 e 1,5, mas, para sermos mais precisos, ajustaremos esse parâmetro posteriormente com a validação cruzada. Essa função objetiva também está disponível para outros modelos de aumento de gradiente, como XGBoost ou CatBoost, portanto, vale a pena tentar se o senhor estiver lidando com valores intermitentes.
Como fazer previsões com 28 dias de antecedência? Tirando o máximo proveito dos recursos de atraso
Conforme explicado acima, os recursos de defasagem são vendas deslocadas por um determinado período de tempo. Portanto, seus valores dependem de onde o senhor se encontra no horizonte de previsão. As vendas feitas em um determinado dia D podem ser consideradas como uma defasagem de 1 dia se o senhor estiver prevendo um dia à frente, ou como uma defasagem de 28 dias se estiver prevendo 28 dias à frente. O diagrama a seguir ilustra esse ponto:

Esse conceito é importante para entender quais recursos serão disponível no momento da previsão. Aqui, estamos no dia D e gostaríamos de prever as vendas para os próximos 28 dias. Se quisermos usar o mesmo modelo - e, portanto, os mesmos recursos - para fazer previsões para todo o horizonte de previsão, só poderemos usar defasagens disponíveis para prever todos os dias entre D+1 e D+28. Isso significa que, se usarmos o recurso de defasagem de 1 dia para treinar o modelo, essa variável também terá de ser preenchida para previsões em D+2, D+3, ... e D+28, já que se refere a datas no futuro.
Ainda assim, os atrasos são provavelmente os recursos com o maior poder de previsão, Por isso, é importante encontrar uma maneira de aproveitar ao máximo essas informações. Consideramos três opções para contornar esse problema, vamos ver como elas se saíram.
Opção 1: Um modelo para todas as semanas

A primeira opção é a mais óbvia. Ela consiste em usar o mesmo modelo para fazer previsões para todas as semanas no horizonte de previsão. Como acabamos de explicar, ela vem com uma grande restrição: somente os recursos disponíveis para a previsão em D+28 podem ser usados. Portanto, temos de eliminar todas as informações fornecidas pelas 27 defasagens mais recentes. É uma pena, pois as defasagens mais recentes são também as mais informativas, por isso consideramos outra opção.
Opção 2: Modelos semanais

Essa alternativa consiste em treinar um modelo LightGBM diferente para cada semana. No diagrama acima, cada modelo está aprendendo com as defasagens mais recentes possíveis em relação à restrição imposta por seu horizonte de previsão. Seguindo a mesma lógica da opção anterior, isso significa que cada modelo pode aproveitar todas as defasagens, exceto aquelas que são mais recentes do que o dia mais distante a ser previsto.
Mais precisamente:
Esse método nos permite capitalizar melhor as informações de defasagem das três primeiras semanas e, assim, melhorar a precisão da previsão de nossa solução. Valeu a pena porque era uma competição da Kaggle, mas o senhor para um projeto industrializado, questões de complexidade, manutenção e interpretabilidade também devem ser levadas em consideração.
Na verdade, essa opção pode ser cara do ponto de vista computacional e, se estivermos buscando uma implementação em escala nacional, isso exigiria a manutenção de centenas de modelos em tempo real. Nesse caso, seria necessário avaliar se o incremento de desempenho é grande o suficiente para justificar essa implementação mais complexa.
Opção 3: Modelagem recursiva

A última opção também usa modelos semanais, mas dessa vez de forma recursiva. Modelagem recursiva significa que as previsões geradas para uma determinada semana serão usadas como recursos de atraso para as semanas seguintes. Isso acontece sequencialmenteO senhor pode usar a opção 1: primeiro fazemos previsões para a primeira semana usando todas as defasagens, exceto as 6 mais recentes. Em seguida, prevemos a segunda semana usando nossas previsões anteriores como defasagens de uma semana, em vez de excluir mais defasagens como na opção 2. Ao repetir o mesmo processo, sempre temos defasagens recentes disponíveis, mesmo para as semanas 3 e 4, o que nos permite aproveitar essas informações para treinar os modelos.
Vale a pena testar esse método, mas lembre-se de que ele é bastante instável, pois os erros se propagam de uma semana para outra. Se o modelo da primeira semana cometer erros importantes, esses erros serão tomados como verdade pelo modelo seguinte, que inevitavelmente terá um desempenho ruim, e assim por diante. É por isso que decidimos ficar com a opção 2, O senhor pode usar o seu computador, que parece ser mais confiável.
Garantir a robustez do modelo com uma validação cruzada adequada: Por que a validação cruzada é fundamental para séries temporais
Em qualquer projeto de aprendizado de máquina, a adoção de uma estratégia de validação cruzada adequada é fundamental para simular corretamente a precisão fora da amostra, selecionar cuidadosamente os hiperparâmetros e evitar o ajuste excessivo. Quando se trata de previsão, isso deve ser feito com cuidado porque há uma dependência temporal entre as observações que deve ser preservada. Em outras palavras, queremos evitar que o modelo olhe para o futuro quando o treinamos.
O período de validação durante o qual o modelo é testado também tem uma importância maior quando se trata de séries temporais. O desempenho do modelo e o conjunto ideal de hiperparâmetros podem variar muito, dependendo do período em que o modelo é treinado e testado. Portanto, nosso objetivo é descobrir quais parâmetros têm maior probabilidade de maximizar o desempenho, não em um período aleatório, mas no período que queremos prever, ou seja, as próximas 4 semanas.
Adaptar o processo de validação ao problema em questão
Para atingir esse objetivo, selecionamos 5 conjuntos de validação que foram relevantes para o período de previsão. O diagrama abaixo mostra como eles são distribuídos ao longo do tempo. Para cada dobra de validação cruzada, o modelo é treinado com várias combinações de parâmetros no conjunto de treinamento e avaliado no conjunto de validação usando a raiz do erro quadrático médio.

As dobras 1, 2 e 3 visam identificar os parâmetros que teriam maximizado o desempenho em períodos recentes, basicamente nos últimos 3 meses. O problema é que esses três meses podem ter especificidades diferentes das do próximo período que estamos querendo prever. Por exemplo, vamos imaginar que as lojas lançaram uma grande temporada promocional nos últimos meses e que ela acabou hoje.
Essas promoções provavelmente afetariam o comportamento do modelo, mas seria arriscado confiar apenas nesses períodos recentes para ajustá-lo, pois isso não representa o que acontecerá no futuro.
Para atenuar esse risco, também incluímos as dobras 4 e 5, que correspondem ao período de previsão deslocado em 1 e 2 anos, respectivamente. É provável que esses períodos sejam semelhantes porque o problema tem uma forte sazonalidade anual, o que geralmente ocorre no varejo. Caso tivéssemos uma periodicidade diferente, poderíamos escolher qualquer estratégia de validação cruzada que fizesse mais sentido para os negócios. No final, selecionamos a combinação de hiperparâmetros com o menor erro nas 5 dobras para treinar o modelo final.
Resultados
As diferentes técnicas mencionadas acima nos permitiram chegar a um 0,59 RMSSE ponderado - a métrica usada no Kaggle - que é equivalente a uma precisão de previsão ponderada de 82,8%. O gráfico abaixo resume o desempenho incremental gerado por cada etapa:

Esses números são indicativos: a precisão incremental também depende da ordem em que cada etapa é implementada.
Principais conclusões
Aprendemos muito com esse desafio graças aos insights compartilhados pelos participantes e esperamos que ele também tenha lhe dado o que pensar. Aqui estão nossas principais conclusões:
Muito obrigado pela leitura até agora e não hesite em entrar em contato com o senhor se tiver algum comentário sobre o assunto!

BLOG





