{
  "run_date": "2026-04-25T19:09:46.629142",
  "dataset": {
    "db_path": "/home/h3r7/turf_saas/turf.db",
    "total_rows": 10899,
    "train_rows": 8719,
    "holdout_rows": 2180,
    "train_date_range": [
      "2026-03-31",
      "2026-04-19"
    ],
    "holdout_date_range": [
      "2026-04-19",
      "2026-04-24"
    ]
  },
  "baseline": {
    "model": "XGBoost (baseline)",
    "precision_at3": 0.5286821705426358,
    "auc": 0.7254057665061495
  },
  "individual_models": {
    "xgboost": {
      "model": "xgboost",
      "auc": 0.7856,
      "accuracy": 0.6917,
      "precision": 0.4865,
      "recall": 0.7229,
      "precision_at3": 0.5783,
      "latency_ms_per_row": 0.0112
    },
    "lightgbm": {
      "model": "lightgbm",
      "auc": 0.7833,
      "accuracy": 0.6995,
      "precision": 0.4951,
      "recall": 0.709,
      "precision_at3": 0.5736,
      "latency_ms_per_row": 0.0041
    },
    "mlp": {
      "model": "mlp",
      "auc": 0.7743,
      "accuracy": 0.7445,
      "precision": 0.5743,
      "recall": 0.5325,
      "precision_at3": 0.5643,
      "latency_ms_per_row": 0.0052
    }
  },
  "ensemble": {
    "model": "ensemble",
    "auc": 0.784,
    "accuracy": 0.7147,
    "precision": 0.5142,
    "recall": 0.6718,
    "precision_at3": 0.5814,
    "latency_ms_per_row": 0.0208
  },
  "delta_precision_at3": 0.0527,
  "deploy": true,
  "optuna": {
    "n_trials": 100,
    "xgboost_best_params": {
      "n_estimators": 141,
      "max_depth": 5,
      "learning_rate": 0.016298172447266404,
      "subsample": 0.7660470794373848,
      "colsample_bytree": 0.471124415020467,
      "min_child_weight": 14,
      "reg_alpha": 1.9364166463791586,
      "reg_lambda": 6.018030083488602,
      "gamma": 4.614943551368141
    },
    "lightgbm_best_params": {
      "n_estimators": 186,
      "max_depth": 4,
      "learning_rate": 0.012915117465216954,
      "num_leaves": 141,
      "subsample": 0.6193119116922561,
      "colsample_bytree": 0.539310022549326,
      "min_child_samples": 9,
      "reg_alpha": 0.6864583098112754,
      "reg_lambda": 0.0549259590914184
    }
  },
  "features": {
    "total": 43,
    "selected_by_shap": 31,
    "feature_list": [
      "age",
      "sexe_enc",
      "nombre_courses",
      "nombre_victoires",
      "nombre_places",
      "tx_victoire",
      "tx_place",
      "forme_recente",
      "tendance_num",
      "gains_annee_en_cours",
      "cote_direct",
      "cote_reference",
      "distance",
      "nb_partants",
      "discipline_enc",
      "specialite_enc",
      "oeilleres_enc",
      "tendance_cote_enc",
      "penetrometre_intitule_enc",
      "form_1",
      "form_2",
      "form_3",
      "form_4",
      "form_5",
      "form_weighted",
      "form_avg",
      "form_best",
      "form_worst",
      "win_ratio",
      "place_ratio",
      "implied_prob",
      "win_rate_adj",
      "place_rate_adj",
      "earnings_per_race",
      "cote_diff",
      "cote_ratio",
      "rang_cote",
      "ratio_cote_field",
      "distance_cat",
      "age_win_interact",
      "is_favorite",
      "poids",
      "prize_norm"
    ],
    "shap_selected": [
      "rang_cote",
      "implied_prob",
      "cote_direct",
      "ratio_cote_field",
      "nb_partants",
      "cote_diff",
      "cote_ratio",
      "specialite_enc",
      "earnings_per_race",
      "nombre_courses",
      "cote_reference",
      "distance",
      "discipline_enc",
      "is_favorite",
      "prize_norm",
      "win_ratio",
      "place_rate_adj",
      "gains_annee_en_cours",
      "poids",
      "tx_place",
      "penetrometre_intitule_enc",
      "age_win_interact",
      "nombre_places",
      "tendance_num",
      "age",
      "form_avg",
      "form_weighted",
      "place_ratio",
      "form_3",
      "oeilleres_enc",
      "form_5"
    ]
  },
  "ensemble_weights": {
    "xgboost": 0.23161801824035544,
    "lightgbm": 0.23415467282905,
    "mlp": 0.21290370528252356
  }
}