NBA Basketball Prediction
Eine Vorhersage, die man nicht prüfen kann, ist eine Vermutung mit einer Prozentzahl davor.
58.84%
beste Trefferquote
632
Spiele im Training
9
gewichtete Team-Kennzahlen
12.5-15k
analysierte Generationen
Warum es existiert
Ein Projeto Integrador: die Abschlussarbeit der integrierten Fachausbildung Informatik am IFSC, Campus Gaspar, geschrieben mit drei Mitschülern und 2021 verteidigt. Das Thema kam aus einem Markt, der in Brasilien damals schnell wuchs und an selbstsicheren Behauptungen keinen Mangel hatte — Sportwetten. Jeder hatte ein System. Veröffentlicht hat es niemand.
Genetische Algorithmen waren die Lücke. Neuronale Netze und Regression waren wiederholt auf Basketball angesetzt worden; ein gegen echte Spieldaten evolvierter Gewichtsvektor nicht. Und die Frage, die uns wirklich interessierte, war nie, ob sich damit Geld gewinnen lässt. Sie war, was er über das Spiel sagen würde: welche Kennzahlen eines Teams das erste Viertel tragen, und wie stark.
Das Problem
Ein ganzes NBA-Spiel vorherzusagen ist ein überfülltes Problem mit viel Vorarbeit. Nur das erste Viertel vorherzusagen ist enger und härter — weniger Ballbesitze, weniger Zeit für die bessere Mannschaft, sich durchzusetzen, mehr Rauschen pro gespielter Minute.
Die Eingabe ist bewusst dünn. Pro Team die Mittelwerte seiner eigenen vergangenen ersten Viertel: Punkte, Differenz, Rebounds, Trefferquoten, Turnovers, Siege. Mit Selenium und BeautifulSoup von Basketball Reference in ein SQLite-Schema aus Teams, Spielen und Team-Teilnahmen geholt. Keine Verletzungen, keine Aufstellungen, keine Quoten, keine Ruhetage. Wenn neun Gewichte über diesen Zahlen den Zufall schlagen können, ist das eine Aussage über die Zahlen selbst.
Architektur
Ein genetischer Algorithmus, und drumherum nur das, was einen solchen füttert. Ein Individuum sind neun Gewichte aus dem Intervall [-100, 100], eines je Kennzahl. Seine Fitness ist der Anteil der Spiele im Trainingsfenster, deren erstes Viertel es richtig trifft. Die Generationen sind elitär — die besten Individuen bleiben unangetastet, der Rest wird rekombiniert und mutiert — weshalb ein Fitness-Log nur steigt und weshalb es eine Treppe ist und keine Kurve.
Die Kommandozeile steuert vier Verben: sammeln, trainieren, vorhersagen, validieren. Das letzte ist das entscheidende. Es schickt den Algorithmus und zwei Kontrollen durch dieselbe Fitnessfunktion, damit ein guter Wert etwas hat, wogegen er gut sein kann.
Entscheidungen, die eine Erklärung verdienen
- 01
Es gibt kein zurückgehaltenes Testset, und diese Seite tut nicht so, als gäbe es eins. Die Fitness wird an denselben 632 Spielen gemessen, gegen die die Gewichte trainiert werden — 58,84% ist also ein Wert innerhalb der Stichprobe. Der einzige Beleg außerhalb davon war gröber und öffentlicher: Vorhersagen für kommende Spiele, veröffentlicht auf einem Twitter-Konto, während die Spiele liefen.
- 02
Die Kontrollen standen vor den Schlussfolgerungen. Ein vollständig zufälliger Gewichtsvektor und ein konstanter Vektor aus Einsen laufen durch dieselbe Fitnessfunktion, denn 58% für sich ist eine Zahl ohne Vergleich.
- 03
Die Parameter wurden einzeln gegen eine feste Grundeinstellung kalibriert, was sie als unabhängig behandelt, obwohl sie es erkennbar nicht sind. Das Paper sagt das, statt die Messreihe als abgeschlossen zu verkaufen — und die eine Reihe, die flach zurückkam, wurde als ergebnislos berichtet und nicht zum Befund aufgehübscht.
- 04
Jede Fitness-Achse beginnt bei 50%. Ein Vorhersager unterhalb des Zufalls ist kein schlechter Vorhersager, sondern ein umgekehrt gelesener nützlicher; 50% ist also der Boden, der überhaupt etwas bedeutet.
- 05
Die Anforderung verlangte 70% Trefferquote. Sie wurde nie erreicht und blieb als gescheiterte Anforderung im Dokument stehen, statt still auf das heruntergeschrieben zu werden, was wir tatsächlich erreicht haben.
Beste Fitness je Generation
Zwei im Repository versionierte Trainingsläufe, aus ihren eigenen Logs nachgezeichnet. Beide steigen schnell und hören dann auf: Die letzte Verbesserung des längeren Laufs fällt auf Generation 405, und die tausend Generationen danach bringen nichts mehr. Keiner der beiden kommt in die Nähe der geforderten 70%.
- Lauf A — 1.410 Generationen, 56,41% bis 59,06%
- Lauf B — 515 Generationen, 59,06% bis 60,47%
Beste Fitness: der Anteil korrekt vorhergesagter erster Viertel.
Quelle: src/data/json/gen/teste1.json und teste2.json, alle 5 Generationen abgetastet. Der Algorithmus ist elitär, die beste Fitness fällt also nie und die Linie ist eine Treppe.
Trefferquote nach Methode
Wo der Algorithmus gegenüber den Arbeiten steht, mit denen sich das Paper vergleicht, und gegenüber einem Zufallsvorhersager. Mit 58.84% schlägt er den Zufall und die Fußball-Referenz und liegt hinter jeder Basketball-Methode darüber. Die Balken sind nicht gleichartig und sollten nicht so gelesen werden: Nur dieses Projekt sagt ein erstes Viertel vorher — die drei darüber sagen ganze Spiele vorher, zwei davon in einer anderen Liga.
Lineare Regression
NBB, ganzes Spiel · Michelon et al., 2017
75%
Neuronales Netz
NBB, ganzes Spiel · Michelon et al., 2017
74%
Data Mining, maschinelles Lernen
NBA-Playoffs, ganzes Spiel · Fukano et al., 2018
73.19%
Dieses Projekt — genetischer Algorithmus
NBA, erstes Viertel · 2021
58.84%
Gradient Boosting
Fußball, ganzes Spiel · Fernandes, 2019
52.78%
Zufallsvorhersager
Kontrolle, 50% per Konstruktion
50%
Quelle: das Paper, Abschnitt 4.3, Abbildungen 18 und 19.
Der Gewichtsvektor des besten Individuums
Die neun Multiplikatoren, bei denen das siegreiche Chromosom landete, angewandt auf die eigenen Erste-Viertel-Mittelwerte eines Teams. Der Betrag ist, wie wichtig der Algorithmus eine Kennzahl fand; ein negatives Vorzeichen heißt, er fand sie höher bei Teams, die das Viertel am Ende verlieren. Zwei laufen der Intuition zuwider — die durchschnittlichen Punkte eines Teams bekommen ein negatives Gewicht — worauf das Paper hinweist, statt es wegzuerklären.
won
+98.4
points
-59.5
spread
+78.5
offensive_rebounds
+81.3
defensive_rebounds
+4.9
field_goals_percentage
-54.9
three_point_field_goals_percentage
+98.0
turnover
-36.2
turnover (wie gedruckt)
+72.5
Quelle: das Paper, Abschnitt 5.1. Es druckt turnover als Bezeichnung für beide letzten Gene; hier wie veröffentlicht wiedergegeben, da das Datenbankschema nur eine solche Spalte hat.
Kalibrierungsreihe
Fünf Parameter, jeder einzeln gegen eine feste Grundeinstellung bewegt, fünf Zyklen zu hundert Generationen je Wert — insgesamt zwischen 12.500 und 15.000 verschiedene Generationen. Die letzte Zeile lohnt das Lesen: Der Anteil zufällig erzeugter Individuen machte zwischen 0 und 40 nirgends einen messbaren Unterschied, und das ist kein Ergebnis. Es ist eine Reihe, die nichts aufgelöst hat.
| Parameter | Getestete Werte | Gewählt |
|---|---|---|
| mutation_chance | 1 · 5 · 15 · 30 · 60 · 95 | 15 |
| mutation_magnitude | [0, 0] · [-1, 1] · [-10, 10] · [-100, 100] · [-1000, 1000] | [-1, 1] |
| population_size | 15 · 50 · 100 · 200 · 500 | 500 |
| persistent_individuals | 0 · 5 · 10 · 25 · 40 | 5 |
| random_individuals | 0 · 5 · 10 · 25 · 40 | 0 / 25ergebnislos |
Quelle: das Paper, Abschnitt 4.2, Abbildungen 12 bis 16.
Stack
Stand
Abgeschlossen und eingefroren. Akademische Arbeit, 2021 am IFSC Gaspar verteidigt von Bernardo Pires Mesko, Grégori Sabel, João Vitor Waldrich und Rafael Guilherme Onesko, betreut von Thiago Lipinski-Paes und Raphael Silvano Ferreira Silva. Code und Paper sind öffentlich; gepflegt wird keines von beiden.
Die ehrliche Zusammenfassung: Es hat funktioniert, und es hat nicht gereicht. 58,84% liegen deutlich über dem Zufall und deutlich unter den geforderten 70%. Jede Zahl auf dieser Seite stammt aus dem Paper oder aus einem im Repository versionierten Trainings-Log — und die Zahlen, die dem Projekt schmeicheln, stehen hier nicht ohne die, die es nicht tun.