Imagine que você precisa chamar um táxi. Você abre o aplicativo, vê que o carro chegará em cerca de sete minutos, clique em "Encomendar" - e ... o carro fica a 15 minutos de você, se houver. Concorda, desagradável?
Neste artigo, falaremos sobre como os métodos de aprendizado de máquina ajudam o Yandex.Taxi a prever melhor o ETA (Hora estimada de chegada - hora prevista de chegada).

Primeiro, lembre-se de que o usuário vê no aplicativo antes de fazer o pedido:

No mapa, o azul indica os pontos ideais para embarcar em um táxi. Pino vermelho - o ponto para o qual o usuário chama um táxi. O alfinete mostra quanto tempo o carro chegará. Em um mundo perfeito. Mas, no mundo real, outras pessoas próximas também se chamam carro através do aplicativo Yandex.Taxi. E não sabemos qual carro irá para quem, porque eles são distribuídos somente após o pedido. Se o carro já foi atribuído, para a previsão, usaremos o roteamento e o tempo do Yandex.Maps ao percorrer o caminho ideal. Desta vez (possivelmente com uma pequena margem), mostraremos o usuário imediatamente após o pedido. A questão permanece: como se pode prever a ETA antes de fazer o pedido?
E aqui o aprendizado de máquina aparece. Fazemos uma seleção com objetos e as respostas corretas e ensinamos o algoritmo a adivinhar a resposta de acordo com as características do objeto. No nosso caso, os objetos são sessões de usuário, as respostas são o tempo após o qual o carro realmente chegou. Os sinais do objeto podem ser parâmetros numéricos conhecidos antes da ordem: o número de motoristas e usuários do aplicativo próximo ao pino, a distância dos veículos de serviço mais próximos e outros valores potencialmente úteis.
Por que isso é importante
Em um mundo ideal, as pessoas fazem tudo com antecedência e sempre planejam seu tempo com precisão. Mas nós vivemos no mundo real. Se uma pessoa está atrasada para o trabalho ou, pior ainda, para o aeroporto, é importante que ela entenda se chegará a tempo de sair e chegar ao seu destino.
Ao decidir o que pedir, o futuro passageiro é guiado, entre outras coisas, pelo tempo de espera. Pode ser muito diferente em aplicativos diferentes para chamar um táxi e em tarifas diferentes de um aplicativo. Para que o usuário não se arrependa da escolha, é muito importante mostrar o ETA exato.
Tudo parece ser simples. Crie mais placas, treine um modelo, como o CatBoost, preveja o tempo antes da chegada do carro - e você pode terminar aí. Mas a experiência mostra que é melhor não se apressar e pensar com cuidado, e depois fazê-lo.
A princípio, não tínhamos dúvida de que era necessário prever o tempo em que o motorista chegaria ao usuário. Sim, não sabemos ao certo qual carro será atribuído antes do pedido. Mas podemos prever o ETA usando dados não sobre um driver específico, mas sobre os drivers nas proximidades do pedido. Obviamente, a previsão deve ser honesta o suficiente para que o usuário possa planejar o tempo.
Mas o que significa "honesto"? Afinal, qualquer algoritmo de previsão é ruim ou apenas estatisticamente bom. Há resultados bem-sucedidos e francamente ruins, mas você precisa "mediar" para não se desviar significativamente das respostas corretas. Deve-se entender que "em média" é diferente. Por exemplo, a média é de pelo menos três conceitos das estatísticas: expectativa, mediana e moda. A imagem do magnífico livro de Darrell Huff "Como mentir usando estatísticas" mostra perfeitamente a diferença:

Queremos que o modelo, em média, cometa alguns erros. Dependendo do valor da "média", existem duas opções para avaliar a qualidade das previsões. A primeira opção é mostrar ao usuário a expectativa matemática de tempo antes da chegada do táxi. Como resultado, um modelo será treinado para minimizar o quadrado médio do erro de previsão (Mean Squared Error, MSE):
Aqui
- respostas corretas,
- previsões modelo.
Outra opção não deve ser confundida com a previsão da ETA principalmente em uma direção, para cima ou para baixo. Nesse caso, mostraremos ao usuário a mediana da distribuição do tempo antes da chegada do táxi. Como resultado, será treinado um modelo que otimiza o módulo médio do erro de previsão (Mean Absolute Error, MAE):
Mas percebemos que estávamos nos adiantando um pouco.
Repensando a declaração do problema
Após a consulta, sabemos que tipo de carro vai para o usuário, o que significa que podemos estimar seu tempo de viagem no Yandex.Maps. Este tempo é mostrado no alfinete após o pedido. Por um lado, agora temos mais informações e a previsão será mais precisa, mas, por outro lado, essa também é uma estimativa com erro.
Esse foi o problema na tarefa de pin do ETA. Enquanto o motorista não estiver designado, é necessário prever
exatamente o tempo que o roteamento Yandex.Mart mostrará e não o tempo real antes da entrega do carro.
Parece que bobagem: em vez do valor exato, considere outra previsão como alvo? Mas isso faz sentido, e aqui está o porquê. No caminho para você, o carro designado pode demorar. O motorista entrou em uma situação perigosa na estrada, em um congestionamento devido a um acidente ou saiu para comprar água. Tais atrasos são difíceis de prever. Eles criam ruído adicional na variável de destino, devido à qual a tarefa já difícil de prever a ETA no pino se torna ainda mais difícil.
Como se livrar do barulho? Preveja a variável de destino suavizada - o tempo que é mostrado após a máquina ser atribuída com base na rota para o usuário.
Essa é a lógica do ponto de vista dos negócios: você não pode gastar o tempo na estrada pelo caminho ideal da ETA, mas atrasos adicionais podem ser reduzidos trabalhando com os motoristas.
Métricas, dados, modelo e treinamento de qualidade
Descobrimos que, para o ETA no pino, é necessário prever não o tempo real, mas o tempo que será recebido após a atribuição da máquina ao longo do percurso. Das duas métricas de qualidade, MAE e MSE, escolhemos o MAE. Talvez, do ponto de vista da intuitividade da previsão, seja mais lógico avaliar a expectativa média (MSE) do que a mediana (MAE). Mas o MAE tem uma característica interessante: o modelo é mais resistente a valores discrepantes entre os exemplos de treinamento.
Os sinais são divididos em grupos:
- construído pela hora atual;
- geo (coordenadas, distância ao centro da cidade e objetos significativos no mapa);
- pino (quantos e quais carros estão próximos, sua densidade calculada de maneira diferente);
- estatísticas sobre a zona (como sempre cometemos erros, quanto previmos);
- dados sobre os motoristas mais próximos (quanto tempo eles alcançam, quanto o primeiro está mais próximo que o segundo, etc.).
Obviamente , o
CatBoost foi treinado nesses sinais. O argumento decisivo foi que o aumento de gradiente implementado no CatBoost sobre árvores equilibradas há muito se estabeleceu como um método de aprendizado de máquina muito poderoso, e o método de codificação de recursos categóricos no CatBoost compensa regularmente por nossas tarefas. Outro recurso interessante da biblioteca é o aprendizado rápido na GPU.
Agora, algumas palavras sobre quais modelos foram comparados. O ETA inicial (antes de ser especificado pelo aprendizado de máquina) foi calculado com base no horário em que a máquina mais próxima do usuário poderia chegar. O modelo atual (usado no aplicativo agora) é o que acabou sendo feito usando o aprendizado de máquina e sobre o
que é este artigo. Além disso, um novo modelo será lançado em breve na produção. Ela usa uma ordem de magnitude de recursos mais significativos para resolver o problema. A tabela abaixo mostra as medidas de qualidade desses modelos em dados históricos. A propósito, ainda temos muitos planos -
venha ajudar .
Qualidade de previsão de validação ETA ** Porcentagem (entre parênteses indica a alteração do ETA original).
O aprendizado de máquina nos permitiu ganhar cerca de dois segundos, ou 3,4% do desvio médio da previsão. E no novo modelo - quase mais um segundo, um total de 4,5%. Mas, a partir desses números, é difícil entender que o ETA melhorou significativamente. Para sentir os benefícios do aprendizado de máquina, preste atenção na última coluna. As perdas com uma previsão de mais de 5 minutos se tornaram 19,2% e, no novo modelo - até 23,2% menos! A propósito, esses erros ocorrem apenas em 3 e 2,8% dos casos em modelos que usam aprendizado de máquina.
Sumário
Especificamos o ETA no pino principalmente para fornecer aos usuários uma previsão confiável. Mas, é claro, com qualquer aplicação de aprendizado de máquina nos negócios, é imperativo avaliar o efeito econômico. E entenda se é comparável ao custo de construção e implementação de modelos. Após o teste A / B on-line, descobrimos que, usando o aprendizado de máquina, recebemos um aumento estatisticamente significativo na conversão de um pedido em uma viagem (afinal, um pedido pode ser cancelado) e um aumento na conversão de uma sessão do usuário para um pedido.
Nos dois casos, estamos falando de um efeito da ordem de 0,1 pontos percentuais. A propósito, isso não contradiz a significância estatística: em nossos volumes de dados, mesmo essa diferença é detectada de maneira confiável em 2 a 4 semanas. E com a relevância dos negócios, de fato, tudo também não é ruim: os custos de atualização do ETA são repelidos pelo aumento da conversão em apenas alguns meses.
Como resultado, obtivemos um caso útil e ilustrativo. O refinamento do ETA no alfinete tornou-se uma história instrutiva sobre a seleção cuidadosa da variável alvo. No lado do produto, este é um exemplo muito motivador: aprimoramos o aplicativo e vimos que os usuários o apreciavam. Esperamos que o ETA refinado ajude nossos passageiros a encontrar reuniões, trens e aviões com mais frequência.
PS Se você estiver interessado em outras tecnologias Yandex.Taxi, recomendamos um
post sobre preços dinâmicos , publicado recentemente por meu colega.