04 · Inspirit AI · Machine Learning

NBA MVP Prediction
with Machine Learning

2023 · Python · scikit-learn
Inspirit AI · Saratoga High School

0
Players analyzed
0
Seasons of data
0
ML models
0
Key features

Can an algorithm predict
the NBA's most coveted award?

Can machine learning predict who wins the NBA's most prestigious individual award? This paper investigates that question using 16 seasons of game data spanning over 400 players. We trained seven models — from simple K-Nearest Neighbors to ensemble methods like Random Forest and Gradient Boosting — to predict each player's MVP vote share.

The results showed that SVM and Random Forest consistently outperformed the field, tracking actual vote shares within 3–5% for top candidates. KNN and AdaBoost systematically underestimated dominant MVP seasons — Jokic's 2021–22 campaign showed actual share 0.875 but KNN predicted only 0.700.

400+
NBA players
16
Seasons
7
ML models
8
Features

Three datasets,
one target variable

The model combines three sources to build a complete picture of each player's season: raw game performance, physical attributes, and historical voting outcomes.

Game Statistics
Basketball Reference

Per-game stats covering PTS, FG%, 3P%, AST, STL, BLK, and minutes played across 16 NBA seasons from 2006–2022.

Physiological Data
NBA.com / ESPN

Height, weight, age, wingspan, and body composition data for contextualizing performance metrics relative to physical profile.

MVP Voting History
Basketball Reference

Historical MVP vote shares (0.0–1.0) as the regression target. Captures the full distribution of votes, not just the winner's binary outcome.

8 Selected features → target variable
PTS MP FG% 3P% 2P% AST STL BLK MVP Vote Share 0.0–1.0

From raw data
to predictions

A 9-step pipeline transforms three raw datasets into model-ready training and test splits.

Step 01
Collect

Scrape game stats, physiological data, and MVP voting records from Basketball Reference and NBA.com.

Step 02
Clean

Handle missing values, remove duplicates, and standardize player name formatting across all three sources.

Step 03
Merge

Join datasets on player ID and season year to create a unified player-season record per row.

Step 04
Select

Feature selection retains 8 most predictive metrics: PTS, MP, FG%, 3P%, 2P%, AST, STL, BLK.

Step 05
Normalize

StandardScaler normalizes all features to zero mean and unit variance — critical for SVM and KNN.

Step 06
Split

Train on 2006–2020, test on 2020–21 and 2021–22 to prevent any data leakage.

Step 07
Train

Fit all 7 models on the training set with hyperparameters tuned via cross-validation.

Step 08
Predict

Run each model on the test seasons to generate predicted MVP vote shares for all eligible players.

Step 09
Evaluate

Compare predictions to actual vote shares using MAE and R². Rank all 7 models by accuracy.

The model in code

Core training pipeline from the GitHub repository. Features are standardized before fitting — critical for SVM and KNN, whose predictions are distance-based and scale-sensitive.

train_models.py
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor, AdaBoostRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import ElasticNet
from lightgbm import LGBMRegressor
from xgboost import XGBRegressor

FEATURES = ['PTS', 'MP', 'FG%', '3P%', '2P%', 'AST', 'STL', 'BLK']
TARGET   = 'MVP_Vote_Share'

# Normalize features — required for distance-based models (SVM, KNN)
scaler  = StandardScaler()
X_train = scaler.fit_transform(df_train[FEATURES])
X_test  = scaler.transform(df_test[FEATURES])
y_train, y_test = df_train[TARGET], df_test[TARGET]

models = {
    "SVM":          SVR(kernel='rbf', C=1.0),
    "RandomForest": RandomForestRegressor(n_estimators=100, random_state=42),
    "KNN":          KNeighborsRegressor(n_neighbors=5),
    "AdaBoost":     AdaBoostRegressor(random_state=42),
    "ElasticNet":   ElasticNet(alpha=0.01),
    "LightGBM":     LGBMRegressor(n_estimators=100),
    "XGBoost":      XGBRegressor(n_estimators=100),
}

for name, model in models.items():
    model.fit(X_train, y_train)
    preds = model.predict(X_test)
    evaluate(name, y_test, preds)

What drives
MVP predictions

Feature Importance (Random Forest)

Points (PTS)38%
Field Goal % (FG%)22%
Minutes Played (MP)18%
Assists (AST)10%
Steals (STL)5%
Blocks (BLK)4%
2-Pt % (2P%)2%
3-Pt % (3P%)1%
Support Vector Machine
2nd Overall · 89%

Uses a radial basis function kernel to map player stats into high-dimensional space, finding the hyperplane that best predicts vote share. Excels at capturing non-linear scoring-voting relationships.

Jokic 2021–22: predicted 0.848 vs actual 0.875 (−3.1%)
Random Forest
1st Overall · 92%

Ensemble of 100 decision trees. Each tree votes on predicted vote share; the forest averages them. Naturally handles feature interactions and provides interpretable feature importances.

Jokic 2021–22: predicted 0.862 vs actual 0.875 (−1.5%)
K-Nearest Neighbors
6th Overall · 50%

Predicts vote share by averaging the 5 most similar player-seasons. Struggles with outlier seasons — dominant years have no close neighbors, causing systematic underestimation.

Jokic 2021–22: predicted 0.700 vs actual 0.875 (−19.9%)
AdaBoost
7th Overall · 40%

Sequentially boosts weak learners by focusing on previously misclassified samples. Performs worst on runaway MVP seasons — the training distribution underweights extreme vote share values.

Jokic 2021–22: predicted 0.676 vs actual 0.875 (−22.7%)

SVM and Random Forest
led all models

Tested on the 2020–21 and 2021–22 NBA seasons. The gap between models was largest for dominant MVP seasons with historically high vote shares.

Key finding: For Jokic's 2021–22 MVP season (actual share: 0.875), Random Forest predicted 0.862 and SVM predicted 0.848 — both within 3% of the true value. KNN and AdaBoost underestimated by 20–23%, unable to recognize how far this season diverged from historical norms.
Actual
SVM
Random Forest
KNN
AdaBoost
Nikola Jokic · 2021–22
Real
0.875
SVM
0.848
RF
0.862
KNN
0.700
Ada
0.676
Joel Embiid · 2021–22
Real
0.706
SVM
0.682
RF
0.695
KNN
0.525
Ada
0.496
Giannis Antetokounmpo · 2021–22
Real
0.595
SVM
0.568
RF
0.548
KNN
0.324
Ada
0.283
Jayson Tatum · 2021–22
Real
0.183
SVM
0.197
RF
0.168
KNN
0.150
Ada
0.120

Model Accuracy Ranking

#1 Best
RF
92%
#2
SVM
89%
#3
LightGBM
76%
#4
XGBoost
70%
#5
ElasticNet
63%
#6
KNN
50%
#7
AdaBoost
40%

Season-by-season
predictions

How the best models tracked against actual vote shares for each MVP winner from 2013–22.

Season MVP Winner Actual SVM RF Best
2021–22Nikola Jokic0.8750.8480.862RF
2020–21Nikola Jokic0.7310.7100.688SVM
2019–20Giannis Antetokounmpo0.9600.9320.944RF
2018–19Giannis Antetokounmpo0.7810.7400.758RF
2017–18James Harden0.7120.6950.672SVM
2016–17Russell Westbrook0.8220.7780.800RF
2015–16Stephen Curry1.0000.9560.972RF
2013–14Kevin Durant0.9210.8930.907RF

What we found

01
SVM and Random Forest are the clear leaders

Both models tracked within 3–5% for dominant MVP seasons. Their ability to model non-linear relationships between raw stats and voting behaviour gave them a consistent edge over linear and distance-based approaches.

02
KNN and AdaBoost underestimate elite performance

Both methods systematically underpredicted runaway winners like Jokic and Giannis. KNN averages nearest neighbors — which underweights unprecedented seasons. AdaBoost reweights toward historically common outcomes, missing historical outliers.

03
Points and minutes are most predictive

Points per game and minutes played held the highest feature importance across all ensemble models. This matches intuition — voters reward availability and scoring volume simultaneously.

04
Team record is the missing variable

Win percentage is historically significant in real-world MVP voting — no player has won from a losing team in decades — but it was absent from this dataset. Adding team-level context would likely improve every model.