Inspiration
A simple elo system won't work for this project because; teams rarely play outside of their own region, metas change frequently and there are large skill gaps between different leagues. So I wanted to make an elo system that can determine how well a team is actually playing and reward / punish them for how good their data points are.
I also wanted to make sure I avoid any personal bias about how good I think regions are as it would make this challenge very easy to just do a traditional elo system and say: buff LPL/LCK by X elo, buff LEC/LCS by Y elo. Instead I wanted it to be fully programmatically generated, so it can generate a ranking system for any teams passed in without needing to have any existing knowledge of them.
What it does
It calculates a base elo for each region based on how competitive it is (e.g. the higher average CS, the lower the difference between each team etc.), and then for each game, it will use a base +/- elo system, and then modify that number based on how strong or weak the team's data points are.
How we built it
The scripts download all the games played and then each time you want to calculate power rankings for a certain date or tournament it uses the average CS, average kills, average game length, average gold amount, and the differences between the teams (assuming closer games means a more competitive league) to create a base elo for each team. Then it loops through all of the games played in the data and uses similar data points to the previous to calculate how well a team did, and rewards and or punishes them accordingly. Afterwards we have a list of team names / their respective elo / rankings
Challenges we ran into
I wanted to avoid using personal bias anywhere in the app. I follow a lot of league so it would be very easy to say 'LPL / LCK are the best, so I'll just give those teams extra elo' etc. but that ruins the integrity of the algorithm. No matter what data points I looked at, the amateur leagues for the pro regions (LCK challengers etc.) were incredibly similar to their respective pro team, however because the competition was worse, the good amateur teams were being massively inflated in elo, so I had to manually add a bit of logic to say if it's specifically an amateur league of the big regions then lower their initial elo.
Accomplishments that we're proud of
Looking back at previous worlds / MSI, the algorithm is quite good at figuring out the top half of the tournaments, e.g. MSI 2023 (excluding the fact we're missing LPL data for this time), it puts T1, GENG and C9 in the top 4 teams, which if we remove LPL teams, that's quite accurate compared to their real placements
What we learned
Somehow every year detonation focusme seems to have really good data points going in to worlds but fails to reach any significant later round!
What's next for 1 - (perfectGame)
I was manually tweaking the weightings for how I calculate the elos for the algorithm. The next trick would be to use a loss function, or some form of machine learning to automatically tweak the weightings until it matches what is expected, and use those weightings instead. It's tricky to do this as metas change frequently, so certain data points may be more reflective of a team's strengths in one season, but the opposite in the next. Perhaps blending in some solo queue data about the patch could help in order to get significant sample sizes for each patch.
Built With
- amazon-dynamodb
- amplify
- lambda
- python
- s3
Log in or sign up for Devpost to join the conversation.