Bonjour à tous,
je recherche de l'aide pour mettre au point un model de Machine Learning (ou autre) pour pronostiques PMU.
Je travaille sur les courses PMU depuis 30 ans, j'ai développé plusieurs logiciels en VB, .Net et Xamarin (GENTURFEVO Androïd).
J'ai une base de donnée MSSQL express avec des données enrichies par de nombreuses rubriques personnelles et classiques (Indice de forme et Coefficient de réussite selon Paris Turf).
Cette base de données comporte près de 80.000 courses depuis l'année 2016, ma base de travail en comporte 45000 mais le reste est aussi exploitable.
Du fait de mon expérience hippiques, mes pronostics sont plutôt bon, mais insuffisant pour être bénéficiaire.
Je sollicite votre aide pour orienter mes choix futures en matière de programmation et IA, et pourquoi pas créer un partenariat avec certains d'entre vous.
Ma base de données peut-être accessible facilement avec SQL Server Management Studio, j'ai installé le package ML Python + R.
J'ai créé mes premiers modèles en régression linéaire et en ciblant 1 modèle par hippodrome, mais mes résultats sont peu probant.
Voici mon modèle :
Ma Prédiction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 import joblib import pyodbc import pandas as pd import numpy as np from sklearn.metrics import mean_squared_error from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split import warnings warnings.filterwarnings('ignore') # Connection string to your SQL Server instance conn_str = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=...;DATABASE=...;UID=...;PWD=...') # TROT a.LieuCourse,a.DateReunion,b.Discipline,b.TypeCourse,b.Cordage,c.SexAge,c.Deferre,c.Median,c.Deferre, # TROT c.Jokey,c.Entraineur,c.ZoneABC,c.Median,c.Record,a.NumGeny,a.NumReunion,b.NumCourse, query_str = "SELECT b.Difficulte,b.Autostart,\ b.Allocation,b.Distance,b.Partants,b.CptStats,b.Age,c.Numero,c.Corde,c.DistPoid,\ c.Gains,c.ClaZone,c.Cote11h,c.CoteDef,c.CoteGen,c.Pourcent11h,c.PourcentDef,\ c.ClasCoefReussite,c.CoefReussite,c.IndFor,c.IndForme,c.NbCourses,c.NbVictoires,c.NbPlaces,c.ClaCote,c.PtsOR,c.ClaOR,\ c.PtsAR,c.ClaAR,c.PtsCX,c.ClaCX,c.PtsCRIFX,c.ClaCRIFX,c.PtsTMatic,c.ClaTMatic,c.PtsHisto,c.ClaHisto,c.PtsRub,c.ClaRub,\ c.PrcCh,c.PrcDr,c.PrcEn,c.NbBloc,c.NbCouples,c.VaCouples,c.ClasMN,c.ClasPT,c.ClasRE,c.ClasRD,c.ClaIDC,c.ClaCFP,\ c.PtsMN,c.PtsPT,c.PtsRD,c.PtsRE,c.PtsCFP,c.PtsIDC,c.ClasPtsStats,c.PtsStats,c.ClasValStats,c.ValStats,c.ClasStats,\ c.CumStats,c.PtsSynth,c.ClasSynth,c.PlaceArrivee \ FROM Reunions a, Courses b, Chevaux c \ WHERE a.Numgeny = b.Numgeny AND b.Numgeny = c.Numgeny AND b.NumCourse = c.NumCourse \ AND a.DateReunion>='01/10/2019' \ AND a.DateReunion<='30/04/2023' \ AND a.LieuCourse='Saint Cloud' \ AND b.Partants>7" df = pd.read_sql(sql=query_str, con=conn_str) # Remplacer les chaînes vides par des valeurs nulles df.replace('', np.nan, inplace=True) # Supprimer les lignes contenant des valeurs nulles df.dropna(inplace=True) # Divisez les données en un ensemble d'entraînement et un ensemble de test X = df.drop(['PlaceArrivee'], axis=1) y = df['PlaceArrivee'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Supprimez les colonnes inutiles ou redondantes # X_train = X_train.drop(['NumGeny', 'NumReunion', 'NumCourse'], axis=1) # X_test = X_test.drop(['NumGeny', 'NumReunion', 'NumCourse'], axis=1) # Prétraitement des données from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # Entraînez un modèle de régression linéaire model = LinearRegression() model.fit(X_train_scaled, y_train) # Faites des prédictions sur l'ensemble de test y_pred = model.predict(X_test_scaled) mean_target = df['PlaceArrivee'].mean() median_target = df['PlaceArrivee'].median() # Enregistrer le modèle joblib.dump(model, 'C:/SQL2019/PythonML/Saint Cloud.Modele') # Évaluez les performances du modèle rmse = np.sqrt(mean_squared_error(y_test, y_pred)) print("moyenne :", mean_target) print("median:", median_target) print("RMSE:", rmse)
N'hésitez pas toute info, suggestion est la bienvenue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 # Importer le modèle import pyodbc import pandas as pd import numpy as np import joblib from sklearn.linear_model import LinearRegression from sklearn.preprocessing import StandardScaler import warnings warnings.filterwarnings('ignore') # Connection string to your SQL Server instance conn_str = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=...;DATABASE=...;UID=...;PWD=...') # TROT a.LieuCourse,a.DateReunion,b.Discipline,b.TypeCourse,b.Cordage,c.SexAge,c.Deferre,c.Median,c.Deferre, # TROT c.Jokey,c.Entraineur,c.ZoneABC,c.Median,c.Record,c.PlaceArrivee,a.NumGeny,a.NumReunion,b.NumCourse, # ,c.PtsSynth,c.ClasSynth à partir de 10 partants query_str = "SELECT b.Difficulte,b.Autostart,\ b.Allocation,b.Distance,b.Partants,b.CptStats,b.Age,c.Numero,c.Corde,c.DistPoid,\ c.Gains,c.ClaZone,c.Cote11h,c.CoteDef,c.CoteGen,c.Pourcent11h,c.PourcentDef,\ c.ClasCoefReussite,c.CoefReussite,c.IndFor,c.IndForme,c.NbCourses,c.NbVictoires,c.NbPlaces,c.ClaCote,c.PtsOR,c.ClaOR,\ c.PtsAR,c.ClaAR,c.PtsCX,c.ClaCX,c.PtsCRIFX,c.ClaCRIFX,c.PtsTMatic,c.ClaTMatic,c.PtsHisto,c.ClaHisto,c.PtsRub,c.ClaRub,\ c.PrcCh,c.PrcDr,c.PrcEn,c.NbBloc,c.NbCouples,c.VaCouples,c.ClasMN,c.ClasPT,c.ClasRE,c.ClasRD,c.ClaIDC,c.ClaCFP,\ c.PtsMN,c.PtsPT,c.PtsRD,c.PtsRE,c.PtsCFP,c.PtsIDC,c.ClasPtsStats,c.PtsStats,c.ClasValStats,c.ValStats,c.ClasStats,\ c.CumStats,c.PtsSynth,c.ClasSynth \ FROM Reunions a, Courses b, Chevaux c \ WHERE a.Numgeny = b.Numgeny AND b.Numgeny = c.Numgeny AND b.NumCourse = c.NumCourse \ AND a.DateReunion='01/05/2023' AND a.NumReunion=1 AND b.NumCourse=3" # Définir les nouvelles données d'entrée new_data = pd.read_sql(sql=query_str, con=conn_str) # Define preprocess_data function def preprocess_data(df): # Dropping unnecessary columns # df = df.drop(['NumGeny', 'NumReunion', 'NumCourse', 'Numero'], axis=1) # One-hot encoding categorical variables # df = pd.get_dummies(df, columns=['Difficulte', 'Autostart', 'Cote11h', 'CoteDef', 'CoteGen']) # Filling missing values with the mean df = df.fillna(df.mean()) # Scaling the data scaler = StandardScaler() scaled_data = scaler.fit_transform(df) return scaled_data # Load saved model model = LinearRegression() model = joblib.load('C:/SQL2019/PythonML/Saint Cloud.Modele') # Load new data from SQL Server new_data = pd.read_sql(sql=query_str, con=conn_str) # Preprocess new data X_test = preprocess_data(new_data) # Make predictions y_pred = model.predict(X_test) # Stocker les prédictions et les numéros de cheval correspondants dans une liste de tuples results = [] for Numero, prediction in zip(new_data['Numero'], y_pred): results.append((Numero, prediction)) # Trier la liste de résultats par ordre décroissant de la valeur de prédiction results.sort(key=lambda x: x[1], reverse=True) # Afficher les résultats triés for Numero, prediction in results: print(f"{Numero};{prediction}")
Turfistement, Tchicken
Partager