Loto Deep Learning

Le Deep Learning et le hasard – Prédiction du Loto

L’étude mathématique de la loterie est aussi ancienne que les mathématiques. On peut citer les travaux de Leonard Euler qui ont conduit à la théorie de la probabilité de Kolmogorov [Kolmogorov, 1933]. À ce jour peu d’ouvrages existent sur la résolution du problème très difficile voire impossible de prédire des tirages de numéros de loterie à cause de l’indépendance des tirages (aléatoires) et donc de l’inexistence de patterns à apprendre pour les modèles.

Une grande question me vient alors en tête : et si malgré leur caractère aléatoire, les boules lors des tirages se retrouvent dans les mêmes positions que certains tirages passés, et sont mélangés à la même vitesse, ces informations ne peuvent-elles pas permettre à des modèles d’apprendre ces patterns et nous conduire à prédire les prochains numéros tirés ?

L’apprentissage profond a prouvé ses capacités dans la résolution de nombreux problèmes différents, qu’il s’agisse de la reconnaissance vocale, la reconnaissance d’images ou encore la reconnaissance d’écriture manuscrite. Ses algorithmes dont la structure est inspirée du fonctionnement du cerveau humain sont capables de capturer la structure sous-jacente de n’importe quel jeu de données avec des résultats très concluants.

Ainsi l’objectif de cet article est de montrer les résultats de l’apprentissage profond sur un cas concret de hasard.

Pour ce faire je présenterai dans cet article un modèle de prédiction des tirages du loto français en utilisant les tirages du passé comme données d’apprentissage.

Généralités et présentation du loto français

Le Loto est un jeu célèbre qui fait appel au hasard. Celui-ci est tellement répandu dans le monde entier que même les petits états comme le Vatican dont la papauté était initialement contre les jeux d’argent et de hasard, dispose aujourd’hui de leur propre loto permettant de lever des fonds pour des actions caritatives.[1] La dynastie Han a même utilisé les bénéfices du loto pour financer la grande muraille de chine.[2]

Le principe de la loterie est très simple : les gens achètent un ticket qui correspond à un pari combiné sur un ensemble général de chiffres. Un tirage au sort sans remise est finalement effectué à une date et une heure fixes. Les gains sont liés à la façon dont la combinaison correspond au tirage au sort. Le jackpot est gagné si la combinaison est correcte.

Dans cet article, je me concentrerai sur le loto français.

Pour jouer, il suffit de cocher 6 numéros :

  • 5 numéros sur une grille de 49 numéros
  • 1 numéro de chance sur une grille de 10 numéros

Le jackpot est remporté si on a parié les 5 bons numéros plus le numéro de chance.

Le prix d’une grille est de 2,20 € et le jackpot minimum est de 2 millions d’euros.[3]

Collecte des données et calcul de features

Les données ont été scrapées sur le site de la française des jeux (fdj) qui recense tous les tirages du loto depuis 2008 à ce jour. Le dernier tirage à la date de rédaction de cet article datait du 21 octobre 2020 avec un total de 1921 tirages entre le 6 octobre 2008 et cette date.

Obtention dataset

La prédiction des numéros de loto est une tâche supervisée : les tirages du passé sont utilisés comme données d’entrées en supposant les tirages dépendants même si ce n’est pas le cas dans la réalité. Ainsi en apprenant ces numéros du passé, on suppose que ce sont des numéros obtenus à partir d’une certaine position initiale des boules dans l’urne et un mélange à une certaine vitesse.

Les données que j’ai retenues après calcul pour chaque tirage sont :

  • Le nombre de fois que chaque numéro est apparu dans les tirages précédents
  • La présence de nombre pair ou impair
  • La somme de la différence au carré entre chaque couple de numéros successifs dans le tirage
  • Le nombre de numéros en dessous de 24
  • Le nombre de numéros en dessous de 40
Code dataset

Modèle

Les réseaux de neurones récurrents (RNN) se sont révélés comme étant l’un des modèles les plus puissants pour le traitement de données séquentielles. La mémoire à long court terme est l’une des architectures RNN la plus réussie. LSTM introduit la cellule mémoire, une unité de calcul qui remplace les neurones artificiels traditionnels dans la couche cachée du réseau. Avec ces cellules de mémoire, les réseaux sont capables d’associer efficacement des mémoires et d’entrer dans le temps, ce qui permet de saisir la structure des données de manière dynamique dans le temps avec une capacité de prédiction élevée.

Architecture du LSTM
Architecture d’un LSTM [4]
\[f_t=\sigma(w_f[h_t-1, X_t]+b_f)\] \[i_t=\sigma(W_I[h_t-1, X_t] + b_i)\] \[c_t=tan(W_c[h_t-1, X_t] + b_c)\] \[O_t=\sigma(W_o[h_t-1, X_t] + b_o)\] \[C_t=f_t*C_t-1 + i_t*c_t\] \[h_t=O_t*\tanh(C_t)\]
– \(f_t\) : Porte d’oubli, décide s’il faut remettre à 0 le contenu de la cellule.
– \(O_t\) : porte de sortie, décide si le contenu de la cellule doit influer sur la sortie du neurone.
– \(i_t\) : Porte d’entrée, décide si l’entrée doit modifier le contenu de la cellule.

[5]

– \(C_t\) : Mise à jour de l’état de la cellule.
– \(h_t\) : Sortie de la cellule.

Formation du réseau

Notre modèle LSTM est composé d’une couche d’entrée séquentielle suivie d’une couche LSTM et d’une couche de sortie dense avec fonction d’activation linéaire.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pickle
from sklearn.preprocessing import StandardScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, Bidirectional, TimeDistributed, RepeatVector, Flatten
from keras.callbacks import EarlyStopping

UNITS = 100
BATCHSIZE = 30
EPOCH = 1000
#ACTIVATION = "softmax"
OPTIMIZER ='adam' # rmsprop, adam, sgd
LOSS = 'mae'#'categorical_crossentropy' #mse
DROPOUT = 0.1
window_length =12 #12 
number_of_features = df.shape[1]

#Architecture du modèle
def define_model(number_of_features,nb_label_feature):
    #initialisation du rnn
    model = Sequential()
    #ajout de la premiere couche lstm
    model.add(LSTM(UNITS, input_shape=(window_length, number_of_features), return_sequences=True))
    model.add(LSTM(UNITS, dropout=0.1, return_sequences=False))
    #ajout de la couche de sortie
    model.add(Dense(nb_label_feature))
    model.compile(loss=LOSS, optimizer=OPTIMIZER, metrics=['acc'])
    return model

Optimiseur

J’ai choisi d’utiliser l’optimiseur Adam. L’optimiseur Adam combine les avantages de deux autres optimiseurs : ADAgrad et RMSprop. Cette méthode calcule les taux d’apprentissage adaptatif pour chaque paramètre en considérant la moyenne en décroissance exponentielle des gradients carrés passés et la moyenne en décroissance exponentielle des gradients passés.[6] Cela peut être représenté par :

Optimimiseur

Où v et m peuvent être considérés comme les estimations du premier et du deuxième moment des gradients respectivement, d’où le nom d’estimation de moment adaptatif.[7]

Les avantages de cet optimiseur sont résumés comme suit :

  • Le taux d’apprentissage est différent pour chaque paramètre et chaque itération
  • L’apprentissage ne diminue pas comme avec l’ADAgrad
  • Une descente plus solide d’un point de vue statistique.[6

Entraînement

Avant d’entraîner un modèle LSTM, il faut une préparation minimum de la donnée afin de s’accommoder à la dimension voulue par les RNNs en particulier le LSTM. En effet, la donnée en entrée doit avoir trois dimensions (samples, timesteps, feature).

  • Samples désigne le nombre d’échantillons ou d’observations
  • Timesteps est le pas de temps
  • Feature est le nombre de caractéristiques ou de variables à étudier

Ainsi pour notre suite de tirage, j’ai dû implémenter une fonction permettant de transformer la séquence initiale à la forme attendue en entrée du LSTM en choisissant un timesteps sur un mois soit 12 tirages car trois tirages sont réalisés par semaine pour le loto français.

Par exemple pour la première séquence de 13 tirages \(S=[t_1, t_2, t_3, …, t_{13}]\)
L’entrée \(X = [[t_1], [t_2], [t_3], [t_4], …, [t_{12}]]\) avec \(X\) de la forme \((1, 12, 19)\) car ayant \(19\) features calculés au total pour chaque tirage
La sortie \(Y = [[t_{13}]]\) avec Y de la forme \((1,1,6)\) car l’on désire ici prédire les bons numéros du tirage \(13\).

On peut donc concrètement représenter les entrées et sorties à partir des 13 premiers tirages avec des LSTM comme suit :

Architecture des entrées et sorties LSTM des 13 premiers tirages
Architecture des entrées et sorties LSTM des 13 premiers tirages

où les xi représentent les différents tirages.

Une fois l’architecture de mon modèle LSTM prête, il ne reste qu’à entrainer le modèle.

Pour ce faire, mon dataset d’entrainement est constitué de tous les tirages scrapés et ma donnée de test représente le prochain tirage.

C’est à dire que j’entraine le modèle sur toutes les données disponibles, et j’effectue une prédiction sur le prochain tirage qui représente ma donnée de test. Je procède de la sorte afin de m’assurer qu’à chaque tirage, le modèle ait appris du tirage précédent. Ainsi à chaque nouvelle date de tirage, un nouveau modèle est entrainé. Cette méthode a fait ces preuves, dans la mesure où j’arrive très souvent à prédire 3 numéros parmi les 6 tout en étant proche des autres numéros non trouvés. Voyons un exemple concret.

Résultats d’apprentissage sur le tirage du 21 octobre 2020

Pour ce test j’ai commencé par supprimer du dataset d’entraînement le tirage du 21 octobre afin de l’utiliser comme donnée de test.

Le modèle converge après 830 epochs avec une précision de 92% sur les données de train.

Epochs
Epochs

Résultats de prédiction pour le tirage du 21 octobre 2020

Résultats

Le résultat officiel du tirage du 21 octobre 2020 sur le site de la fdj est donné par les numéros suivants : [15 21 33 35 48 01]. [8]

Et comme vous pouvez le constater le modèle prédit bien 3 numéros à savoir le 15 le 21 et 1 pour le numéro de chance.

Résultats de prédiction pour le tirage du 24 octobre 2020

Résultat

Le résultat officiel du tirage du 24 octobre 2020 sur le site de la fdj est donné par les numéros suivants : [4 8 12 25 45 02]. [9]

Comme vous pouvez le constater pour ce tirage le numéro 8 a été bien prédit par contre deux autres numéros dont le 3 et le 46 sont très proches du vrai résultat respectivement à une somme et différence près de 1.

Jusque-là mon modèle n’arrive qu’à prédire au maximum pour certains tirages 3 bons numéros sur 6 ou s’en rapproche ce qui permet d’évaluer sa précision globale sur le loto français à ce jour à 50%.

Remarque

Le réapprentissage du modèle sur les mêmes données d’apprentissage risque de donner une prédiction différente s’approchant encore plus du vrai tirage ou même s’en éloignant. Quelqu’un me dira mais pourquoi ne pas effectuer une cross-validation sur le training set afin d’avoir un modèle robuste qui prédira toujours la même sortie même après plusieurs entraînements du modèle sur les mêmes données ?

Le principe même de la validation croisée qui consiste à diviser le dataset en plusieurs portions et d’utiliser de manière itérative chaque petite portion comme valeur de test et les grandes comme valeurs de train en supposant que les échantillons sont indépendants n’est pas adapté aux LSTM qui apprennent des valeurs historiques pour prédire l’avenir. Je laisse cette question ouverte à tout commentaire 😃

Conclusion

En dépit de l’indépendance des tirages, le modèle LSTM arrive très souvent à prédire certains bon numéros en supposant que ceux-ci sont dépendants. Ces résultats proviennent-ils du hasard ? non je ne pense pas. Plus de travail est nécessaire pour optimiser le modèle afin de pouvoir éventuellement remporter le jackpot un de ces jours. J’envisage par exemple de personnaliser le calcul de l’erreur en prenant en compte les erreurs de prédictions qui se traduisent par de petites différences de 1 ou 2 en plus ou en moins.

Le code du modèle est disponible ici.

N’hésitez pas à laisser votre avis si vous avez aimé cet article 😊

127 réflexions sur “Le Deep Learning et le hasard – Prédiction du Loto”

  1. Bonjour,

    Tout d’abord je tiens à vous remercier pour cet article fort intéressant !

    Je vous ai écrit il y a quelques temps à votre adresse e-mail mais n’ai pas eu de retour, vous n’avez peut être pas vu 🙂

    Bien à vous,
    Arnaud

  2. Bonjour,
    Merci beaucoup pour cet article passionnant qui m’a permis d’avoir un premier aperçu de ce genre d’analyse.
    Je vous ai envoyé un mail il y a quelques jours afin d’obtenir le code source, histoire de mieux comprendre le fonctionnement du depp learning.
    En espérant avoir de vos nouvelles et de nouveaux articles à lire prochainement.
    A bientôt !

  3. Re-bonjour,
    Petite question en attendant d’avoir le script, quel paramètre d’activation utilisez-vous en entrée et sortie ? Sur votre schéma de l’architecture LSTM, vous indiquez la fonction tanh tandis que dans l’image de votre script, on peut voir en commentaire la fonction softmax ?
    La fonction softmax ne semble pas être le meilleur choix puisque le tirage d’une boule n+1 constitue une probabilité conditionnelle après tirage de la boule n).

  4. Bonjour,
    Merci pour ce coup d’oeil,
    J’utilise bien la fonction tanh qui est la fonction d’activation par défaut utilisée pour LSTM dans keras. La softmax en commentaire est un test que j’ai oublié de supprimer et comme vous pouvez le voir je n’utilise pas la variable ACTIVATION dans la définition du model (:

    Pour le code je pense avoir répondu à tous les mails reçus ce week-end. Si ce n’est pas le cas pour vous veuillez juste m’écrire à l’adresse wilfriedkouadio3009@gmail.com

    cdt,
    Wilfried

  5. Bonjour,
    Merci beaucoup pour votre réponse, à la lecture de l’exemple je m’étais posé la question.
    Du coup non, moi je n’ai pas reçu le code. Je vous renvoie un mail de ce pas 🙂 J’aimerai beaucoup regarder d’un peu plus près la méthode que vous utilisez. J’ai trouvé d’autres scripts sur le net qui proposent des méthodes différentes (dont un qui est particulièrement bien expliqué). L’étude combinée de ces deux méthodes me permettra de progresser.
    Merci encore pour votre retour
    Doc.

  6. Bonjour,
    Une remarque: vous fixez des conditions au départ (pair inférieur à… etc..), je pensais que l’ IA « apprenait » à chaque nouveau tirage et en tirait SES conditions?
    J’aimerais recevoir votre code merci
    Cordialement
    À.

  7. Bonjour,
    je pensais que l’analyse IA apprenait SES paramètres au fur et à mesure des tirages, or je vois que vous lui donnez des paramètres au départ {pair, inférieur à…etc), ce qui ressemble à une simple analyse statistique (ce qui sort le plus souvent)?

    J’aimerais bien recevoir votre code, merci
    Cordialement.

  8. Bonjour , Après de nombreux mails envoyés , je n’ai toujours pas le code . Quelqu’un d’entre vous a eu la chance de le recevoir ?
    Si Oui peut-il me l’envoyer ?

  9. Bonjour Ferd,
    Désolé de vous répondre que maintenant, j’ai du manquer vos maills précédents étant donné que je reçois beaucoup de demandes.
    Je viens de vous l’envoyer. Pouvez vous confirmer que vous l’avez bien reçu?

    Par ailleurs, pour tous ceux qui ne l’ont pas encore reçu, veuillez patienter un tout petit peu car à cause du grand nombre de demandes , je suis en train de déployer le code afin qu’il soit accessible à tous (:

    1. Bonjour,
      J’ai lu l’article et je suis très intéressé à essayer de comprendre son fonctionnement. Je vous serais très reconnaissant si vous pouviez me donner le code source.
      Merci beaucoup

  10. Bonjour Alea,
    Ce ne sont pas des conditions de départ mais des features calculées à partir des numéros (statistiques comme vous l’avez mentionné dans votre deuxième commentaire) qui permettent aux modèles de mieux apprendre des caractéristiques des numéros des tirages en entrée.

    Pour le code je viens de vérifier ma boîte mail et je ne trouve aucune demande associée à votre nom.
    Veuillez m’écrire en mentionnant votre pseudo.

    Bien à vous.

  11. Bonjour Doc,
    J’ai bien reçu votre mail ainsi que l’article traitant du même sujet qui est tout aussi très interessant.
    Pouvez vous me confirmer que vous avez bien reçu le code?

    Bien à vous.

  12. Bonjour,

    Comment faite vous pour gérer la dernier entrée X ? Elle n’est pas de la même taille que les autres ? Faites vous des paquets de 12 « glissants » ?

    merci d’avance,

  13. bonjour je vous ai envoyé plusieurs mails et essayé de vous joindre via ce site pour avoir le code. Ce-serais possible de me l’envoyer ?

    Merci d’avance

  14. Bonjour, article très intéressant. Si vous pouvez m’envoyez votre code, ca m’aiderait à comprendre la méthode. je vous ai envoyé un mail pour vous le demander, mais il a du se perdre dans tous ceux que vous recevez 🙁 . Merci d’avance !

    1. Bonjour, je suis un amateur des statistiques et j’ai ramassé une base de données des tirages du loto du monde ( 6 49 ) et je suis intéressé par votre programme.

  15. Bonjour,

    Merci pour cet article très intéressant, je vous ai déjà envoyé un mail mail je réitère par le biais de ce commentaire : est il possible d’avoir le code complet svp? merci
    bien cordialement

  16. Bonjour,

    Votre article est très intéressant, je suis moi même intéressé pour recevoir le script complet.
    Je vous ai envoyé un email.

    Merci par avance

  17. Salut
    Merci pour ce super tuto, par contre je rentre une erreur à la fin je ne sais pas pour qu’elle raison :
    —-> 5 print(scaler.inverse_transform(scaled_predicted_output_1).astype(int)[0])

    NameError: name ‘scaled_predicted_output_1’ is not defined

    aurais tu l’explication stp ? probleme de déclaration ?

    par avance merci
    bien à toi

  18. J’ai testé votre code, il est intéressant par contre, j’ai l’impression que c’est instable. Pour la meme prediction du 21 octobre 2020, j’ai un resultat totalement different du votre. De meme si on rejoue l’algorithme le resultat est encore different, et il est tres loin du resultat escompté. Parfois, il prédit même des valeurs au dessus de 49. je me suis retrouvé avec une valeur de 51. Je me pose la question, si il existe reellement un model predictif car les tirages sont censés etre des evenements aleatoires. J’ai essayé d’optmiser la window_size et nb_unit en utilisant les algo genetiques mais sans succes. Avez vous par exemple, essayer de jouer l’ago plusieurs fois sur un meme tirage ? Avez vous eu la meme prediction sur celui-ci?

  19. Bonjour Jarod,

    En effet j’ai noté cette instabilité dans l’article en remarque et j’ai laissé la question ouverte à ce sujet. C’est l’un des gros problème du Machine Learning. Pour espérer avoir un modèle robuste qui donne les mêmes résultats après le réentrainement sur les mêmes donnés il faudrait effectuer une validation croisée.

    Le principe de la validation croisée consiste à diviser le dataset en plusieurs portions et utiliser de manière itérative chaque petite portion comme valeur de test et les grandes comme valeurs de train.
    Dans notre cas, supposer que les échantillons sont indépendants n’est pas adapté aux LSTM qui apprennent des valeurs historiques pour prédire l’avenir.
    Du coup cette instabilité existera toujours à moins de trouver un moyen efficace de rendre le modèle plus robuste.
    Il y a encore du travail pour espérer remporter le Jackpot un de ces jours. (:

  20. Bonjour, merci pour cet article fort intéressant. Je pense que ça pourrait fonctionner sur des combinaisons générées de façon pseudo-aléatoire (tirage numérique)
    Mais malheureusement, la procédure de tirage du loto comporte des paramètres physiques qui rendent les combinaisons réellement aléatoires : les balles sont placées manuellement dans la sphère (donc agencées de manière aléatoire), la durée entre le début du brassage dans la sphère et le tirage d’un boule n’est pas toujours identique, etc.

  21. J’ai testé votre code sur euromillion (apres adaptation), du coup apres avoir essayé plusieur méthodes (adam, rmsprop, et d’autres) et en essayant de jouer sur les données d’entré, j’ai pu avoir une accuracy de 97%, 98%,

    par exemple sur le tirage du vendredi passé ([49,12,50,10,37 || 8,3]) j’ai pu avoir les resultats suivants ; [10, 11, 36, 50, 49] [8 3] ce qui est tres tres proche.

    Ma question: Comment je fais pour qu’il puisse prédire les prochains tirage s’il vous plait? pas le dernier… Merci encore à vous pour votre travail

    1. Bonjour Said,

      Le processus pour prédire les prochains tirages est le même que celui décrit dans l’article qui prédit uniquement le prochain tirage sur base des résultats précédents.

      D’après votre question, si vous voulez prédire les 3 tirages suivant au lieu d’un seul tirage, le plus simple serait de faire 3 prédictions successives dont la première prédiction se basera sur les vrais résultats, la seconde sur votre première prédiction et la dernière sur votre deuxième prédiction. Dans ce cas les résultats obtenu risques d’être moins pertinants car les deux tirages suivants seront sur base de prédictions et non des vrais résultats selon l’hypothèse de départ.

      Une deuxième approche plus complexe serait d’adapter l’entrainement du modèle aux nombre de sorties(tirages suivants) que vous voulez obtenir

      Bien à vous,

      1. Merci Wilfried pour vos explications, au fait sur votre code, il prédit le dernier tirage déja joué (pour tester ses prédictions)
        Mais ce que je veux c’est de prédire le PROCHAIN Future tirage, j’ai pas pu le faire :/ , j’ai ajouté une dernière ligne des zero mais ça n’a pas marché , j’ai essayé d’injecter le dernier tirage prédit dans la valeur « tom » pour faire la prédiction ça n’a pas marché

        Merci pour vos réponses. (je serai ravi de vous partager ce que j’ai fait)

        1. Bonjour Said,
          Mon code de base prédit le prochain tirage et non le tirage déjà joué, si vous avez bien suivi les étapes du code vous devriez avoir le prochain tirage et non celui déjà joué comme vous le décrivez dans votre message.

  22. Bonjour,
    Est-ce qu une âme charitable, pourrais expliquer pour les non initiés cimme moi comment utiliser le code de M. Wilfried , s’il vous plaît ?
    Quel logiciel utilisé ? Est-ce qu’un copier-coller du code suffit ? Faut il rattaché une base de données « genre un fichier excel des tirages précédent ? Si oui sur quelle ligne de code je fais le changement ?

    Je sais ça fait beaucoup de questions, et je vous remercie d’avance pour tout ceux qui prendront le temps d’y répondre.

    Encore bravo M. Wilfried pour votre travail 👏👏

    1. Bonjour Laure

      Vous pouvez utiliser « jupyter-notebook », essayer de voir sur google comment l’installer et l’utiliser, une fois installer, installez les librairies qui viennent avec.
      vous avez rien a faire a part l’executer parce qu’il récupére la base de donnée automatiquement sur internet

      donc installer déja jupyter-notebook via ces commandes : https://janakiev.com/blog/jupyter-virtual-envs/

      apres installer les librairies manqantes dans votre environnement virtual que vous avez crée (à l’étape précédente) et apres vous lancer le code du Monsieur Wilfried

    2. Bonjour Laure,

      1 – Tu peux l’utiliser directement le code il est fonctionnel en installant ce logiciel « jupyter-notebook », cella une procedure facile pour l’installer https://janakiev.com/blog/jupyter-virtual-envs/

      2 – Oui il vous suffit juste de faire un copier coller, le code est complet et il récupére la base de donnée automatiquement qui contient tout les autres tirages,

  23. Bonjour Wilfried,

    Un grand merci pour votre travail. Je fais un peu l’équivalent sous VB avec une dizaine de tests.

    J’ai une question: mon programme me donne un prochain tirage » possible » à partir de données comme celles que vous utilisez (nb pairs, nb dans une plage précédente, nb inférieur à x…etc), sauf que des combinaisons répondant à ces critères existent par milliers (sur 2 millions possibles).

    Comment votre programme détermine que c’est telle combinaison qui sera la suivante?

    Merci de votre réponse.

    Cordialement.

    1. Bonjour Hugues,

      La réponse à votre question réside dans le principe même du « Machine Learning »( Utilisé dans cet article) qui consiste à prédire un phénomène à partir d’observations passées grâce à des modèles(ce sont ces modèles mathématiques qui font le boulot).
      C’est ce que j’applique ici en entrainant un modèle qui à partir des statistiques sur les tirages passés estime un « prochain tirage possible ».

      Bien à vous,
      Wilfried.

  24. Bonjour et merci pour votre réponse.
    J’ai téléchargé python 3.8 ainsi que l’environnement tensor+keras dans Anaconda Navigator mais à chaque exécution de Jupyter note, il me dit que « keras » n’est pas trouvé (incompatibilité avec python 3.8 apparemment), quelqu’un aurait-il python 3.6? (lien ou envoi si possible svp)
    Merci et bonne journée à tous.
    Hugues

    ps: je peux vous communiquer (via mai)l quelques « tests » supplémentaires qui apparemment sont significatifs si vous le souhaitez. Je ne saurai les appliquer moi-même dans votre programme.

    1. Bonjour

      installe python 3.6 , puis dans un nouvel environnement dans anaconda , puis sur le menu de gauche dans anaconda navigator , tu peux installer les bibliothèques qui te manque

    2. Bonjour Hugues,

      Une alternative à ces problèmes de compatibilité serait d’exécuter le code sur Google Colab où tous les packages nécessaires sont déjà installés avec du GPU à disposition qui accélère l’exécution.

      Pour vos tests, j’aimerais bien les voir, vous pouvez me les envoyer à l’adresse suivante: wilfriedkouadio3009@gmail.com

      Wilfried

  25. Bonjour Olivier,

    Merci pour ce lien utile à tous.

    Ce matin, j’ai tenté avec anaconda 3.8.

    J’ai créé un environnement en downgradant vers 3.7 avec tensorflow 2.2.0 intégrant keras + bs4
    j’ai fait « INSTALL » dans le navigator sous cet environnement d’où je lance Jupyter notebook.

    Le notebook fonctionne bien jusqu’à l’entrée 14 avec l’erreur « notimplementederror » … là je sèche…

    Si quelqu’un a une solution…
    je mets une copie écran.
    https://www.cjoint.com/c/KDyltlf5eg1

    Ce sera intéressant pour ceux qui voudront ensuite installer sous anaconda 3.8….

    Bon we,

    Hugues

    1. Bonjour,

      J’ai réussi à fixer ce problème en remplaçant NotImplementedError en ligne 845 du fichier « anaconda\Lib\site-packages\tensorflow\python\framework\ops.py » par TypeError.

      Essayes cette solution et tiens nous au courant.

      Mickael

  26. Bonjour Wilfried,

    Merci pour votre code, le sujet est très intéressant. Je me demandais néanmoins s’il était possible de rajouter un test set pendant la phase de training. J’ai également tenté une version pour prédire les résultats de l’euro million, mais malgré une accuracy de 95%, je crains d’être en situation d’overfitting. Avez vous une idée pour ce type de problème ?

  27. Bonjour Wilfried,

    Merci pour cet article fort instructif. Jai essayé d’adapter votre code à une version EuroMillions mais malgré une accuracy de 95%, je n’ai pas l’impression que les prédictions obtenus soient correctes. Est-t-il possible d’ajouter un test set pendant l’apprentissage pour éviter ce problème d’overfitting ?

    Merci

    1. Bonjour Jona, J’ai pu adapté aussi le code pour pouvoir le faire marcher sur Euromillions, par contre je tombe toujours sur du overfitting,meme si je met la patience à 10, et Dropout à 0.5, je souhaite savoir comment avez vous fait pour le parametrage svp ? de mon coté, j’ai remit le num_features = 7 et j’ai essayé d’apprendre sur des longeurs de 18 (windows_length) vu qu’il y a que 1400 tirage. Merci d’avance

    1. Bonsoir Doc,

      Merci de votre réponse. J’ai testé votre proposition mais plus le dropout est élevé moins l’accuracy est bonne.
      Avec un dropout = 0 j’ai accuracy = 97.9% (mais j’obtiens à peine 2 bons numéros)
      Avec un dropout = 0.1 j’ai accuracy = 93%~94% (pareil j’ai au maximum 3 bons numéros)
      Avec un dropout = 0.8 j’ai accuracy = 77%

      1. Bonjour Jona69,

        Bravo pour l’exercice d’adaptation du modèle à l’Euromillions. Il y a là plusieurs paramètres à prendre en compte pour améliorer votre modèle notamment la complexité car dans l’Euromillion il y a 7 numéros à prédire contre 6 dans le Lotto. Vous pouvez donc tester de nouvelles métriques pertinentes pour cerner le deuxième numéro de chance.

        Avec un Dropout de 0 et une précision de 97.9 vous êtes clairement en overfitting. je vous conseille de faire un GridSearch de vos valeurs afin de trouver celles qui performent le mieux sans overfitting.

    2. Merci de votre réponse Doc.
      J’ai essayé d’augmenter le dropout mais cela réduit l’accuracy (j’utilise dropout = 0.1)
      De plus lorsque je trace le graphique d’accuracy/epoch, la courbe est très instable et présente beaucoup d’oscillation

  28. Bonjour,

    Je voudrais savoir à quoi ça sert la fonction « EarlyStopping » dans le code ? Est ce qu’il y a moyen de l’optimiser ou autre, car pour le moment le calcul s’arrête pour moi vers EPOCH entre 700 et 800 seulement, rarement au dessus, du coup j’obtiens un accuracy de 91 ou 92% et je n’ai quasiment jamais 1 ou 2 numéro de bon qui sort au tirage… Donc voila, comment faire pour au moins avoir 2 numéros bons, voir 3 minimum à chaque fois ? Que faut il que je modifie ?

    Merci

    1. Bonjour Julia,
      EarlyStopping est une méthode qui permet de spécifier un grand nombre arbitraire d’EPOCH de formation et arrête la formation une fois que les performances du modèle cessent de s’améliorer. Dans votre cas le modèle cesse de s’améliorer entre 700 et 800 EPOCH.

      la réponse à votre deuxième question est tout simplement l’amélioration du modèle car comme spécifié dans l’article, les résultats de prédictions pour un même tirage varient a chaque nouvel apprentissage sur les même données ce qui le rend assez instable. ( Une personne peut donc lancer le modèle et avoir 1 à 3 numéros mais vous non). C’est l’un des grands défis du Machine Learning. Il faut donc encore beaucoup d’améliorations et réflexions pour approcher le Jackpot (:

  29. Bonjour Willfrid,

    Est ce que le fait qu’on a trié dés le debut les nombres pour chaque tirage n’influence t’il pas sur la prédiction? parce que le plus important dans le tirage c’est bien l’ordre d’apparition des boules ?

    Finalement mes résultats qui ont donnée 98% c’était du overfitting juste parce que les deux tirages étaient presque identiques, par contre pour contourner ça j’ai essayé d’augmenter le Dropout mais ça n’a pas donné de resultats non plus.

    Avez vous pensé à utiliser cette méthode développé par MIT: https://arxiv.org/abs/1803.03635 ?

    Cordialement.
    Merci enco

    1. Bonjour Said,
      Le fait que les numéros soient triés dès le départ influence effectivement le modèle puisque cela introduit une notion d’ordre que modèle apprend. Ce qui n’est pas le cas dans la réalité puisque les numéros tirés ne sont pas ordonnés de base. Malheureusement tous les sites qui recensent les résultats et que j’ai scrapé les trient dans l’ordre, ce qui m’a obligé à utiliser ces données ordonnés comme début pour mes tests . Je n’ai jusque là pas encore pu avoir les numéros dans le bon ordre de tirage pour réaliser de nouveaux tests.

      Avoir les numéros dans le vrai ordre de tirage pourrait effectivement améliorer le modèle en supprimant cette notion d’ordre même si l’objectif final est d’avoir tous les bon numéros .

      Pour l’article, merci pour le partage, je n’avais pas encore pensé à utiliser cette méthode.

      Cordialement,
      Wilfried

  30. Bonjour Wilfried,

    Hier soir, il y a eu un tirage « super loto ».

    Dans l’après-midi, j’ai voulu créer une base de « super loto » uniquement, pour lancer le programme.

    J’ai vu l’URL https…..dans le notebook, je voudrais savoir comment procéder pour modifier cette ligne du notebook (avec Word ?) pour changer l’adresse URL et comment créer une page avec un lien URL pour y mettre la base du super loto?

    Merci beaucoup et bon WE.

    Cordialement,
    Hugues

    PS: Comme vous, c’est le premier résultat du programme qui donne le meilleur pronostic (2 numéros souvent), si je relance le programme, même si le % de l’epoch est supérieur, le pronostic est plus mauvais…c’est bizarre non?
    Je pense aussi que certains tirages « atypiques » qui reviennent tous les 10 ou 15 tirages environ (de forme par ex 3 40 42 43 45 avec 4 quarantaines ou autres) « perturbent » l’apprentissage du programme, il faudrait peut-être les supprimer de la base et ne garder que la « normalité » ?

    1. Bonjour Hugues,

      Vous pouvez modifier l’url et tout mon code directement dans le notebook. Si vous le faites ( modification url), la suite de mon code ne sera pas adapté à votre url, il faudra donc en fonction du html de votre nouvelle page adapter le code. Concernant « word » c’est juste un éditeur de texte ( pas de code)

      Etant donné que les donnés scrapées sur le site(url dans le notebook) contiennent à la fois les données du « super loto » et ceux des tirages en semaine, pour créer une base de super loto il faudra tout simplement écrire une condition (code python) sur les données scrapées pour récupérer les jours de tirage de « super loto » ( jours différents du lundi , mercredi et samedi), les stocker dans un DataFrame et ensuite réaliser les traitements que vous voulez. Par contre je crains que vous n’ayez pas assez de données sur le super loto (nombre de tirage) pour permettre un bon apprentissage .

      Concernant votre deuxième question, si vous parlez bien de créer une page web pour y stocker la base du super loto, il faudra faire du développement web , autrement vous pouvez tout simplement les stocker dans un CSV si c’est pour un usage en local.

      Pour le phénomène des tirages qui changent pour différents apprentissages, c’est un phénomène propre au Machine Learning. Je confirme également que mes meilleurs résultats proviennent toujours des premiers apprentissages
      Pour le dernier point, je pense qu’il faudrait des tests approfondis pour vérifier votre hypothèse.

      Cordialement,
      Wilfried

  31. Bonjour Wilfried,

    Effectivement, j’avais du mal à trouver des sites qui proposent le vrai ordre de tirages, j’ai du les collecter manuellement depuis des fichiers CSV, voici le fichier qui contient le tirage avec le bon ordre, je vous le partage : https://drive.google.com/file/d/1hlERJ48Lrs5lu6cZMDX11eulIR6gkQ_a/view?usp=sharing

    Cependant, même avec celui la, je tombe sur du Overfitting, je vous laisse voir si ça améliore le modele, je vous prie de me tenir au courant sur mon mail : saidamirouche1@gmail.com

    Cordialement.
    Said

  32. Bonsoir Hugues et Said,

    Merci pour ces partages. Dans un soucis d’automatisation des traitements ,si jamais vous trouvez des sites qui collectent les numéros dans le bon ordre, je serai preneur.

    Cdt,
    Wilfried

  33. Bonjour,

    j’ai déjà posté un message sur ce fil la semaine dernière mais je ne le vois pas apparaitre (peut être parce que j’avais l’adresse de mon site internet).
    J’ai mis en place un script qui met à jour un fichier CSV disponible depuis mon site internet et qui contient tous les tirages du loto dans l’ordre de sortie des boules.

    Si vous êtes intéressés mon email : glubok arobase hotmail point fr

  34. Bonjour Wielfried,
    je me demandais comment remplacer le lien vers le site par un fichier CVS contenant les mêmes colonnes.
    De ce que je comprends Beautifulsoup parse une page web. Comment puis-je parser mon fichier ?

    Merci de votre guidance.

  35. Bonjour Wilfried,

    je cherche à faire la même chose que cette fonction

    #fonction de scraping des tirages du loto
    def scrap_loto_numbers():
    my_list=[]
    time.sleep(2)
    loto_url = « http://loto.akroweb.fr/loto-historique-tirages/ »
    page = requests.get(loto_url)
    soup = BeautifulSoup(page.text, ‘html.parser’)
    body = soup.find(‘table’)
    tirage_line = body.find_all(‘tr’)
    for value in tirage_line:
    my_dict = {}
    res = value.text.split(‘\n’)
    my_dict[‘day’]=res[2]
    my_dict[‘month_year’]=res[3]

    for i,val in enumerate(res[5:10]):
    my_dict[‘num’+str(i)]=int(val)
    my_dict[‘chance’]=int(res[10])
    my_list.append(my_dict)

    df=pd.DataFrame(my_list)
    return df

    mais à partir d’un fichier CSV
    J’arrive à lire le fichier CSV mais comment ajouter les lignes du fichier au dataframe.
    Je ne suis pas expert du tout en python

    Merci de votre aide.

    Stephane

    1. Bonjour

      moi aussi je cherche a faire la même chose a partir d un fichier csv, mais sans succès , je suis preneur de la solution.
      merci
      cordialement

    2. bonjour, je me suis attaqué au même problème (d’ailleurs mon réseaux est complétement similaire à celui proposé par l’article), je propose une fonction data, qui récupère les fichier csv sur le site de la fdj : https://github.com/deSaintAngel/loto_stats/blob/main/data.py et met a jour automatiquement dans un fichier csv les dernieres tirages ( il telecharge les zip , et récupére uniquement les informations nécessaires dans les cvs )

  36. Bonjour à tous,
    Je ne comprends pas bien en quoi le fait que les numéros soient ordonnés ou non change la prédiction? Il y aura toujours le même nombre de N° pairs, < à 24 etc… dans le tirage, ordonné ou pas. Ce n'est pas le quinté.
    Merci de m'expliquer cette différence d'apprentissage, si vous avez un moment.
    Bonne journée.
    Hugues

  37. import csv

    header = []
    game_info = []
    max_chance = 139838160

    def addLineFromCSVBefore2019(filename):
    with open(filename, ‘r’) as csvfile:
    csvreader = csv.reader(csvfile, delimiter=’;’)
    header = next(csvreader)
    rest = csvreader
    for row in rest:
    line = {}
    line[‘annee_numero_de_tirage’] = row[0]
    line[‘jour_de_tirage’] = row[1].strip()
    line[‘date_de_tirage’] = row[2]
    line[‘boule_1’] = row[4]
    line[‘boule_2’] = row[5]
    line[‘boule_3’] = row[6]
    line[‘boule_4’] = row[7]
    line[‘boule_5’] = row[8]
    line[‘etoile_1’] = row[9]
    line[‘etoile_2’] = row[10]
    game_info.append(line)

    def addLineFromCSVAfter2019(filename):
    with open(filename, ‘r’) as csvfile:
    csvreader = csv.reader(csvfile, delimiter=’;’)
    header = next(csvreader)
    rest = csvreader
    for row in rest:
    line = []
    line = {}
    line[‘annee_numero_de_tirage’] = row[0]
    line[‘jour_de_tirage’] = row[1].strip()
    line[‘date_de_tirage’] = row[2]
    line[‘boule_1’] = row[5]
    line[‘boule_2’] = row[6]
    line[‘boule_3’] = row[7]
    line[‘boule_4’] = row[8]
    line[‘boule_5’] = row[9]
    line[‘etoile_1’] = row[10]
    line[‘etoile_2’] = row[11]
    game_info.append(line)

    addLineFromCSVBefore2019(‘euromillions.csv’)
    addLineFromCSVBefore2019(‘euromillions_2.csv’)
    addLineFromCSVBefore2019(‘euromillions_3.csv’)
    addLineFromCSVBefore2019(‘euromillions_4.csv’)
    addLineFromCSVAfter2019(‘euromillions_201902.csv’)
    addLineFromCSVAfter2019(‘euromillions_202002.csv’)

    print(game_info)

  38. Pour faire des prévisions exactes de l’Euro-Millions,
    Il faut tenir compte des grilles jouées par tirages. Sachant qu’au tirage de Mardi, il y a 16 millions ou plus de grilles jouées et le Vendredi 25 millions de grilles jouées ou plus, selon le montant du jackpot en jeu.

    Les tirages de l’Euro-Millions se font selon les grilles jouées. Dans le nombre de grilles jouées, il y a disparité des numéros de 1 à 50.
    Il suffit de faire une simulation de 16 millions de grilles (Mardi) et à l’aide des statistiques (python) rechercher la combinaison à deux numéros (soit 1225 combinaisons (comb(50;2))) qui a été jouée 1 216 000 fois (76/1000 x 16 000 000) dans les 16 000 000 de grilles simulées.
    Par la suite, regarder dans les 1 216 000 grilles, la seule combinaison à 5 numéros peu jouée

  39. bonjour
    Merci pour cet article et pour le notebook. Je suis un peu novice mais effectue un projet dans ce domaine.
    J ai une erreur dans le notebook au niveau du training : train,label,model,scaler1 = create_lstm_dataset(df, window_length,nb_label_feature)
    Faut il télécharger quelque chose de special ?
    Merci

  40. Bonsoir Wilfried.
    Merci beaucoup pour votre article très explicite et très détaillé.
    J’ai récupéré le code et j’ai fait quelques tests avec.
    Je me pose une question afin d’approcher au plus près des vrais résultats : est-ce qu’il ne serait pas possible de prendre en compte les différences entre les prédictions et les vrais résultats pour chaque tirage et intégrer cette différence pour la prédiction suivante ?
    Par exemple : on travaille sur les 12 derniers tirages. On fait une prédiction sur les 3 premiers de la liste et on compare le résultat de la prédiction avec le 4ème vrai tirage. on « insère » cette différence (c’est là que je ne sais pas comment faire) pour que la prédiction sur le 5ème tirage puisse prendre en compte cette différence, etc …
    ceci afin de faire un « recalibrage » afin de s’approcher au plus près des vrais résultats ?

    Merci pour votre réponse.
    Cordialement.
    Laurent

  41. bonjour,
    merci pour le code, je m’amuse avec le code.
    au début je voulais re programmer une IA sur Excel, mais après 4 jour de recherche, j’ai n’est toujours pas compris comme en programmer une (et je ne pence pas le comprendre ne 1 mois de recherche)
    j’ai essayé d’ajouter la racine carré de la somme des nombre au carre, mais je n’obtiens pas de mayeur résulta.

    la fonction à ajouter pour les curieux :
    def carre_racine(data):
    return ((data[‘num0’]**2 + data[‘num1’]**2 +
    data[‘num2’]**2 + data[‘num3’]**2 +
    data[‘num4’]**2)**0.5)

    puis : df[‘carre_racine’] = carre_racine(df)

  42. Bonjour à tous,

    Quelqu’un pourrait il me dire comment modifier le scraping vers l’URL pour mettre à la place un fichier Excel (xls) sur mon disque C (à la racine)?

    Le fichier comprend 8 colonnes remplies de A à H sous la forme:
    MERCREDI 25/08/2021 19 9 29 26 3 8

    il y a environ 500 lignes de tirages.

    et où et comment le remplacer dans le code existant de Wilfried.

    Merci et bon WE à tous.

  43. Bonjour,
    il est mentionné à plusieurs endroits que les prédictions pour un même tirage seront différentes d’un apprentissage à un autre. Vous mentionnez également que les prédictions sont souvent assez proches des vrais résultats à plus ou moins 1. Ne serait-il pas alors possible de faire un très grand nombre d’apprentissages et ainsi de calculer un intervalle de confiance autour de chaque numéro prédit. Certains numéros auront peut-être un très petit intervalle de confiance (inférieure à 1 et qu’il faudra donc jouer) tandis que d’autres auront un intervalle de confiance un peu plus grand mais pas trop (on l’espère) pour englober que quelques valeurs. Ainsi, le nombre de combinaisons avec une très forte probabilité de gagner sera peut-être réduit à quelques combinaisons (ou quelques dizaines).
    Ceci est une remarque de béotien donc n’hésitez pas à me dire si je me plante complètement !
    Merci et bonne journée

    1. Salut voici ce que j’ai fait si ça vous intéresse toujours :
      p = sys.path[0]
      url = ‘http://lottery.merseyworld.com/cgi-bin/lottery?days=20&Machine=Z&Ballset=0&order=0&show=1&year=0&display=CSV’
      r = requests.get(url)
      file = p+r’/euromillions_scrap.txt’
      with open(file, ‘w+’) as f:
      f.write(r.text)
      with open(file, « r+ ») as f:
      lines = f.readlines()
      # supprimer les espaces et la ligne HR
      lines = [line.replace(‘ ‘,  ») for line in lines]
      with open(file, « w+ ») as f:
      for line in lines:
      if line.strip(« \n ») != « Alllotteriesbelowhaveexceededthe180daysexpirydateNo.,Day,DD,MMM,YYYY,N1,N2,N3,N4,N5,L1,L2,Jackpot,Wins »:
      f.write(line)
      df_em_scrap = pd.read_csv(file,skiprows=5)
      df_em_scrap = df_em_scrap[:-4]
      df_em_scrap.to_csv(p + r’/df_em_scrap.csv’)
      print (df_em_scrap)

  44. Fasquelle Christophe

    Bonjour je découvre Python mais je le trouve très intuitif car je comprends le cheminement. Merci Wilfried pour ce travail et l’approche.
    J’ai installé anaconda, j’ai vu du rouge après avoir lancé le code et compris que la librairie n’était pas installée.
    J’ai par contre cela en rouge

    /anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py:595: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.
    warnings.warn(msg, DataConversionWarning)
    /anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py:595: DataConversionWarning: Data with input dtype int64 was converted to float64 by StandardScaler.
    warnings.warn(msg, DataConversionWarning)
    Puis-je avoir de l’aide pour me préciser ce que je n’ai pas installé? Par avance merci.

  45. Bonjour,
    Merci pour ce travail.

    Cependant comment expliquer que parfois la prédiction du numéro chance soit 0?…
    J’ai vérifié, le dataset n’est pas corrompu, aucun 0 dans la colonne chance

    Merci

  46. Bonjour,
    J’ai téléchargé et assemblé les tirages du loto par ordre de sortie dans un fichier CSV. J’ai refait la procédure de lecture des données. Auriez vous des idées de calcul qui permettent une prédiction « Valide » ?
    je m’explique : j’ai des résultats parfois aberrants type 2 fois le même numéro dans la prédiction ou débordement : 51 ou 0.
    Donc je pense que les calculs de statistiques dans le dataset sont du coup erronés du fait de la position des boules dans l’ordre du tirage.
    Donc auriez vous des idées de calculs à intégrer pour lutter contre ce phénomène ? Je parle d’idées pas de code direct que je me chargerai de mettre en oeuvre.

    Merci beaucoup pour vos calculs dont je me suis largement inspiré.

  47. Je doute que cela fonctionne,

    Tout d’abord, les mécanismes et les boules sont changées régulièrement…. Donc je crains que prendre le données depuis 2008 ne sert strictement à rien et il faudra réduire le nombre de series.

    Ensuite il ne fait pas chercher à traiter ce problème comme un problème de ML classique, même si c’est du supervisé, vous faites le travail du réseau de neurone…. A ne pas faire.

    Le RNP fait de la rétropropagation, c’est ce qui sert à mesurer la “perturbation” d’une entrée quand au résultat…. Couche par couche via l’ajustement des poids. Donc je ne considèrerais que les séries en tant que telle.

    Donc je me mettrai jamais ces features là en entrée car le modèle sera forcé et donc biaisé dès le départ.

    Par contre, là où je vous suis est de tenter le coup car pour moi le hazard est une notion purement théorique et n’est pas prouvé… même les phénomènes les plus complexes de l’univers sont issu du déterminisme…. Le hazard… c’est un peu comme attribuer ce qu’on ne sait pas à Dieu.

    Je crois que les séries sont en effet déterminées par toute une série d’éléments non maîtrisable d’ordre mecanique. Le hasard d’une urne mécanique est aussi difficile à obtenir que la génération d’un nombre aléatoire sur un ordinateur.
    Même ceux-ci peuvent être reproduits… d’où l’utilisation d’un seed pour le mélange des examples avant l’entraînement d’un classifieur.

    L’utilisation d’un LSTM pourquoi pas, on peut considérer chaque combinaison comme une suite ordonnée temporelle où la loi suivie par la mécanique n’est pas la suite des 6 chiffres mais en réalité une suite infinie ordonnée dans le temps (la série des chiffre en première position, la série des chiffres en seconde position….)

    Donc je changerais de cap. Je verrai demain si j’ai raison 😂😂😂😂

  48. Serait il possible de faire une fonction comme celle ou les chiffres sont pairs ou impairs mais pour les chiffres qui se suivent ?
    j’ai bon retourner le code dans tous les sens, je ne vois pas comment faire.
    cdt.

  49. Bonjour
    Depuis longtemps je voulais étudier l ‘intelligence artificielle et plus particulièrement le deep learning. C’est fait, j’ai récupéré des cours et c’est vraiment très intéressant. Je viens de lire votre article et su possible je voudrai bien les codes sources de votre analyse très novatrice. Merci d’avance

  50. Bonjour,

    J’ai commencé à explorer depuis peu le machine learning avant de tomber sur votre article très intéressant. Dieu joue-t-il aux dès? Le hasard est il inexplicable ?
    J’avais une petite réflexion sur l’approche:
    Au lieu de chercher les prochains numéros, ne serait ce pas plus judicieux d’inverser la recherche?
    Peut-on avoir une evaluation pour chaque numéro de ses chances de sortie. Ainsi savoir si le tirage sorti appartient au 5 premiers, au 10 premiers ou encore au 20 premiers numéros qui avaient le plus de chance de sortie?
    Pour créer cet ajustement de script, j’ai essayé plusieurs changements sans résultats des dernières lignes de prédiction.
    Merci

  51. Bonjour,
    Merci pour cette belle initiative, continuez vous à travailler sur le programme?
    N’abandonnez pas, je pense que ce programme sera possible de sortir un jackpot à un moment ou un autre.

  52. bonjours j’ai obtenue des information qui peuvent être intéressante ,je sais que les balles a l’euro million font 60 grammes ,et 5 centimètre de diamètre en prenant en compte la vitesse des rotor (voir si il n’y a pas un pattern) ,les résultat de chaque tirage et en cumulant le tout ,on doit pouvoir ce rapprocher de la realité

  53. bonjour
    j ai mal a la tete(retraite de la marine marchande)…mais que ca fait du bien

    comment le programer pour prevoir 10 ou 20 numeros meme en gardant un num chance
    pour 10 num
    #prediction
    tom = df.tail(window_length).iloc[:,0:6] #
    scaler = StandardScaler().fit(df.iloc[:,0:6])
    scaled_to_predict = scaler.transform(tom)
    print(scaler.inverse_transform(scaled_predicted_output_1).astype(int)[0])

    j ai fais ca
    tom = df.tail(window_length).iloc[:,0:11] #
    scaler = StandardScaler().fit(df.iloc[:,0:11])
    scaled_to_predict = scaler.transform(tom)
    print(scaler.inverse_transform(scaled_predicted_output_1).astype(int)[0])

    ca m a donne
    9-17-25-33-36-8*-51-72-101-98-73
    avez vous une astuce?
    merci

  54. Bonjour, votre article est vraiment très intéressant. j’aimerais approfondir à partir de votre script si cela ne vous embête pas de me fournir votre code source ? Je vous en remercie par avance et n’hésiterai pas à partager avec vous mes réflexions. Cordialement

  55. Le sujet est très intéressant, ce qu’il faudrait ajouté dans le tirage c’est les probabilités qu’un chiffre sorte en fonction du fait qu’il est sorti il y a plus ou moins longtemps par exemple, un peu comme ce qu’on peut retrouver sur le site secret de jeu dans la section probabilité. On a un pourcentage de possibilité de sortie, ce qui pourrait peut être ajouter une précision dans le tirage.

  56. Bonjour,

    Étant néophyte en IA, je suis parti sur un tableau Excel où je croise les résultats de plusieurs prédictions se basant sur une longueur d’historique différentes en appliquant des coefficients de « pénalité » aux derniers numéros sortis. Évidemment je n’atteins pas votre niveau de précision. Cela dit, je pense qu’une inconnue nous échappe peut-être.

    En partant du fait que les numéros sont indirectement liés entre eux, on doit aussi se souvenir que nous nous basons uniquement sur les résultats publiés. N’imaginez-vous pas cependant qu’entre 2 tirages la Française des jeux face des vérifications et lance plusieurs tirages « d’essais » ? C’est tirages non publié viendraient troncquer la base des prédictions selon moi, sachant qu’en plus nous ne savons pas s’ils répètent le même nombre de cycles entre chaque tirage.

    Voilà une idée d’un petit esprit qui n’a pas vos outils mais qui a longuement philosophé sur la situation dans son ensemble 🙂

    Bon courage pour la suite 😉

  57. Excellent travail ! Quand je suis tombé dessus, j’ai cru que j’hallucinais. Je prends en compte d’autres choses pour introduire de la dépendance entre les tirages. Je vous tiendrai au courant au cas cela marcherait.

  58. J’ai réussi à rajouter toute les fonctions que vous avez cité pour optimiser le modèle le problèmes c’est euromillions que je galère un peux cela me donne des numéro en doubles ^^

  59. Le loto étant un jeu de hasard dont le tirage de chaque boule est indépendant, il est tout bonnement impossible d’en prédire le prochain tirage. Il n’existe aucun modèle mathématiques pour cela. Je trouve le loto encore plus hasardeux que l’Euromillions dans le sens où les boules sont placées aléatoirement dans la machine au début et que c’est un système par ventilation qui les mélange. Tandis qu’à l’Euromillions les boules, au départ, ont toujours le même ordre puis sont brassées par des pales. Les statistiques qui existent sur les tirages peuvent éventuellement aiguiller à composer une combinaison plutôt qu’une autre mais en aucun à prédire un futur tirage (sinon la FDJ aurait mis la clé sous la porte depuis bien longtemps).

  60. Bonjour à tous,
    J’utilise le code via Collab research et je voudrais que le programme aille récupérer l’historique du Loto dans un fichier Excel sur mon disque dur (colonne A1 à F1000 par ex), le fichier serait sur C:/Documents/loto.xls par exemple, au lieu du site du Loto en ligne.
    Avez-vous une solution ?
    Merci,
    Hugues

  61. @hugues
    from google.colab import files
    data_to_load = files.upload()
    import io
    df = pd.read_excel(io.BytesIO(data_to_load[‘loto.xlsx’]))

    si tu travailles sur colabs

  62. Moi je n’ai jamais cru à cette indépendance dans les tirages du loto. Jamais je n’ai entendu nulle part que nous avons eu droit au même tirage deux fois de suite. Ou que tous les numéros gagnants se suivent où sont multiples de 3. C’est un domaine qui m’intéresse et j’ai voulu faire la même etude, mais actuellement je manque de temps et de compétences. Mais je compte m’inspirer de votre travail. Merci.

  63. Bonjour Wilfried,

    serait il possible d’avoir le code s’il te plait? Je voudrai voir si il est possible d’améliorer la prédiction. Nous voulons nous amusez avec un ami et une IA en développement. Merci par avance

  64. Salut a tous!
    Je suis entrain de rassembler un group de joueur methodists pour finir a resoudre soit disant enigme mais ce n’est pas le cas car si je suis capable aujhourdhii dèliminer 25 voir 30 boules d’une maniere methodique je peux eliminer 40 et plus.
    Alors qui veut participer doit faire preuve de connaissance et de methode. Je parle maintenant après une analyse qui ma durèe 3 ans … pour cela le group doit etre expert only.
    Merci de l’aisser votre mail je vous contacterais.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.