Predicting the 2020 All-NBA teams with a deep neural network

Introduction

Last year, LeBron James’ 11-year All-NBA 1st team streak came to an end. The Lakers’ lack of success combined with the fact that James played only 55 games dropped him to a 3rd team spot. This year, LeBron is a lock to make the All-NBA 1st team. LeBron leads the league in assists and sits squarely in the MVP conversation with the Lakers in first in the West.

Aside from James, the 1st team seems as predictable as ever. Giannis – the current MVP race leader – will get the forward spot alongside LeBron. Davis will claim the center spot, with Harden one guard spot. The second guard spot may go to either Doncic or Lillard. If Lillard continues his incredible hot streak and leads the Blazers to the playoffs while the Mavs falter, the spot may go to Lillard. (Some may consider Doncic a forward. He’s listed as a guard on the All-Star team, so we assume he counts as a guard).

Last year, we saw a much different race. Giannis and Harden were clear 1st team players the entire season. Voters unanimously placed both players on the 1st team. Curry and George seemed likely to secure the other guard and forward spots. However, those spots were far from certain. Furthermore, Embiid and Jokic were in a tight race for the 1st team center spot.

Though this year’s first team is predictable, the remaining spots seem up in the air. For example, who deserves the 2nd team center spot? Embiid’s injuries likely prevent him from getting the spot. Rudy Gobert, Nikola Jokic, and Bam Adebayo all have strong cases to earn a spot. Given Davis will be on the 1st team, these 4 players must battle it out for the remaining 2 center spots. And that’s not even including Karl-Anthony Towns.

This tight centers race presents only one of the many close calls this year. At this point in the season, players’ stats start to stabilize, allowing us to evaluate their performance. To predict the All-NBA teams, we created a deep neural network.

Last year’s performance

Last year, we created 4 models to predict the All-NBA teams. The models performed exceptionally. The table below shows the predicted teams from the average of the 4 models:

Average PredictionsGuardGuardForwardForwardCenter
1st teamDamian Lillard (0.947)*James Harden (0.997)Giannis Antetokounmpo (1.000)Kevin Durant (0.984)Joel Embiid (0.900)
2nd teamStephen Curry (0.947)*Russell Westbrook (0.811)Paul George (0.963)Kawhi Leonard (0.884)Nikola Jokic (0.897)
3rd teamKyrie Irving (0.713)Kemba Walker (0.417)LeBron James (0.551)Blake Griffin (0.420)Rudy Gobert (0.854)

The asterisk indicates that Lillard and Curry had identical probabilities. We noted this spot would go to Curry. Furthermore, though Durant had a higher probability than George, we said narrative will push George over Durant. If we consider the Lillard/Curry prediction as correct, then we correctly predicted 11/15 spots. (Note that each “switch” necessary is 2 incorrect predictions. So, when we predicted George to be 2nd team and Durant 1st team, and the real result was flipped, we counted that as 2 incorrect predictions even though it’s technically 1 switch.) Each player we predicted to make an All-NBA team made an All-NBA team. The only switches necessary to have perfect predictions are George/Durant and Irving/Westbrook.

Our models’ success last year shows that we can model All-NBA selections with stats. The models looked at historical data starting from the 1979-1980 season (introduction of the 3-point line). Each year, our data set consisted of all the players to make an All-NBA team or the All-Star team. So, we had a small and arbitrary data set. Though All-Stars generally overlap with All-NBA players, there’s no reason to condition on being an All-Star. Using this data, we trained our models with the following features:

Counting statsAdvanced statsTeam statsOther
PTS/GVORPWinsAll-Star *
TRB/GWSOverall seed
AST/G
FG%

These inputs also aren’t perfect. For example, there’s no reason to use FG% instead of TS% of eFG%. There’s also no logic for the specific advanced stats we used. Lastly, team success may be unnecessary. Factoring team success creates a feedback loop. Great players make teams great, so most All-NBA-level players will play on good teams. Though there’s a few exceptions (like Trae Young), team stats won’t give us much information.

We used the models’ prediction probabilities to create the All-NBA teams. The player with the highest prediction probability went into the highest available slot in his position.

This year’s methods

This year, we improved our methods in several ways. We’ll discuss each of them below.

Data

This year, we used much more data. We collected data for every player whose rookie season came on or after the 1979-1980 season. This boundary ensures that every player played their entire career with the 3-point line.

We split our data into 3 parts: a training set, validation set, and testing set. The training set consists of 50% of the data, the validation set 25%, and the testing set 25%. We split up the data sets randomly in a stratified way, meaning we preserve class balance.

Using every player season gives us over 15,000 samples. However, among these 15,000 samples, only 511 of them made an All-NBA team. So, our data set is unbalanced. To combat this, we performed something called SMOTE.

SMOTE

SMOTE (synthetic minority over-sampling technique) is a way to create fake (synthetic) data points to balance our classes. SMOTE creates data points by assigning random weights between 0 and 1 to some neighborhood of points in a class.

We used borderline-SMOTE, which is a special type of SMOTE. Borderline-SMOTE generates synthetic data using borderline minority examples. So, we’re generating data from samples that are close to the majority examples. The hope is that the synthetic data helps the model differentiate between these borderline cases better.

Our initial data set consists of about 15,000 player samples. However, we generated several fake player samples to balance the classes.

One super important thing with SMOTE is to do it after splitting up the data. If we perform SMOTE before splitting our data into training/validation/testing sets, we’ll get misleading accuracy. This is because our model will “bleed” information; samples in the train set could be generated from samples in the test set, and vice versa. Furthermore, it’s important not to use SMOTE on our testing and validation set, because we want those sets to follow the data we’ll use to make new predictions. This is a common mistake that leads to artificially high accuracy and bad models.

We only performed SMOTE on our training set. Our validation and testing sets remain unchanged.

Features

This year, we’re using a much broader range of features. We hope these features better reflect a player’s skill.

The only features we had last year that we don’t have this year are team-based features, such as team wins and seed.

The table below lists all the features we used in our model.

OtherShootingReboundingPassing/ball controlDefenseCatch-alls
GFG, FGA, FG%ORB, ORB%AST, AST%STL, STL%PER
GS2P, 2PA, 2P%DRB, DRB%TOV, TOV%BLK, BLK%OWS, DWS, WS, WS/48
MP3P, 3PA, 3P%TRB, TRB%USG%PFOBPM, DBPM, BPM
FT, FTA, FT%VORP
eFG%RAPTOR (off. and def.)
TS%
3PAr, FTr
PTS

In total, we have 47 features. We see that a lot of them are collinear (meaning some features directly predict another). If we construct the model in a specific way, this isn’t a problem (more on this later).

The model

We used Keras to create a deep neural network. The model consisted of 6 layers. The first layer had 47 nodes, as we had 47 features. The next layer had 32 nodes. From there, each subsequent layer had half the nodes of the previous layer until we reached 4 nodes. From then, the next layer was the output layer (only 1 node).

Each layer except for the last one uses a leaky ReLU activation. The final layer uses a sigmoid activation such that all our probabilities fall between 0 and 1.

Overfitting: regularization

A common issue in machine learning is overfitting. This occurs when a model learns the training data too aggressively. While this results in great training accuracy, it makes the model bad at predicting results from new data. In previous machine learning projects, we’d check for overfitting by looking at cross-validated accuracy metrics. Here, we can take a better approach. We designed the model to avoid overfitting.

The first way we avoid overfitting is with weight regularization. If a model has very large weights, it’s likely to overfit. A small change in input data results in a huge change in the output if we have large weights. Weight regularization fixes this issue.

There are two ways to regularize weights: L1 regularization and L2 regularization. They regularize in different ways. L1 uses the l-1 norm to regularize weights. This results in sparse coefficients, meaning we’re making several weights 0 and keeping the important ones. L2 regularization uses the l-2 norm, which results in shrinking coefficients to smaller values.

The first 3 layers of our model use L1 regularization. This helps fix any issues we’d have with collinearity, as features that don’t contribute to the model will shrink to 0. The final 3 layers of our model had L2 regularization. This shrinks the remaining non-zero coefficients.

Overfitting: early stopping

In a neural network, we’re trying to find the weights and biases that minimize a given loss function. Each time we make a full cycle through the training data, the model updates its weights. We call each cycle an epoch. We pre-set the number of epochs (in this case, 200).

The model calculates the loss function from the training data. Because we’re concerned with making predictions on new data, this could be a problem. Our new data might not mimic our training data. (In fact, it doesn’t because our training data has synthetic observations). This means that we should care about the validation loss too.

In early stopping, we stop the model from completing all the epochs to avoid overfitting. We do this by minimizing the validation loss. If the validation loss rises in a given epoch, then that weight update isn’t making our models more accurate. So, early stopping finds this minimum validation loss and uses those weights.

Our early stopping looks forward 25 epochs before stopping. This means that once we find a validation loss minimum, we look forward 25 epochs. If none of these epochs have lower validation loss, then we use the weights from the previous minimum. This allows us for optimize our weights to both our training and validation data.

Let’s visualize this. The graph below shows the model’s loss on the training and validation data throughout all 200 epochs.

Notice that at some epochs, the loss in the validation data increases. Validation loss at epoch 200 isn’t at a minimum, so our model could be better.

The graph below shows the model’s loss with early stopping.

Notice that at epoch 5, our validation loss is minimized. So, the model completes the next 25 epochs (until epoch 30). None of these epochs result in lower validation loss, so the model stops learning and uses the weights from this earlier epoch.

Overfitting: dropout

The final method we’ll use to avoid overfitting is dropout. Dropout occurs when we randomly drop (or ignore) a certain subset of nodes in a layer. This lets us mimic creating a bunch of different neural network structures in a simple way to see which performs best. Each time we drop a unit, we also drop its connections. This causes other units to adjust their weights accordingly.

Like L1 regularization, dropout can make our coefficients sparse, helping us avoid overfitting. After each layer except for the final output layer, we randomly dropped 20% of the nodes.

Model performance

Now that we understand the model’s structure, let’s evaluate its performance. We’ll use some of the usual classification metrics we present, along with some new ones. We create these metrics by comparing our predicted values from the testing set to the real values from the testing set.

Note that a random model would have about 50% accuracy on the testing set. This is because the training set has a true 50/50 split of classes, while the testing set has a large class imbalance. So, high accuracy is indicative of strong performance here.

First, we’ll look at the confusion matrix.

We see that the model has 5 false negatives (predicted 0 but actual 1). This is a great sign, as we’re most interested in finding the All-NBA worthy players. So, over predicting these (having lots of predicted 1s but actual 0s) is better than under predicting them. Therefore, the high number of false positives is not alarming. In fact, it’s expected given that the training data consisted of several synthetic observations of the positive class. Because of the synthetic data, we would expect the model to over-predict the positive class.

We see that the model has accuracy 0.948, recall 0.961, and precision 0.387 (and consequently, F1 0.552). Though the precision is low, we’d prefer high recall and low precision instead of the other way around here.

To create the teams, we use the same method as last year. The player with the highest predicted probability goes into the highest slot in his position. Because we care about prediction probabilities, we’ll look at some probability-focused metrics.

The model has a log loss of 0.120 and a Brier score of 0.039. Both metrics are quite strong. Next, we’ll look at the ROC curve and the area under it.

The model has a near-perfect area under the ROC curve of 0.99. This means the model is very strong at differentiating between the two classes.

Finally, we’ll look at 2 additional graphs to show our model’s prediction probability strength. First, we’ll look at the cumulative gain.

This shows the percentage of the total cases in a class “gained” by targeting a percentage of the total sample. The dotted black line represents the baseline, or essentially what you’d expect from a true random sample. So, any point along the baseline says “the top x% of the sample contains x% of this class.” This means that the higher we are above the baseline, the better the model is at identifying that class.

We see that the cumulative gain for class 1 is very high. By the top 15% of the sample, we contain almost 100% of class 1. Given that class 1 is All-NBA players, it’s very good that the top 15% of players in All-NBA probability is a superset of all All-NBA players. Though the model isn’t very good at identifying class 0 (not All-NBA players) above random, this is not our main concern.

Next, we’ll look at the lift curve. This presents a similar idea in a different way.

This essentially divides each point on the cumulative gains chart by the baseline. So, the “lift” is the ratio of the cumulative gain to the baseline. For example, at the point (0.2, 5), we see that the model is 5x more likely to identify an All-NBA player in the top 20% of the sample than a random model. Among the highest prediction probabilities, the model is about 30x more likely to identify an All-NBA player than the baseline.

Each of our metrics shows the model’s strength, particularly in predicting the positive class (All-NBA players). We believe the model creates strong predictions for All-NBA players.

Results

On 2/3/2020 before any games were played, we collected all the necessary data for every player who played a game in the 2019-20 All-NBA season. We scaled the necessary stats (like games, win shares, etc.) up to a full season. Then, we fed the model this data to make predictions.

As described before, we created the All-NBA teams with prediction probabilities. When a player’s position was unclear, we used All-Star game position. If the player did not make the All-Star game, we used whichever position the player played the most minutes. So, Luka Doncic counts as a guard. DeMar DeRozan and Jimmy Butler count as forwards.

The table below shows our results.

TeamGGFFC
1James HardenDamian LillardGiannis AntetokounmpoLeBron JamesAnthony Davis
2Luka DoncicBen SimmonsJimmy ButlerKawhi LeonardRudy Gobert
3Devin BookerTrae YoungPascal SiakamDeMar DeRozanNikola Jokic

To view each player’s probability, look at the table below.

PlayerAll-NBA probability
James Harden0.9480215311050415
Giannis Antetokounmpo0.9480148553848267
Anthony Davis0.9479857683181763
Damian Lillard0.9479836225509644
LeBron James0.947951078414917
Luka Doncic0.9479497671127319
Jimmy Butler0.9478923678398132
Rudy Gobert0.9478687644004822
Kawhi Leonard0.9478293657302856
Ben Simmons0.9477744102478027
Nikola Jokic0.9475186467170715
Karl-Anthony Towns0.9472841024398804
Bam Adebayo0.9470556974411011
Devin Booker0.9464844465255737
Joel Embiid0.9444474577903748
Domantas Sabonis0.9431513547897339
Trae Young0.9424223899841309
Kemba Walker0.9404627084732056
Kyle Lowry0.9393622875213623
Hassan Whiteside0.9336522221565247
Khris Middleton0.9310164451599121
Fred VanVleet0.9268943071365356
Pascal Siakam0.922353208065033
Russell Westbrook0.9170670509338379
Chris Paul0.9143471121788025
DeMar DeRozan0.9121332168579102
Donovan Mitchell0.8602151274681091
Clint Capela0.8315081596374512
Kyrie Irving0.829150915145874
Brandon Ingram0.8029384613037109
Bradley Beal0.7760326862335205
Nikola Vucevic0.7025138139724731
Jayson Tatum0.6029720306396484
Jaylen Brown0.5255657434463501
Paul George0.44798198342323303
Gordon Hayward0.4315990209579468
Danilo Gallinari0.4140489399433136
Eric Bledsoe0.3475889563560486
LaMarcus Aldridge0.31634461879730225
Tobias Harris0.21559995412826538
Zach LaVine0.20887699723243713
Malcolm Brogdon0.18707752227783203
Andre Drummond0.17573970556259155
De'Aaron Fox0.14996907114982605
Shai Gilgeous-Alexander0.1443256437778473
Steven Adams0.14309266209602356
John Collins0.12286686897277832
Stephen Curry0.10660269856452942
Richaun Holmes0.08404144644737244
Jarrett Allen0.07887303829193115
Jrue Holiday0.07769456505775452
Will Barton0.07266959547996521
T.J. Warren0.07223466038703918
D'Angelo Russell0.06265479326248169
Jamal Murray0.060570478439331055
Al Horford0.057276129722595215
Zion Williamson0.05636218190193176
Bojan Bogdanovic0.04099854826927185
Wendell Carter0.04053768515586853
Jonas Valanciunas0.03906595706939697
Jonathan Isaac0.0366000235080719
Kelly Oubre0.034963369369506836
Deandre Ayton0.028072267770767212
Evan Fournier0.027677983045578003
Ricky Rubio0.02220931649208069
Ja Morant0.021437644958496094
Andrew Wiggins0.019577056169509888
Marcus Morris0.017286360263824463
Paul Millsap0.01654037833213806
Kristaps Porzingis0.01575717329978943
CJ McCollum0.013874620199203491
Patrick Beverley0.012319177389144897
Marc Gasol0.011332482099533081
Josh Richardson0.009869635105133057
Jeremy Lamb0.008057057857513428
Derrick Favors0.007891297340393066
Kevin Love0.007175415754318237
Daniel Theis0.006873130798339844
Myles Turner0.0059681236743927
Zach Collins0.005391627550125122
Tomas Satoransky0.005050539970397949
Luke Kennard0.00469401478767395
Brook Lopez0.004653066396713257
Dwight Powell0.00436052680015564
Otto Porter0.0037623047828674316
Reggie Jackson0.0031495392322540283
Kendrick Nunn0.0030628740787506104
Lauri Markkanen0.0029882490634918213
Jaren Jackson0.0028879642486572266
Rodney Hood0.002882152795791626
Julius Randle0.0026159584522247314
OG Anunoby0.002580493688583374
Blake Griffin0.002436310052871704
JaVale McGee0.0024200379848480225
Harrison Barnes0.0021103322505950928
Rui Hachimura0.0018580853939056396
Nemanja Bjelica0.0018393993377685547
Aaron Gordon0.001834958791732788
Terry Rozier0.0016864240169525146
Carmelo Anthony0.0013953745365142822
Marques Bolden0.0013028383255004883
Gary Harris0.001286238431930542
Tristan Thompson0.001275777816772461
Ivica Zubac0.0012688494753092527
Joe Harris0.0011789202690124512
P.J. Tucker0.0011532902717590332
Draymond Green0.0011351406574249268
Talen Horton-Tucker0.0011055171489715576
Victor Oladipo0.0009457767009735107
Thomas Bryant0.0007428228855133057
Robert Covington0.0006920397281646729
Eric Mika0.000676274299621582
Josh Jackson0.0006466209888458252
P.J. Washington0.0006004869937896729
Dorian Finney-Smith0.000508725643157959
Justise Winslow0.0005022585391998291
Collin Sexton0.0005015730857849121
Matt Mooney0.00046500563621520996
Glenn Robinson0.00041490793228149414
Danny Green0.0003979504108428955
Spencer Dinwiddie0.00031563639640808105
Naz Mitrou-Long0.0002961158752441406
Marvin Bagley0.0002734065055847168
Marcus Smart0.00026682019233703613
Reggie Bullock0.00024819374084472656
Royce O'Neale0.0002320706844329834
Duncan Robinson0.0002116560935974121
Wesley Matthews0.00021076202392578125
Jae Crowder0.0001970529556274414
Dion Waiters0.00019669532775878906
Buddy Hield0.0001939237117767334
Mike Conley0.00019115209579467773
Ian Mahinmi0.00017258524894714355
Dillon Brooks0.00016617774963378906
Ryan Anderson0.00011214613914489746
Devonte' Graham0.00010818243026733398
Markelle Fultz0.0001055300235748291
J.J. Redick0.0001004934310913086
Willie Cauley-Stein8.52346420288086e-05
Josh Gray7.703900337219238e-05
Frank Mason7.477402687072754e-05
Jabari Parker6.115436553955078e-05
Meyers Leonard6.115436553955078e-05
Taurean Prince5.650520324707031e-05
Aron Baynes5.59687614440918e-05
Jarrell Brantley5.117058753967285e-05
RJ Barrett4.9740076065063477e-05
Elfrid Payton4.9620866775512695e-05
Max Strus4.8547983169555664e-05
DaQuan Jeffries4.4286251068115234e-05
Jeremiah Martin4.2438507080078125e-05
Cedi Osman3.981590270996094e-05
Gary Payton3.793835639953613e-05
Miles Bridges3.7789344787597656e-05
Tony Snell3.6269426345825195e-05
Udonis Haslem3.457069396972656e-05
Dejounte Murray3.427267074584961e-05
Terrance Ferguson3.349781036376953e-05
J.J. Barea2.9593706130981445e-05
Brian Bowen2.9087066650390625e-05
Paul Watson2.8967857360839844e-05
Justin Anderson2.79843807220459e-05
Miye Oni2.7865171432495117e-05
Landry Shamet2.7805566787719727e-05
Lonzo Ball2.7120113372802734e-05
Tremont Waters2.60770320892334e-05
Amir Coffey2.1338462829589844e-05
PJ Dozier1.9878149032592773e-05
Khyri Thomas1.9848346710205078e-05
Daryl Macon1.9341707229614258e-05
Zylan Cheatham1.8894672393798828e-05
Isaiah Roby1.8537044525146484e-05
Henry Ellenson1.8298625946044922e-05
Dario Saric1.77919864654541e-05
Adam Mokoka1.728534698486328e-05
Vic Law1.659989356994629e-05
Jalen McDaniels1.5914440155029297e-05
Luguentz Dort1.519918441772461e-05
Stanton Kidd1.4662742614746094e-05
Zhaire Smith1.3679265975952148e-05
Jared Harper1.290440559387207e-05
Danuel House1.2576580047607422e-05
Dragan Bender1.2308359146118164e-05
Kevin Huerter1.2010335922241211e-05
Johnathan Motley1.1563301086425781e-05
Caleb Martin1.138448715209961e-05
Johnathan Williams1.099705696105957e-05
Keldon Johnson1.0520219802856445e-05
Avery Bradley1.0460615158081055e-05
Chandler Parsons1.0013580322265625e-05
Tacko Fall9.179115295410156e-06
Kadeem Allen9.08970832824707e-06
Jaylen Nowell9.03010368347168e-06
Zach Norvell8.702278137207031e-06
John Konchar7.748603820800781e-06
Michael Frazier7.539987564086914e-06
Kyle Guy7.3909759521484375e-06
Jalen Lecque7.3909759521484375e-06
Justin Patton7.12275505065918e-06
Josh Magette7.0035457611083984e-06
Alen Smailagic6.8247318267822266e-06
B.J. Johnson6.377696990966797e-06
Norman Powell6.318092346191406e-06
Bryn Forbes6.22868537902832e-06
Dewan Hernandez6.020069122314453e-06
Isaiah Thomas5.662441253662109e-06
Devon Hall5.602836608886719e-06
Shamorie Ponds5.334615707397461e-06
Kostas Antetokounmpo5.304813385009766e-06
De'Andre Hunter5.066394805908203e-06
Tim Hardaway5.0067901611328125e-06
Bruce Brown4.589557647705078e-06
Jake Layman4.589557647705078e-06
Yuta Watanabe4.559755325317383e-06
Damion Lee4.500150680541992e-06
C.J. Miles4.112720489501953e-06
Louis King3.6954879760742188e-06
Jordan Bone3.6656856536865234e-06
JaKarr Sampson3.6656856536865234e-06
Joe Ingles3.635883331298828e-06
KZ Okpala3.039836883544922e-06
Antonius Cleveland2.9206275939941406e-06
Vlatko Cancar2.7120113372802734e-06
Kevin Hervey2.562999725341797e-06
Sekou Doumbouya2.562999725341797e-06
Courtney Lee2.5033950805664062e-06
Taj Gibson2.384185791015625e-06
Shabazz Napier2.2351741790771484e-06
Gabe Vincent2.205371856689453e-06
Kevon Looney2.175569534301758e-06
Cristiano Felicio2.115964889526367e-06
Serge Ibaka2.115964889526367e-06
Jonah Bolden1.9669532775878906e-06
Nigel Williams-Goss1.9669532775878906e-06
Charlie Brown1.6689300537109375e-06
Drew Eubanks1.4901161193847656e-06
Eric Gordon1.3113021850585938e-06
Josh Reaves1.2218952178955078e-06
Justin Robinson1.2218952178955078e-06
Chris Chiozza1.2218952178955078e-06
Khem Birch1.1920928955078125e-06
Dean Wade1.1920928955078125e-06
Patrick McCaw1.1026859283447266e-06
Caris LeVert1.1026859283447266e-06
Garrett Temple1.0728836059570312e-06
Shake Milton1.043081283569336e-06
Jordan McLaughlin1.0132789611816406e-06
Moritz Wagner1.0132789611816406e-06
Jarred Vanderbilt9.238719940185547e-07
Mfiondu Kabengele7.748603820800781e-07
Michael Kidd-Gilchrist6.854534149169922e-07
Cody Zeller6.258487701416016e-07
Maurice Harkless6.258487701416016e-07
Nicolas Claxton5.960464477539062e-07
Moses Brown5.662441253662109e-07
Ryan Broekhoff5.662441253662109e-07
Darius Garland5.662441253662109e-07
Jahlil Okafor5.066394805908203e-07
Ignas Brazdeikis4.76837158203125e-07
Kris Dunn4.470348358154297e-07
Donte DiVincenzo4.172325134277344e-07
Iman Shumpert3.8743019104003906e-07
Jaylen Hoard3.5762786865234375e-07
Frank Kaminsky2.980232238769531e-07
Norvel Pelle2.980232238769531e-07
Juwan Morgan2.682209014892578e-07
Caleb Swanigan2.384185791015625e-07
Naz Reid2.086162567138672e-07
Garrison Mathews2.086162567138672e-07
Tyler Cook2.086162567138672e-07
Chandler Hutchison2.086162567138672e-07
Al-Farouq Aminu2.086162567138672e-07
Alize Johnson2.086162567138672e-07
Bismack Biyombo2.086162567138672e-07
Robert Williams1.7881393432617188e-07
Rayjon Tucker1.7881393432617188e-07
Tim Frazier1.4901161193847656e-07
Chimezie Metu1.4901161193847656e-07
Brandon Goodwin1.1920928955078125e-07
Brandon Knight1.1920928955078125e-07
Romeo Langford1.1920928955078125e-07
Ante Zizic1.1920928955078125e-07
Nicolas Batum8.940696716308594e-08
Derrick Rose8.940696716308594e-08
James Johnson8.940696716308594e-08
Tyrone Wallace8.940696716308594e-08
Ty Jerome8.940696716308594e-08
Thanasis Antetokounmpo8.940696716308594e-08
Melvin Frazier8.940696716308594e-08
Vincent Poirier8.940696716308594e-08
Isaac Bonga5.960464477539063e-08
Evan Turner5.960464477539063e-08
Isaiah Hartenstein5.960464477539063e-08
Wenyen Gabriel5.960464477539063e-08
Trey Lyles5.960464477539063e-08
Edmond Sumner5.960464477539063e-08
Harry Giles5.960464477539063e-08
Jeff Teague2.9802322387695312e-08
Alec Burks2.9802322387695312e-08
Wilson Chandler2.9802322387695312e-08
Allonzo Trier2.9802322387695312e-08
Kyle O'Quinn2.9802322387695312e-08
David Nwaba2.9802322387695312e-08
Kelan Martin2.9802322387695312e-08
DeMarre Carroll2.9802322387695312e-08
Kenrich Williams2.9802322387695312e-08
Jarrett Culver2.9802322387695312e-08
Mason Plumlee0.0
Theo Pinson0.0
Dwayne Bacon0.0
Jakob Poeltl0.0
Anfernee Simons0.0
Mo Bamba0.0
Coby White0.0
Matisse Thybulle0.0
Grant Williams0.0
Chris Silva0.0
Marvin Williams0.0
Ish Smith0.0
Derrick White0.0
Christian Wood0.0
Trevor Ariza0.0
Patrick Patterson0.0
Anzejs Pasecniks0.0
Eric Paschall0.0
Matt Thomas0.0
Omari Spellman0.0
Ryan Arcidiacono0.0
Noah Vonleh0.0
D.J. Wilson0.0
Grayson Allen0.0
Davis Bertans0.0
Jordan Poole0.0
Thabo Sefolosha0.0
Kevin Porter0.0
Delon Wright0.0
Lou Williams0.0
Jerome Robinson0.0
Gary Trent0.0
Thaddeus Young0.0
Austin Rivers0.0
Mitchell Robinson0.0
Darius Bazley0.0
Brad Wanamaker0.0
Denzel Valentine0.0
Derrick Walton0.0
Rajon Rondo0.0
Terrence Ross0.0
D.J. Augustin0.0
Kyle Anderson0.0
Kent Bazemore0.0
Cam Reddish0.0
Malik Beasley0.0
Lonnie Walker0.0
Marco Belinelli0.0
Jordan Bell0.0
Bobby Portis0.0
Keita Bates-Diop0.0
Nickeil Alexander-Walker0.0
Admiral Schofield0.0
DeAndre' Bembry0.0
Michael Porter0.0
Anthony Tolliver0.0
Dennis Schroder0.0
Mike Scott0.0
Dennis Smith0.0
Ky Bowman0.0
Kelly Olynyk0.0
Alex Caruso0.0
Treveon Graham0.0
Jerami Grant0.0
JaMychal Green0.0
Javonte Green0.0
Jeff Green0.0
Vince Carter0.0
Marko Guduric0.0
Jevon Carter0.0
Montrezl Harrell0.0
Kentavious Caldwell-Pope0.0
Shaquille Harrison0.0
Josh Hart0.0
Jaxson Hayes0.0
Bruno Caboclo0.0
John Henson0.0
Juancho Hernangomez0.0
Willy Hernangomez0.0
Tyler Herro0.0
Mario Hezonja0.0
George Hill0.0
Solomon Hill0.0
Aaron Holiday0.0
Deonte Burton0.0
Justin Holiday0.0
Rondae Hollis-Jefferson0.0
Trey Burke0.0
Dwight Howard0.0
Ersan Ilyasova0.0
Jalen Brunson0.0
Michael Carter-Williams0.0
Tyson Chandler0.0
Josh Okogie0.0
Rudy Gay0.0
Quinn Cook0.0
Allen Crabbe0.0
Torrey Craig0.0
Seth Curry0.0
Troy Daniels0.0
Ed Davis0.0
Terence Davis0.0
Dewayne Dedmon0.0
Matthew Dellavedova0.0
Chris Clemons0.0
Cheick Diallo0.0
Hamidou Diallo0.0
Gorgui Dieng0.0
Damyean Dotson0.0
Goran Dragic0.0
Jordan Clarkson0.0
Jared Dudley0.0
Carsen Edwards0.0
Wayne Ellington0.0
Brandon Clarke0.0
James Ennis0.0
Jacob Evans0.0
Dante Exum0.0
Gary Clark0.0
Bruno Fernando0.0
Yogi Ferrell0.0
Marquese Chriss0.0
Daniel Gafford0.0
Langston Galloway0.0
Troy Brown0.0
Wes Iwundu0.0
Frank Jackson0.0
Sterling Brown0.0
T.J. McConnell0.0
Doug McDermott0.0
Chris Boucher0.0
Rodney McGruder0.0
Alfonzo McKinnie0.0
Ben McLemore0.0
Jordan McRae0.0
Nicolo Melli0.0
De'Anthony Melton0.0
Malcolm Miller0.0
Patty Mills0.0
Malik Monk0.0
E'Twaun Moore0.0
Bogdan Bogdanovic0.0
Markieff Morris0.0
Monte Morris0.0
Emmanuel Mudiay0.0
Goga Bitadze0.0
Dzanan Musa0.0
Mike Muscala0.0
Svi Mykhailiuk0.0
Abdel Nader0.0
Larry Nance0.0
Raul Neto0.0
Georges Niang0.0
Nerlens Noel0.0
Frank Ntilikina0.0
Semi Ojeleye0.0
Elie Okobo0.0
Cody Martin0.0
Pat Connaughton0.0
Boban Marjanovic0.0
Furkan Korkmaz0.0
Justin Jackson0.0
Justin James0.0
Amile Jefferson0.0
Cameron Johnson0.0
Stanley Johnson0.0
Damian Jones0.0
Derrick Jones0.0
Tyus Jones0.0
DeAndre Jordan0.0
Cory Joseph0.0
Enes Kanter0.0
Maxi Kleber0.0
Kevin Knox0.0
Luke Kornet0.0
Terance Mann0.0
Kyle Korver0.0
Rodions Kurucs0.0
Kyle Kuzma0.0
Skal Labissiere0.0
Oshae Brissett0.0
T.J. Leaf0.0
Alex Len0.0
Mikal Bridges0.0
Nassir Little0.0
Robin Lopez0.0
Tony Bradley0.0
Timothe Luwawu-Cabarrot0.0
Thon Maker0.0
Tyler Johnson0.0

We see that several players have small differences in their All-NBA probabilities. This will likely stabilize as the season progresses.

Conclusion

Last year, our models almost perfectly predicted the All-NBA teams. This year, we’re taking a different – and hopefully better – approach. So far, our models return what many project for the All-NBA teams.

To improve the model, we could take a few different steps. First, several players have extremely close All-NBA probabilities. This is due to how we constructed the problem. For example, using SMOTE gives us more positive class examples, but it means that the All-NBA worthy players all have high probabilities. Furthermore, different model structures – such as using different numbers of layers, regularization, or activation functions – may help this. Nevertheless, the model’s historical performance is extremely strong. Therefore, it is likely a robust predictor of this year’s All-NBA teams.

Share this post

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.