Prevendo ganhadores em corridas de ciclismo com Machine Learning
Com 95% de precisão, pode-se utilizar dados históricos de desempenho para prever quais atletas estarão no pódio
Um pouco de contexto do projeto
No início de 2020 decidi voltar a competir no ciclismo amador depois de mais de 10 anos. Mas desta vez tudo foi bem diferente. Primeiro porque eu iria competir em um país diferente (Estados Unidos); segundo, porque hoje tenho um nível competitivo bem melhor do que quando adolescente.
Assim que a temporada se iniciou, logo me vi olhando a lista de inscritos das competições por categoria e pensando: Como posso aumentar minhas chances de ter um bom resultado? Não conhecia nenhum dos competidores e equipes. Basicamente só me restava fazer um reconhecimento do circuito e confiar em meu condicionamento físico.
Claro que não parei de pensar nisso e, quando eu menos percebi, estava pesquisando o nome de cada inscrito e buscando informações sobre os competidores. Foi então que descobri que a USA Cycling (federação ciclística dos Estados Unidos) tem o histórico de todas as corridas e dos atletas, amadores e profissionais. Bingo!
Sempre fui apaixonado por análise de dados, o que dentre outros projetos resultou na Graava — uma startup que fundei e desenvolveu um algoritmo para editar vídeos automaticamente com o uso de dados de sensores e imagens. Assim, quando me encontrei analisando os dados dos atletas e colhendo informações manualmente, logo me veio a ideia de desenvolver uma ferramenta para automatizar esse processo e análise.
Primeira versão — Race Field Analysis
Fiz alguns testes e análises iniciais dos dados dos atletas e gostei dos resultados. Com os primeiros testes realizados na linguagem R percebi que os resultados poderiam de fato me trazer vantagens competitivas. Comentei com alguns companheiros da minha equipe de ciclismo e todos me responderam da mesma forma. Como posso ter acesso a essas informações também?
Foi assim que nasceu a ferramenta Race Field Analysis. Um side project, open source, desenvolvido em R, e utilizando o framework Shiny. A ideia original era disponibilizar aos meus companheiros de equipe e amigos a possibilidade de analisar a dinâmica de uma corrida e desenvolver planos estratégicos para obter um melhor resultado. A ferramenta traria informações como qual equipe teria um maior controle da corrida, e quais atletas eram mais experientes.
Mas é claro que tudo mudou quando percebi que, com os dados colhidos, não só era possível ter acesso a informações adicionais, mas também realizar previsões de quais atletas poderiam estar no pódio. Aí sim a brincadeira ficou divertida. Com a informação dos possíveis ganhadores, toda a dinâmica da corrida poderia ser modificada. Ficou claro, era só marcar os potenciais ganhadores na corrida e assim ter um melhor resultado geral ou até mesmo batê-los nos metros finais.
A primeira versão da ferramenta está disponível neste link: http://racedata.bike. Com ela é possível analisar todas as corridas e categorias de ciclismo nos EUA, incluindo Road, MTB, Gravel, Track, Cyclocross etc.
Assim que meus companheiros de equipe começaram a utilizar a ferramenta, os resultados foram diversos e super divertidos:
“Bruno nailed the 55+ 1/2/3 winner… full field of 60 riders. Consistent with Bruno’s app, 42 old guys had teammates, but the “favorite”, new 55 year old Tom Lyons had no teammates on paper, but lots of help in the form of his old Thirsty Bear teammates.” Larry
“Thankfully for us, Bruno’s race predictor wasn’t quite as accurate for the women’s 3 :)” Jenn
Em todos os casos eu fiquei muito feliz com o resultado e em como a ferramenta estava ajudando a equipe. Mesmo com resultados não exatamente precisos (como no caso da corrida da Jenn), era uma grande diversão ver os comentários dos companheiros, de certa forma dizendo: “eu quebrei seu algoritmo, Bruno!” Na verdade, com a utilização de aprendizado de máquina, a cada corrida o algoritmo estará colhendo mais informação sobre o atleta. Consequentemente, na próxima corrida esse atleta terá uma melhor posição na previsão, e o algoritmo estará mais preciso.
Covid-19
Logo depois da disponibilização do primeiro beta da ferramenta veio o Covid-19, e o mundo todo sofreu as consequências da pandemia e do isolamento em casa. Assim como diversas atividades em grupo, todas as corridas foram canceladas.
Mas os atletas não pararam de treinar, na verdade o ciclismo nunca teve um crescimento tão grande quanto em 2020. Na busca sedenta por competição, os ciclistas acharam nas plataformas virtuais de treinamento a solução.
Zwift
Zwift sem sombra de dúvida é a plataforma virtual mais famosa e com o maior número de usuários da atualidade. Basicamente, o Zwift é um jogo multiplayer onde você conecta sua bicicleta com o computador. À medida em que você faz esforço na bike, seu avatar se move na corrida virtual. É uma grande evolução do treinamento indoor. O que antes era super chato e monótono, agora é dinâmico e super competitivo. E adivinha? Tem corridas todos os dias com atletas do mundo inteiro. Bingo!
Segunda versão — ZRace
A ideia de desenvolver uma variação da ferramenta Race Field Analysis para as corridas do Zwift veio assim que comecei a participar das corridas no Zwift. Por ser uma corrida virtual, todos os atletas estão conectados e o Zwift utiliza diversos sensores da bike (medidor de potência, cadência e velocidade) e do atleta (batimento cardíaco) para medir o percentual de esforço. Ou seja, isso é mais que perfeito. Com dados como batimento cardíaco, potência, peso, idade, sexo, velocidade, cadência, resultados históricos, entre outros, as análises poderiam ser muito mais precisas e efetivas.
Assim nasceu a ZRace, uma ferramenta específica para corridas no Zwift onde os atletas podem analisar qual corrida e categoria se encaixam melhor com seu perfil e podem ter uma maior vantagem competitiva.
A ferramenta pode ser acessada por este link: http://zrace.bike
A ZRace analisa todos os atletas inscritos em uma corrida e realiza uma previsão dos possíveis ganhadores. Também analisa cada categoria e apresenta a média de força necessária para você ter um bom resultado. Além disso, são identificados os atletas com perfis específicos como: escalador, sprinter e contra-relógio. Desta forma é possível, dependendo do percurso da corrida, prever quem terá um melhor resultado ou mesmo quem você deve ficar de olho em certo trecho da corrida.
Assim como a primeira versão desenvolvida para corridas não virtuais, a ZRace realiza análises e previsão dos ganhadores. Porém, graças ao grande número de informações adicionais dos atletas providos pelo Zwift, a ZRace se tornou uma ferramenta bem mais completa e com previsões muito mais precisas.
Por baixo do capô — Modelos estatísticos
Há bastante tempo desenvolvo soluções seguindo princípios e métodos Agile. Com esse projeto e o modelo estatístico utilizado, não seria diferente. É muito difícil desenvolver um modelo grande e complexo do zero. Mas é relativamente fácil desenvolver um modelo simples e então iterar, melhorar os resultados com novos testes. A cada iteração, você aprende mais sobre os resultados e a importância de cada variável, e assim desenvolve a próxima iteração com o conhecimento adquirido.
Minha ideia de primeira iteração foi desenvolver um modelo simples que pudesse ser usado para validar e analisar o projeto como um todo. Utilizei expert model para prever os ganhadores. Eu buscava o número de vitórias de cada atleta nas últimas 10 corridas, e o atleta que tivesse o maior número de vitórias seria o ganhador.
Mesmo com um modelo extremamente simples, esta iteração foi muito importante para o projeto como um todo. Ela me ajudou a desenvolver um completo MVP sem comprometer muito tempo e recursos. Com os resultados e validações desta iteração me senti seguro para aprofundar no projeto, iniciar a coleta e limpeza de dados, desenvolver o back e front end e quando tudo estivesse pronto, aprofundar e melhorar os modelos preditivos.
As iterações do modelo preditivo foram:
1- Expert model: Como mencionado, esse modelo foi utilizado como ponto zero do projeto e devido ao resultado relativamente justo o projeto foi iniciado.
2- Regressão linear: A segunda iteração do modelo preditivo foi realizada utilizando modelos lineares. Este foi um passo natural após uma análise exploratória de dados e a detecção de importantes variáveis e suas correlações. Especificamente, o modelo multiple linear regression obteve os melhores resultados e foi utilizado nesta iteração.
3- Seleção do modelo: A terceira iteração tinha como objetivo identificar o modelo preditivo definitivo. Uma vez identificado, o objetivo seria ajustar o modelo até que ele apresentasse o resultado mais preciso possível. Para esta iteração, modelos mais complexos e aprendizado de máquina foram essenciais para chegar no resultado final.
O objetivo foi utilizar o modelo mais preciso para os dados. Esse é o ponto de um modelo preditivo. Basicamente nenhuma pessoa sabe qual é o melhor algoritmo a se usar para um determinado problema. Caso você saiba e já tenha experiência em um determinado problema, então provavelmente você não precisa usar aprendizado de máquina devido ao seu profundo conhecimento na área.
Dito isso, meu plano foi usar todo o potencial do aprendizado de máquina para identificar o melhor e mais preciso algoritmo para a previsão.
Primeiro passo: Uma amostra muito maior foi obtida para que o treinamento dos modelos fossem realizados e assim apresentar um melhor resultado. Estão sendo usados neste teste 1.700 observações (corridas). O número de observações não é o ideal, mas estou colhendo mais com o tempo.
Segundo passo: É importante ter um bom conjunto de algoritmos com representações de lines, trees, instances, entre outros, da mesma forma que é importante algoritmos para aprender estas representações. No final do processo mais de 10 algoritmos foram testados, entre eles: Linear Discriminant Analysis, Logistic Regression, GLMNET, SVM Radial, kNN, Naive Bayes, CART, Bagged CART, Random Forest, Stochastic Gradient Boosting entre outros.
Após o treinamento dos modelos e testes, 3 algoritmos se destacaram: Bootstrap Aggregating, Generalized Boosted Regression Modeling e Random Forest. Mas o algoritmo Random Forest teve uma melhor performance e desta forma foi o modelo escolhido para seguir em frente e iniciar os ajustes finos.
Random Forest (RF) é um algoritmo que cria centenas de árvores de decisão baseadas em suas variáveis. Com a combinação das decisões das árvores ele chega na resposta esperada.
Resultados
Depois dos ajustes finos realizados no modelo, a taxa de precisão na previsão dos resultados das corridas alcançou 58%! Esse é um resultado muito bom dado que o modelo prevê a posição exata de cada atleta no resultado da corrida. Em média, as corridas têm 25 atletas por categoria, mas há casos de 50, 80 ou até mais participantes.
Para ajustar o modelo e ter uma melhoria da precisão do modelo de 54,4% para 58% alguns parâmetros foram alterados e o modelo treinado novamente até que se chegasse no conjunto de parâmetros ideal.
O modelo ideal usa 500 árvores de decisão e 10 variáveis. O gráfico abaixo mostra a importância de cada variável para o modelo e com ele é possível entender porque o modelo é mais preciso com 10 variáveis em vez de 16.
Mas agora vem a parte mais interessante. O problema que estamos tentando resolver aqui e o motivo pelo qual o desenvolvimento deste projeto se iniciou foi identificar quais serão os atletas que estarão no pódio. Ou seja, os Top 5. Com esta informação você pode marcar os atletas na corrida e assim ter um melhor resultado.
Dito isso, meu modelo apresenta uma taxa de precisão de 75% nas previsões das corridas que no Top 5, ou seja no pódio, 4 atletas estarão presentes independente da ordem. E 95% de taxa de precisão que 3 atletas previstos estarão no Top 5!
Este resultado me deixou extremamente feliz com o trabalho realizado. E posso dizer com 95% de certeza que se você está pensando em correr no Zwift vai saber quem tem que marcar. : )
Conclusão
- Trabalhar neste projeto foi bem divertido, poder comparar as previsões com os resultados finais das corridas te mostra um benefício imediato e real e isso é bem motivador.
- Por mais que eu esteja bem feliz com os resultados atuais, vou continuar colhendo os dados das corridas para chegar ao número mágico de 10.000 amostras (corridas) e assim realizar mais uma bateria de treinamento dos modelos. Creio que devo testar novos algoritmos também incluindo Neural Network.
- A primeira versão do projeto desenvolvida para corridas não virtuais foi um passo importante de aprendizado para o desenvolvimento da segunda versão com foco em corridas no Zwift. Mas ela hoje está bem desatualizada, tenho planos para revisitá-la assim que as corridas voltarem a ocorrer e aplicar todo conhecimento adquirido na ZRace.
- Analisando o gráfico de importância do modelo RF, uma variável me deixou bastante intrigado. O peso do atleta tem um alto fator nas decisões do modelo. Teoricamente sabemos da importância do W/kg e FTP no ciclismo, mas o peso por si só é uma nova informação. Será que explorando os dados posso chegar ao peso ideal de um super ciclista? Caso eu chegue a uma resposta, este pode ser assunto para um próximo artigo.
- Até o momento todo feedback sobre a ferramenta e os benefícios das informações apresentadas por ela aos atletas antes e depois das corridas são positivos. E isso é bem recompensador. Por favor, fique a vontade para comentar, sugerir mudanças, funcionalidades, entre outros. Todo feedback é bem vindo.