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 :
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)
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
 
# 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}")
N'hésitez pas toute info, suggestion est la bienvenue.
Turfistement, Tchicken