Common methods for engine annotation include a strict evaluation model or the expected points model. In the strict evaluation model, engine annotations require user-defined parameters to classify inaccuracies, mistakes, and blunders using the strict difference in the evaluation between the move played and the engine's top choice.
In the expected points model, the engine's evaluation is mapped to a function between 0 and 1, indicating the probability of win (or the expected score). Then the assessed move's expected points score is similarly compared to the engine's top choice.
Chess.com: Using Chess.com's Knowledge Base, the current documentation for How are moves classified? What is a ‘Blunder’ or ‘Brilliant’ and etc? shows moves are classified using a new system, ClassificationV2, which uses an expected points model instead of the previous strict evaluation differences.
Chess.com is using the probability of a win evaluation and assessing the move's impact on that probability based on the following:
- Best: 0 ≤ change ≤ 0
- Excellent: 0 < change ≤ 0.02
- Good: 0.02 < change ≤ 0.05
- Inaccuracy: 0.05 < change ≤ 0.10
- Mistake: 0.10 < change ≤ 0.20
- Blunder: 0.20 < change ≤ 1.00
The documentation for Lichess indicates that they also use their Win% and Accuracy% metrics "to identify inaccuracies/mistakes/blunders in game analysis."
Accuracy% represents how much you deviated from the best moves, i.e. how much your winning chances decreased with each move you made."
Win% represents your chances of winning the game from a given position."
Lichess first computes
Win% = 50 + 50 * (2 / (1 + exp(-0.00368208 * centipawns)) - 1)
which allows comparing
Win% before and after each move.
This enables the
Accuracy% = 103.1668 * Math.exp(-0.04354 * (winPercentBefore - winPercentAfter)) - 3.1669
Older Lichess forum posts (1, 2) indicate previous strict evaluation differences such as
- Inaccuracy: 0.5 < gap ≤ 1,
- Mistake: 1 < gap ≤ 2, and
- Blunder: 2 < gap,
may have been previously used, but it seems this is no longer the case.