scfive's picture
Upload 203 files
d6ea71e verified
.. currentmodule:: socceraction.atomic.vaep
Atomic-VAEP
-----------
When building models to value actions, a heavy point of debate is how to
handle the results of actions. In other words, should our model make
a distinction between a failed and a successful pass or not? On the one hand,
an action should be valued on all its properties, and whether or not the
action was successful (e.g., did a pass receive a teammate, was a shot
converted into a goal) plays a crucial role in how useful the action was. That
is, if you want to measure a player's contribution during a match, successful
actions are important. This is the viewpoint of SPADL and VAEP.
On the other hand, including the result of an action intertwines the
contribution of the player who started the action (e.g., provides the pass)
and the player who completes it (e.g., receives the pass). Perhaps a pass was
not successful because of its recipient's poor touch or because he was not
paying attention. It would seem unfair to penalize the player who provided the
pass in such a circumstance. Hence, it can be useful to generalize over
possible results of an action to arrive at an action's "expected value".
The combination of Atomic-SPADL and VAEP accomodates this alternative viewpoint.
Atomic-SPADL removes the "result" attribute from SPADL and adds a few new
action and event types. This affects the features that can be computed to
represent each game state. By default, Atomic-VAEP uses the following
features to encoded a gamestate :math:`S_i = \{a_{i-2}, a_{i−1}, a_i\}`:
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Transformer | Feature | Description |
+==================================+========================+============================================================================================================================================================+
| :func:`~features.actiontype` | actiontype(_onehot)_ai | The (one-hot encoding) of the action's type. |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :func:`~features.bodypart` | actiontype(_onehot)_ai | The (one-hot encoding) of the bodypart used to perform the action. |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :func:`~features.time` | time_ai | Time in the match the action takes place, recorded to the second. |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :func:`~features.team` | team_ai | Boolean indicating whether the team that had possesion in action :math:`a_{i-2}` still has possession in the current action. |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :func:`~features.time_delta` | time_delta_i | Seconds elapsed between :math:`a_{i-2}` and the current action. |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :func:`~features.location` | x_ai | The x pitch coordinate of the action. |
| +------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | y_ai | The y pitch coordinate of the action. |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :func:`~features.polar` | dist_to_goal_ai | The distance to the center of the goal. |
| +------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | angle_to_goal_ai | The angle between the start location and center of the goal. |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :func:`~features.movement_polar` | mov_d_ai | The distance covered by the action. |
| +------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | mov_angle_ai | The direction in which the action was executed (relative to the top left of the field). |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :func:`~features.direction` | dx_ai | Direction of the action, expressed as the x-component of the unit vector. |
| +------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | dy_ai | Direction of the action, expressed as the y-component of the unit vector. |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| :func:`~features.goalscore` | goalscore_team | The number of goals scored by the team executing the action. |
| +------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | goalscore_opponent | The number of goals scored by the other team. |
| +------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | goalscore_diff | The goal difference between both teams. |
+----------------------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+
The computation of the labels and the VAEP formula are similar to the standard
VAEP model.
Empirically, we have noticed two benefits of using the Atomic-SPADL
representation. First, the standard SPADL representation tends to assign shots
a value that is the difference between the shot’s true outcome and its xG
score. Hence, goals or a number of misses, particularly for players who do not
take a lot of shots can have an outsized effect on their VAEP score. In
contrast, Atomic-SPADL assigns shots a value closer to their xG score, which
often better matches domain experts’ intuitions on action values.
Second, Atomic-SPADL leads to more robust action values and player ratings.
A good rating system should capture the true quality of all players. Although
some fluctuations in performances are possible across games, over the course
of a season a few outstanding performances (possibly stemming from a big
portion of luck) should not dramatically alter an assessment of a player. In
our prior work comparing VAEP to xT, one advantage of xT was that it produced
more stable ratings. Using Atomic-SPADL helps alleviate this weakness.
.. seealso::
A set of notebooks illustrates the complete pipeline to train and
apply an Atomic-VAEP model:
1. `compute features and labels`__
2. `estimate scoring and conceding probabilities`__
3. `compute VAEP values and top players`__
__ https://github.com/ML-KULeuven/socceraction/blob/master/public-notebooks/ATOMIC-2-compute-features-and-labels.ipynb
__ https://github.com/ML-KULeuven/socceraction/blob/master/public-notebooks/ATOMIC-3-estimate-scoring-and-conceding-probabilities.ipynb
__ https://github.com/ML-KULeuven/socceraction/blob/master/public-notebooks/ATOMIC-4-compute-vaep-values-and-top-players.ipynb