Pour aller plus loin

Nous avons vu avec les modèles SVM, les réseaux de neurones et le Learning To Rank, que nous pouvons obtenir des performances intéressantes pour la classification des chevaux et leur ordonnancement, grâce aux avancées fournies par le Machine Learning.
Il reste cependant beaucoup à faire pour améliorer et utiliser ces modèles au sein de stratégies de jeu performantes.
Voici ci-dessous quelques pistes de réflexion pour aller plus loin:

1/ SVM et les réseaux de neurones ont été ici privilégiés pour leur capacité a priori à bien performer sur ce type de problème. Mais avec plus de temps il serait malgré tout intéressant de tester d’autres modèles de machine learning comme par exemple les forêts aléatoires, K plus proches voisins, XGBoost etc.. et de comparer les performances.

2/ Il serait intéressant que ce soit pour les modèles SVM, les réseaux de neurones ou le Learning To Rank, de voir comment les performances évoluent lorsqu’on réduit le jeu de donnée à des courses à plus fort rapport.
Il faut en effet trouver le bon équilibre entre obtenir un bon taux de prédiction et obtenir un rapport minimum, pour avoir un modèle réellement performant en terme de gains, car prédire les gagnants que tout le monde prédit et qui rapportent donc peu, a un intérêt plus limité. Idéalement, il faudrait même que le score qu’on cherche à optimiser prenne directement en compte cette notion de rapport.

3/ Pour tenter d’augmenter les taux de bonne classification, on pourrait chercher à intégrer dans notre dataset d’autres données qui n’y sont pas aujourd’hui mais ont potentiellement de l’intérêt, comme par exemple:

  • Chronomètre du cheval, aussi appelé réduction kilométrique (meilleur, ou bien sur les X dernières courses), et pouvant aussi être pris sur les mêmes conditions de la course: sur même hippodrome, sur état du terrain similaire, sur distance égale
  • Indicateurs sur les gains passés: Gains cumulés (carrière ou année), retard de gain oui/non..pour les chevaux en premier lieu mais aussi pour les jockeys et entraîneurs, et en distinguant éventuellement ces données par hippodrome
  • Indicateurs de forme (performances récentes de chaque partie prenante): Forme jockey, Forme cheval, Forme entraîneur
  • Ecart (nombre de courses depuis la dernière course gagnée)
  • Distance parcourue par le cheval pour venir à la course (on peut supposer que plus elle est importante, plus l’entraîneur a confiance en les chances de son cheval-surtout si l’entraîneur amène un seul cheval)
  • Des données spécifiques aux conditions de la course comme: meilleure performance sur cet hippodrome, meilleure performance sur le même type de terrain etc..
  • etc..

A l’inverse, les variables ayant peu ou pas d’influence dans nos modèles pourraient être écartées du dataset pour simplifier la préparation des données pour les chevaux d’une nouvelle course que l’on veut analyser, et également pour réduire les temps de calcul lors du réapprentissage pour l’amélioration et la mise à jour de nos modèles (il faut en effet régulièrement vérifier qu’avec des données plus récentes nos modèles sont toujours performants, et les réentraîner si nécessaire).

Dans tout cela, nous devons garder à l’esprit que même si nous arrivons à rajouter certaines données dans notre dataset, il y aura toujours des données que nous n’aurons pas, soit parce qu’elles ne sont pas disponibles ou récupérables, soit tout simplement parce qu’elles ne sont pas tangibles et sont donc inexistantes.
En effet les facteurs pouvant potentiellement influencer les résultats des courses de chevaux sont multiples et complexes. Par exemple, on ne trouvera jamais la donnée indiquant la stratégie d’un entraîneur de ne pas réellement faire courir son cheval pour faire descendre son handicap et/ou le préserver pour une course à venir. De même qu’on ne pourra jamais prédire les incidents de course pouvant impacter les meilleurs chevaux. Bref, il peut être intéressant d’étendre le périmètre de données, mais en étant sélectif sur quelques données ayant un réel potentiel, il ne faut pas perdre son temps à collectionner les données.

4/ Pour la partie réseaux de neurones, comme nous l’avons vu, les modèles à tester sont infinis, en jouant sur le nombre de couches cachées, leur taille, et les fonctions d’activation. On pourrait procéder à tâtons, par exemple par dichotomie sur le nombre de couches et leur taille, pour voir comment évolue la performance (et la stabilité qui reste un point à travailler sur ce 1er réseau étudié) lorsqu’on joue sur ces paramètres.
Nous pouvons aussi imaginer une autre architecture, avec un réseau de neurones auquel on fournit en entrée tous les chevaux d’une course (soit k vecteurs de n features), et où nous obtenons en sortie les probabilités de victoire de chaque cheval de la course (à l’aide d’une fonction finale softmax qui transforme les scores de chaque cheval en probabilités).

5/ On peut également chercher à isoler certains périmètres de courses sur lesquels on obtient de meilleurs taux de classification: tout d’abord en fonction des disciplines (on a ici surtout travaillé sur les courses de trot attelé, mais le principe est le même pour les autres disciplines comme le plat), ou alors en fonction d’autres critères comme par exemple l’hippodrome.

6/ Nous avons ici travaillé en première approche sur une classification binaire (gagnant/pas gagnant).
Il serait intéressant de travailler sur une classification multi-classes en prenant comme classes les classes 1,2,3,4,5 pour les 5 premières places à l’arrivée, et par exemple en convention la classe 0 pour les non classés (placés après la place 5).
L’idéal étant d’obtenir pour chacune de ces classes une probabilité (mais on a vu pour SVM que la méthode de Platt scaling avait des limitations pour cela), car on pourrait ainsi jouer uniquement les chevaux ayant une forte probabilité, mais aussi obtenir une matrice de probabilité et ainsi générer nos grilles sur différents paris (pas uniquement le simple gagnant) selon cette matrice.
Pour contourner ce problème, on peut également chercher à résoudre non pas un problème de classification mais de régression, c’est à dire prédire une valeur continue entre 1 et 9 indiquant la place à l’arrivée. Il peut être même plus simple d’attribuer une note par place avec 0 pour les non placés, 1 pour le 5ème, 2 pour le 4ème etc.. jusqu’à 5 pour le premier, et de chercher à prédire cette note, et d’ordonner les chevaux par notre décroissante. Cela revient alors à faire du Learning To Rank « pointwise ».
En faisant pour chaque cheval le rapport avec les notes des autres chevaux de la course, on peut également ramener ces valeurs à une probabilité, et ainsi répondre à notre objectif de prédiction de probabilités, qui permet de répondre à tous les problèmes.
De façon à répondre à la problématique des rapports (cotes) évoquée dans le point 2/ ci dessus, on peut alors également calculer un score en multipliant la probabilité avec le rapport probable (cote), et ainsi parier uniquement sur les chevaux ayant un score suffisamment élevé. Un autre axe de travail à ce stade pourra être aussi de comparer ce score à celui obtenu en visant le pari simple placé, où on aura cette fois un rapport plus faible, mais des performances de modèles certainement meilleures (on devra adapter nos modèles basés sur la classification gagnant/pas gagnant pour cette nouvelle problématique).

7/ Comme nous l’avons vu un problème majeur dans la modélisation avec SVM et réseaux de neurones est qu’on regarde les données du cheval indépendamment des autres chevaux d’une même course, or même si un cheval est « bon » d’après ses features, il peut y en avoir un meilleur que lui dans la même course. Inversement tous les chevaux au sein d’une même course peuvent être « mauvais » en comparaison d’autres chevaux du dataset, mais il y en a toujours un qui gagnera la course ! Le Learning To Rank paraît donc plus adapté et plus naturel pour traiter notre problématique. Mais pour le rendre encore plus pertinent et potentiellement augmenter sa performance, il faudrait pouvoir lever les 2 limitations que nous avons rencontrées sur cette première tentative avec la méthode Pairwise:

  • Pouvoir utiliser des données catégorielles et pas uniquement des données numériques, afin d’exploiter les features catégorielles des chevaux
  • Pouvoir prendre en compte une métrique d’évaluation telle que le NDCG directement dans l’apprentissage et le test du modèle; dans ce que nous avons fait avec Pairwise, on peut simplement « compter » les paires bien ordonnancées (et on doit les avoir toutes bien ordonnancées pour considérer que la prédiction est bonne), on perd donc la notion de valorisation de la bonne prédiction des chevaux aux premiers rangs, et de prédiction satisfaisante si on trouve un ordre proche de l’ordre réel.
    Pour cela il semble que le framework lightGBM soit intéressant à explorer.
  • On pourrait même imaginer, même si cela devient encore plus complexe, prendre en compte les rankings passés, c’est à dire les résultats des confrontations entre chevaux sur les mêmes courses. Afin d’avoir assez de données, on pourra compléter ces confrontations par des confrontations « intermédiaires » (si le cheval A n’a jamais concouru contre le cheval C, mais que le cheval A a battu le Cheval B et que le cheval B a battu le cheval C, on peut conclure en approximation que le cheval A bat le cheval C). Une approximation pour prendre en compte ces rankings passés peut être l’utilisation d’un score ELO (constitué par gain/perte de points pour chaque confrontation entre 2 chevaux, comme aux échecss).

Une fois les modèles optimisés, il sera possible de définir et évaluer des stratégies de jeu globales, utilisant les prédictions de ces modèles pour les combiner avec les analyses, outils et méthodes de backtest présentés sur ce site.
N’hésitez pas à apporter en commentaire votre vision sur ces sujets, et les étapes que vous poursuivriez à ce stade.