Il mio primo vero progetto di Machine Learning dove analizzerò gli ultimi 25 anni di partite del circuito ATP al fine di creare un modello Random Forest che ci permetta di predirre gli scontri diretti tra i top 10 tennisti al mondo al prossimo torneo di Wimbledon 2025 che si tratta il 30 giugno e il 11 luglio.
Questi risultati in fine saranno visualizzabili attraverso una dashboard creata in Tableau che renderà accessibile agli utenti le nostre predizioni.
Ecco un breve report che descrive le procedure utilizzate per effettuare le previsioni
I dati sono stati inseriti attraverso l'API di Kaggle che ci permetterà di avere dati sempre aggiornati e dunque parassitica il codice potrà essere lanciato in qualunque momento producendo così predizioni aggiornate è sempre attuali
Il dataset contiene tutte le partite del circuito TP dal 2020 a oggi.
Analizzando il dataset abbiamo trovato una serie di incongruenze: alcune quote avevano un segno negativo, alcuni atleti avevano una quantità di punti ATP o ranking pari a 0 così come alcuni formati delle variabili non erano idonei, come ad esempio date che non era in formato date time.
Dunque abbiamo:
-Corretto questi fattori
-Codificato la variabile winner in binario (chiamandola winner player 1)
-Eliminato nan
-Trasformato la variabile Score per renderla utile
A questo punto ci siamo resi conto di aver perso diverse records, infatti, il nostro dataset, contiene partite solo dal 2005 in poi, questo è dovuto al fatto che le partite antecedenti non possedevano le quote dei bookmakers e presentavano un maggior numero di NaN e di dati non validi.
Malgrado ciò abbiamo valutato che la quantità di dati che possediamo sia sufficiente all'addestramento del nostro modello e dunque questa perdita a seguito della pulizia non risulta un problema.
Adesso che il nostro dataset è pulito procediamo con l'elaborazione di alcuni dati al fine di creare delle nuove features che possano essere utili al successivo addestramento del modello.
Questo processo non è stato svolto interamente nello stesso momento bensì in parte subito dopo la pulizia e in parte durante la procedura di tuning del modello in quanto allo sviluppo di queste variabili e stato mirato al miglioramento della precisione predittiva del modello.
Dopo aver creato tutte le nuove variabili, averle testate e aver eliminato le colonne superflue questa è la struttura del nostro dataset.
-Rak Gap-
differeanza tra i Punti ATP dei due players.
-Surface prolificy-
percentuale di game vinti su game totali, su quella specifica superficie di gioco, fino alla data dell'incontro.
-Tournament Prolificy-
percentuale di game vinti su game totali, in quel Torneo, fino
*I Valori NaN presenti dipendono dal fatto che i players alla prima esperienza in quel torneo/terreno di gioco non possiedono alcun valore di prolificy
Dopo una breve analisi di correlazione preliminari, la scelta delle features e la divisione del dataset in train e test set, ecco che arriviamo al clou del nostro progetto, ovvero la creazione e l'addestramento di un modello di Random Forest Classifier sui nostri dati.
Dei features che abbiamo selezionato sono:
- Punti ATP
-Rank_Gap
-Surface_Prolificy
-Tournament_Prolificy_Player
Dopo aver costruito e allenato il modello, procediamo alla sua valutazione.
I risultati ottenuti nel test set confermano che il modello generalizza bene, mantenendo performance molto simili a quelle osservate durante l’addestramento e la validazione incrociata. Questo indica l’assenza di overfitting e una buona solidità complessiva.
La curva ROC e il valore AUC confermano la capacità discriminativa del modello, mentre la curva di calibrazione mostra che le probabilità restituite sono ben allineate con la realtà osservata.
In sintesi, il modello non solo risulta accurato, ma anche affidabile nella stima delle probabilità, caratteristica essenziale per applicazioni come la nostra.
Il confronto con altri modelli ha evidenziato che la Random Forest si comporta meglio rispetto sia al Dummy Classifier (baseline) che all’XGBoost.
Il modello di base (Dummy) conferma che le feature contengono informazione utile, mentre XGBoost – seppur potente – non ha superato la Random Forest in questa configurazione.
Questa analisi rafforza la scelta del modello principale, che risulta il più adatto per il task e il dataset considerato.
Infine è stato ocndotta un'analisi degli errori: il modello sbaglia principalmente nei match equilibrati, dove il divario di ranking tra i giocatori è ridotto. La matrice di confusione conferma un buon bilanciamento tra falsi positivi e negativi
In unltima analisi abbiamo confrontato il modello con le previsioni dei bookmakers.
Utilizzando lo stesso campione di test (grazie a un random_state fisso) e sfruttando le quote presenti nel nostro dataset, abbiamo calcolato l’accuratezza delle previsioni dei bookmakers sugli stessi match utilizzati per valutare il modello, vedendo quanto spesso il favorito fosse poi il reale vincitore. Il risultato mostra che le performance dei bookmakers sono simili a quelle ottenute dal nostro algoritmo, confermando la validità delle stime prodotte dal modello.
L’analisi dell’importanza delle variabili ha permesso di identificare quali caratteristiche influenzano maggiormente le previsioni del modello. Tra queste spiccano le differenze di ranking e di punti ATP tra i giocatori, seguite dalla prolificità su superficie e torneo. Queste evidenze sono coerenti con la logica sportiva e confermano che il modello basa le sue decisioni su informazioni rilevanti e interpretabili.
Ed eccoci giunti alla fase finale del progetto: la generazione delle previsioni.
Come primo passo, abbiamo ottenuto la lista aggiornata dei Top 10 tennisti al mondo tramite web scraping da Wikipedia, così da mantenere dinamico l’elenco dei giocatori.
A ciascun tennista della lista abbiamo poi associato due indicatori fondamentali: i valori di Surface Prolificy e la Tournament Prolificy relativa a Wimbledon, in modo da fornire al modello un contesto specifico e realistico per ogni match simulato.
Per generare le previsioni tra i Top 10, abbiamo simulato tutti i possibili incontri uno contro uno.
Per ogni coppia, il modello calcola la probabilità che il primo giocatore batta il secondo, tenendo conto di variabili come ranking, punti ATP, rendimento sull’erba e performance storica a Wimbledon.
Queste probabilità vengono poi trasformate in quote attese, offrendo una stima di mercato basata esclusivamente sui dati.
Il risultato è una panoramica completa e dinamica dei possibili esiti tra i migliori giocatori del mondo.
Infine, abbiamo esportato questo dataset — insieme ad altri dataset di supporto — per poterli utilizzare all’interno di Tableau, dove sono stati integrati in una dashboard interattiva. Questo passaggio consente di rendere le previsioni e le statistiche facilmente esplorabili, anche da parte di utenti non tecnici.
La dashboard consente di visualizzare facilmente le previsioni: basta selezionare i due giocatori per ottenere, in automatico, non solo l’esito stimato del match, ma anche una serie di informazioni utili, tra cui statistiche individuali e precedenti scontri diretti.
*Per una visualizzazione ottimale consigliamo Tableau Public
Vuoi utilizzare la dashboard in maniera ottimale? Vai al progetto su Tableau Public
Wimbledon 2025 è stata l’occasione perfetta per mettere alla prova il mio modello predittivo su un evento reale e attuale. L’idea era semplice: sfruttare i dati storici degli ultimi 25 anni e alcune metriche avanzate per anticipare l’esito dei match tra i top player del torneo.
Nonostante il numero limitato di partite disputate tra i giocatori selezionati (solo 4 match), questo primo test ha offerto indicazioni incoraggianti:
Djokovic vs De Minaur → Previsione: vince Djokovic ✅
Sinner vs Djokovic → Previsione: vince Sinner ✅
Alcaraz vs Fritz → Previsione: vince Alcaraz ✅
Alcaraz vs Sinner → Previsione: vince Alcaraz ❌
Il modello ha centrato 3 previsioni su 4, con una precisione del 75%, perfettamente in linea con quanto osservato nella fase di test (circa 70% di accuratezza su dati storici).
Naturalmente il modello è ancora migliorabile, soprattutto per quanto riguarda la gestione delle superfici, delle condizioni fisiche e delle dinamiche più complesse dei tornei. Tuttavia, come primo tentativo ritengo il risultato molto positivo, e rappresenta un ottimo punto di partenza per sviluppi futuri