The Line Blender: Using GNN Embeddings for Player Rankings

2026-01-31

Throughout this series, we have explored how players interact within lines and teams. We’ve seen how to optimize a single roster and how to predict performance for unseen combinations. Here, we are inverting the logic: instead of asking how to build a team around players, we are asking which individual players provide the most value to any line they join.

To rank players, we can create a sample of hypothetical line and pairing combinations leaving an open spot for evaluation. Then, for every player in the league, we place them into the open spot across each sampled line. With the line or pairing now full, we can score the line using our model. Lastly, each player's performance in the line is compared against all other players.

This effectively measures a player's "portability"—the ability to drive play regardless of the system or quality of teammates.

Note, that for each season, players were limited to those who played at least ~600 mins of icetime over the season1.

Forwards

RankPlayerTeamPosGP
1Nathan MacKinnonCOLC50
2Nikita KucherovTBLR47
3Connor McDavidEDMC54
4Artturi LehkonenCOLL50
5Andrei SvechnikovCARR52
6Martin NecasCOLC50
7Cutter GauthierANAL52
8Beckett SenneckeANAR53
9Auston MatthewsTORC46
10Timo MeierNJDR47
11Dylan GuentherUTAR52
12Sam BennettFLAC51
13Tage ThompsonBUFC51
14Sidney CrosbyPITC51
15Brock NelsonCOLC50
16Alex OvechkinWSHL53
17Kirill MarchenkoCBJR47
18Anders LeeNYIL52
19Jason RobertsonDALL52
20David PastrnakBOSR48
RankPlayerTeamPosGP
1Nathan MacKinnonCOLC79
2Sidney CrosbyPITC80
3Nikita KucherovTBLR78
4Rickard RakellPITR81
5Auston MatthewsTORC67
6Filip ForsbergNSHL82
7Sam BennettFLAC76
8Timo MeierNJDR80
9Brady TkachukOTTL72
10Anders LeeNYIL82
11Bryan RustPITR71
12Sebastian AhoCARC79
13Zach HymanEDML73
14Pierre-Luc DuboisWSHL82
15Clayton KellerUTAR81
16Cole CaufieldMTLR82
17Leon DraisaitlEDMC71
18Frank VatranoANAR81
19Seth JarvisCARC73
20Connor McDavidEDMC67
RankPlayerTeamPosGP
1Nathan MacKinnonCOLC82
2Auston MatthewsTORC81
3Sidney CrosbyPITC82
4Zach HymanEDML80
5Connor McDavidEDMC76
6Mikko RantanenCOLR80
7Brady TkachukOTTL81
8Nikita KucherovTBLR81
9Filip ForsbergNSHL82
10Owen TippettPHIR78
11Ross ColtonCOLC80
12Bryan RustPITR62
13Jesper BrattNJDL82
14Trevor MooreLAKL82
15David PastrnakBOSR82
16Warren FoegeleEDML82
17Timo MeierNJDR69
18John TavaresTORC80
19Martin NecasCARC77
20Jake GuentzelCARC67
RankPlayerTeamPosGP
1Matthew TkachukFLAL79
2Brady TkachukOTTL82
3Auston MatthewsTORC74
4Sidney CrosbyPITC82
5Nathan MacKinnonCOLC71
6Tage ThompsonBUFC78
7William NylanderTORR82
8Carter VerhaegheFLAC81
9Jeff SkinnerBUFL79
10Mikko RantanenCOLR82
11Zach HymanEDML79
12Jake GuentzelPITL78
13David PastrnakBOSR82
14Rickard RakellPITR82
15Alex OvechkinWSHL73
16Tim StutzleOTTL78
17Connor McDavidEDMC82
18Jack HughesNJDC78
19Jesper BrattNJDL82
20Jason ZuckerPITL78
RankPlayerTeamPosGP
1Auston MatthewsTORC73
2Timo MeierSJSR77
3Sam BennettFLAC71
4Viktor ArvidssonLAKL66
5Jake GuentzelPITL76
6Michael BuntingTORL79
7Carter VerhaegheFLAC78
8Aleksander BarkovFLAC67
9Nathan MacKinnonCOLC65
10Matthew TkachukCGYL82
11Sidney CrosbyPITC69
12Vladimir TarasenkoSTLR75
13Connor McDavidEDMC80
14Jonathan HuberdeauFLAL80
15John TavaresTORC79
16Pierre-Luc DuboisWPGL81
17Nikolaj EhlersWPGL62
18Mitchell MarnerTORR72
19Phillip DanaultLAKC79
20Elias LindholmCGYC82
RankPlayerTeamPosGP
1Auston MatthewsTORC52
2Nathan MacKinnonCOLC48
3Connor McDavidEDMC56
4Gabriel LandeskogCOLL54
5Brady TkachukOTTL56
6Mikko RantanenCOLR52
7Jonathan MarchessaultVGKC55
8Patrice BergeronBOSC54
9Max PaciorettyVGKL48
10David PastrnakBOSR48
11Tyler ToffoliMTLC52
12John TavaresTORC56
13Aleksander BarkovFLAC50
14Bryan RustPITR56
15Nazem KadriCOLC56
16Timo MeierS.JR54
17Evander KaneS.JL56
18Craig SmithBOSC54
19Andrei SvechnikovCARR55
20Alex TuchVGKR55


Defense

RankPlayerTeamPosGP
1Sam MalinskiCOLD50
2Cale MakarCOLD50
3Brent BurnsCOLD50
4Mattias EkholmEDMD54
5Sean WalkerCARD52
6Zach WerenskiCBJD47
7Josh MansonCOLD50
8Devon ToewsCOLD40
9Jakob ChychrunWSHD51
10Evan BouchardEDMD54
11Jacob TroubaANAD52
12MacKenzie WeegarCGYD52
13Alexander NikishinCARD51
14Rasmus AnderssonVGKD50
15Jordan SpenceOTTD43
16Darren RaddyshTBLD45
17Morgan RiellyTORD51
18John CarlsonWSHD49
19Darnell NurseEDMD54
20Mikhail SergachevUTAD52
RankPlayerTeamPosGP
1Brent BurnsCARD82
2Zach WerenskiCBJD81
3Erik KarlssonPITD82
4Cale MakarCOLD80
5Evan BouchardEDMD82
6Darnell NurseEDMD76
7Mattias EkholmEDMD65
8Jaccob SlavinCARD80
9Thomas ChabotOTTD80
10Devon ToewsCOLD76
11Rasmus DahlinBUFD73
12Gustav ForslingFLAD80
13Sean WalkerCARD82
14Victor HedmanTBLD79
15Dougie HamiltonNJDD64
16Jake WalmanEDMD65
17Noah DobsonNYID71
18Dmitry OrlovCARD76
19Thomas HarleyDALD78
20Alex PietrangeloVGKD71
RankPlayerTeamPosGP
1Roman JosiNSHD82
2Mattias EkholmEDMD79
3Evan BouchardEDMD81
4Brent BurnsCARD82
5Jaccob SlavinCARD81
6Victor HedmanTBLD78
7Josh MorrisseyWPGD81
8Erik KarlssonPITD82
9Morgan RiellyTORD72
10Rasmus DahlinBUFD81
11Darnell NurseEDMD81
12Zach WerenskiCBJD70
13Cale MakarCOLD77
14Kris LetangPITD82
15MacKenzie WeegarCGYD82
16Brady SkjeiCARD80
17Sean WalkerCOLD81
18Josh MansonCOLD76
19Noah DobsonNYID79
20Gustav ForslingFLAD79
RankPlayerTeamPosGP
1Brent BurnsCARD82
2Dougie HamiltonNJDD82
3Brandon MontourFLAD80
4Kris LetangPITD64
5Victor HedmanTBLD76
6Gustav ForslingFLAD82
7Roman JosiNSHD67
8MacKenzie WeegarCGYD81
9Erik KarlssonSJSD82
10Noah HanifinCGYD81
11Travis HamonicOTTD75
12Brady SkjeiCARD81
13Devon ToewsCOLD80
14Damon SeversonNJDD81
15Darnell NurseEDMD82
16Radko GudasFLAD72
17Thomas ChabotOTTD68
18Aaron EkbladFLAD71
19Rasmus DahlinBUFD78
20Josh MorrisseyWPGD78
RankPlayerTeamPosGP
1MacKenzie WeegarFLAD80
2Brandon MontourFLAD81
3Morgan RiellyTORD82
4Evan BouchardEDMD81
5Gustav ForslingFLAD71
6Aaron EkbladFLAD61
7Roman JosiNSHD80
8Noah HanifinCGYD81
9Cale MakarCOLD77
10Brady SkjeiCARD82
11Radko GudasFLAD77
12Kris LetangPITD78
13Charlie McAvoyBOSD78
14Darnell NurseEDMD71
15Dougie HamiltonNJDD62
16Shea TheodoreVGKD78
17Victor HedmanTBLD82
18Jaccob SlavinCARD79
19Justin FaulkSTLD76
20Alex PietrangeloVGKD80
RankPlayerTeamPosGP
1Darnell NurseEDMD56
2Tyson BarrieEDMD56
3Shea TheodoreVGKD53
4Dougie HamiltonCARD55
5Alex PietrangeloVGKD41
6Alec MartinezVGKD53
7Devon ToewsCOLD53
8Thomas ChabotOTTD49
9Jakob ChychrunARID56
10Roman JosiNSHD48
11Jake MuzzinTORD53
12Ryan GravesCOLD54
13Morgan RiellyTORD55
14Brett PesceCARD55
15Radko GudasFLAD54
16Seth JonesCBJD56
17Mark GiordanoCGYD56
18Nicolas HagueVGKD52
19Jaccob SlavinCARD52
20Samuel GirardCOLD48

Across these posts, we have used optimization and machine learning to explore network effects in NHL lineups. The implementation here leaves a lot of potential for future work, including: utilizing disaggreated data, better representing the time-series data that comprises a player's career, and more.

All posts in this series:
1. The Line Blender: Optimizing Lineups Using MoneyPuck's Expected Goals Percentage (xG%)
2. The Line Blender: Embedding Line Performance Using a GNN
3. The Line Blender: Using a GNN To Produce Olympic Rosters
4. The Line Blender: Using GNN Embeddings for Player Rankings
5. The Line Blender: Olympic Lineups with Announced Rosters
6. The Line Blender: Hypothetical Russian Olympic Lineups


  1. Credit to MoneyPuck lines/pairs and skaters data used in this series.