Sunday, 28 July 2013

NoobMeter Performance Rating algorithm description

Introduction

NoobMeter Performance Rating is rating players primarily on win rate and damage.

Win rate, because winning is what in my opinion matters the most. I think a lot of the other parameters are easily manipulated, such as by suicide scouting, only shooting at near-dead enemies to boost kills, capping when there is no need for it, or even camping near base and farming defense points - in all of the cases not helping the team that much, but having a chance to boost some parameters for some of the ratings.

I think where this spotting, killing capping, defending is productive and helpful, it will be reflected at win rate.

So why not stop at win rate? Because it can be farmed by CW, tank companies or good platoons. However, when doing this it becomes difficult to achieve good damage, as clan or platoon mates will also play well and compete for doing the damage.

Damage is also somewhat hard to boost, especially if you want to do it in conjunction with win rate.

Therefore, a combination of both is a set of parameters that you cannot boost without helping the team. So the best way to boost NoobMeter Performance Rating is by playing the game well, and trying to help the team win.


Win rate component

Win rate part is easy - we linearly give more points for winrates higher than the average ones, and less points for winrates lower than average ones.

winrateRatio = playerWinrate / expectedWinrate
expectedWinrate = 0.4856
winrateWeight = 500
winrateComponent = winrateRatio * winrateWeight


Damage component

Damage part calculates the expected damage that the player should have done, based on the tanks he has played. Tank nominal damage is specified per each tank separately, but usually the differences between tank tier-type combinations are small or often non-existent, for example, t10 meds have ~2100 damage, t10 TDs ~2600, t8 heavies ~1400, and so forth. The list is available at http://tanks.noobmeter.com/tankList.

These values are what a good (not average, but better than average!) player should do in a particular tank, and are based primarily on representative data collected from player game profiles (which include the damage information) and other sources.

expectedDamage = sum of all individual tank expected damages
 expectedDamageAdjustment = 0.975 // introduced on 25-Sep-2013
individual tank expected damage = battles * tankNominalDamage
damageRatio = playerDamage / (expectedDamage * expectedDamageAdjustment)
damageWeight = 1000
damageComponent = damageRatio * damageWeight


Tying it together

We simply add the winrate and damage parts of the rating together, but then apply low-tier and low-battle penalties in case the rating is excessively high for low-battle or low-average-tier players.

beforePenalties = winrateComponent + damageComponent
performanceRating = beforePenalties with "seal-clubbing" penalties applied


Low-tier and low-battle penalties for high-rating players only

First penalty threshold:
clearedFromPenalties1 = 1500 
expectedMinBattles1 = 500
expectedMinAvgTier1 = 6

Second penalty threshold:
clearedFromPenalties2 = 1900 
expectedMinBattles2 = 2000
expectedMinAvgTier2 = 7

Penalties only apply if beforePenalties rating is above the penalty thresholds, and it only applies to the portion of the rating which is above it. They only apply if either battle count or average tier is below the threshold values, in which case they slightly lower the part of the rating which is above the threshold.

Here is the penalties logic (applied twice for each of the two sets of penalty parameters):
subjectToPenalties = beforePenalties - clearedFromPenalties;
lowTierPenalty = max(0, 1 - (avgTier / expectedMinAvgTier)); 
lowBattlePenalty = max(0,  1 - (battles / expectedMinBattles)); 
whichPenalty = max(lowTierPenalty, lowBattlePenalty);
totalPenalty = min(pow(whichPenalty, 0.5), 1);
afterPenalties = subjectToPenalties * (1 - totalPenalty);
result = (clearedFromPenalties + afterPenalties);


Other aspects

The algorithm also notices missing battles from WG and attempts to make up for them in the expected damage.

I haven't fully described VK3601H malus application as it applies for extremely rare players. It basically boosts VK3601H expected damage in cases where a player has significantly better stats in it than other tanks. I'm tempted to just remove this logic altogether, as VK3601H hasn't been OP in a long time; maybe apply special processing to the few players who have mostly played VK3601H when it was OP and haven't played tanks much since.

Edit: September 1, 2013 - OP tank (VK3601H) handling has now been removed from the rating.

Final notes

I'm sure there will be plenty of people saying parameter X is too big, and others saying same parameter X is too small.

In practice, the NoobMeter Performance Rating works very well for ranking players, so as before, for me to seriously consider any changes they need to be accompanied by examples of where players are ranked incorrectly.

That being said, I'm as usual open and looking forward to constructive feedback on the website and the rating.