5 мин.

xG своими руками

Скорее всего большинству людей узнавших об xG и не считающих эту модель абсурдной / бесполезной так или иначе было интересно узнать, как же получаются эти коэффициенты при ударах. А тех, кто ее таковой считал, я попробую в этом переубедить.

Если говорить формально, то xG - это оператор, переводящий пространство параметров удара в пространство рациональных чисел размерности 2. То есть из параметров удара формируется вектор (например, (50, 70, 30): (x координата, y координата, высота полета мяча)), который затем под воздействием оператора преобразуется в новый вектор (например, (0.3, 0.7): (вероятность гола, вероятность обратного события - не гола)). Простейший пример - матричный оператор:

Получившийся результат: (98, 36) - не совсем подходит, так как нам нужны вероятности. Разделим каждое число на их сумму и получим (0.73, 0.26), где 0.73 и будет вероятностью гола. Не стоит интерпретировать результат - числа в матрице подобраны случайно.

В реальности никто не подбирает коэффициенты для матриц, а рассматривают задачу в контексте машинного обучения. Идея состоит в том, чтобы обучить бинарный классификатор и за показатель xG брать вероятность попадания в первый класс.

Подробнее о технологии

Для своей реализации я выбрал наивный байесовский классификатор, основанный на применении теоремы Байеса. Описание работы классификатора частично взято из статьи, ссылка на которую будет в комментариях

Пусть у нас есть набор параметров, описывающих удар O. Кроме того, имеются классы (в нашем случае целых 2) С, к одному из которых мы должны отнести удар. Нам необходимо найти такой класс с, при котором его вероятность для данного удара была бы максимальна. Математически это записывается так:

Вычислить P(C|O) сложно. Воспользуемся теоремой Байеса и перейдем к косвенным (априорным) вероятностям:

Так как мы ищем максимум от функции, то знаменатель нас не интересует (он в данном случае константа). И теперь запишем удар как набор признаков:

Знаменатель нас не интересует. Но это все еще сложно. Здесь включаем «наивное» предположение о том, что переменные O зависят только от класса C, и не зависят друг от друга. Это сильное упрощение, но зачастую это работает. На самом деле, можно предположить, что признаки удара независимы. Числитель примет вид.

Действительно, намного проще. Финальная формула:

То есть все что нужно сделать, это вычислить вероятности P(C) и P(O|C). Вычисление этих параметров и называется тренировкой классификатора.

Подготовка данных и результаты

Начнем с того, что данные необходимо найти. Как бы парадоксально это не звучало, но найти большое количество хороших данных не тратя безумное количество денег - практически невозможно, поэтому в предыдущих постах (спойлер: и в этом тоже) я часто делал скидку на ограниченность датасета. За основу я взял обезличенный датасет из, примерно, 200 тысяч ударов (да, это очень мало) и сравнивал результат на все тех же открытых данных от StatsBomb по Чемпионату мира. К сожалению, я был немного ограничен и в выборе фич для описания ударов, так как мне нужны были только те, которые, как минимум, присутствуют в обоих датасетах. В итоге для я использовал 4 параметра: 2 координаты, id части тела, которой наносился удар и расстояние от ворот (сейчас особенно внимательные из вас могут справедливо мне предъявить за допущение о независимости признаков).

После обучения модели точность была в районе 70% на тестовых данных первого датасета. Точность считалась по % ударов, в которых модель предугадала исход (> 0.5 - гол), я счел более логичным сравнение байесового xG с xG от StatsBomb. Среднеквадратическая ошибка (MSE) получилась равной 0.0256.

В следующих примерах поле xg - байесовский классификатор, sbxg - xG от StatsBomb:

Ссылка на проект в гитхабе и карты по всем матчам ЧМ-2018 в комментариях. Также с радостью отвечу на все вопросы.