@@ -101,6 +101,32 @@ FEATURES = [
|
||||
"home_top_scorer_form", "away_top_scorer_form",
|
||||
"home_avg_player_exp", "away_avg_player_exp",
|
||||
"home_goals_diversity", "away_goals_diversity",
|
||||
# V27 H2H Expanded (4)
|
||||
"h2h_home_goals_avg", "h2h_away_goals_avg",
|
||||
"h2h_recent_trend", "h2h_venue_advantage",
|
||||
# V27 Rolling Stats (13)
|
||||
"home_rolling5_goals", "home_rolling5_conceded",
|
||||
"home_rolling10_goals", "home_rolling10_conceded",
|
||||
"home_rolling20_goals", "home_rolling20_conceded",
|
||||
"away_rolling5_goals", "away_rolling5_conceded",
|
||||
"away_rolling10_goals", "away_rolling10_conceded",
|
||||
"home_rolling5_cs", "away_rolling5_cs",
|
||||
# V27 Venue Stats (4)
|
||||
"home_venue_goals", "home_venue_conceded",
|
||||
"away_venue_goals", "away_venue_conceded",
|
||||
# V27 Goal Trend (2)
|
||||
"home_goal_trend", "away_goal_trend",
|
||||
# V27 Calendar (5)
|
||||
"home_days_rest", "away_days_rest",
|
||||
"match_month", "is_season_start", "is_season_end",
|
||||
# V27 Interaction (6)
|
||||
"attack_vs_defense_home", "attack_vs_defense_away",
|
||||
"xg_diff", "form_momentum_interaction",
|
||||
"elo_form_consistency", "upset_x_elo_gap",
|
||||
# V27 League Expanded (5)
|
||||
"league_home_win_rate", "league_draw_rate",
|
||||
"league_btts_rate", "league_ou25_rate",
|
||||
"league_reliability_score",
|
||||
]
|
||||
|
||||
MARKET_CONFIGS = [
|
||||
@@ -295,12 +321,18 @@ def train_market(df, target_col, market_name, num_class, n_trials):
|
||||
|
||||
print(f"[INFO] Split: train={len(X_train)} val={len(X_val)} cal={len(X_cal)} test={len(X_test)}")
|
||||
|
||||
def _cb(study, trial):
|
||||
if trial.number % 5 == 0 or trial.number == n_trials - 1:
|
||||
best = study.best_value if study.best_trial else float('inf')
|
||||
print(f" [{trial.number+1:>3}/{n_trials}] loss={trial.value:.4f} | best={best:.4f}", flush=True)
|
||||
|
||||
# ── Phase 1: Optuna XGBoost ──────────────────────────────────
|
||||
print(f"\n[OPTUNA] XGBoost tuning ({n_trials} trials)...")
|
||||
xgb_study = optuna.create_study(direction="minimize", sampler=TPESampler(seed=42))
|
||||
xgb_study.optimize(
|
||||
lambda trial: xgb_objective(trial, X_train, y_train, X_val, y_val, num_class),
|
||||
n_trials=n_trials,
|
||||
callbacks=[_cb],
|
||||
)
|
||||
xgb_best = xgb_study.best_params
|
||||
print(f"[OK] XGB best logloss: {xgb_study.best_value:.4f}")
|
||||
@@ -311,6 +343,7 @@ def train_market(df, target_col, market_name, num_class, n_trials):
|
||||
lgb_study.optimize(
|
||||
lambda trial: lgb_objective(trial, X_train, y_train, X_val, y_val, num_class),
|
||||
n_trials=n_trials,
|
||||
callbacks=[_cb],
|
||||
)
|
||||
lgb_best = lgb_study.best_params
|
||||
print(f"[OK] LGB best logloss: {lgb_study.best_value:.4f}")
|
||||
|
||||
Reference in New Issue
Block a user