Строим модель Expected Possession Value на event-данных Wyscout
Когда-то давно мы уже строили EPV на трекинг-данных РПЛ. В этой статье мы не будем использовать трекинг, но данных будет больше, мы охватим сразу несколько десятков лиг. При этом мы добавим несколько простых улучшений, которые сделают нашу модель точнее.
В прошлый раз мы попытались посчитать эффективность всех действий игроков, и получилось так себе. Сейчас сконцентрируемся только на передачах и дриблинге/ведении мяча.
Что такое EPV?
Рассмотрим на примере передач. Мы хотим посчитать эффективность каждой передачи, то есть насколько она была обостряющей. Для этого давайте научимся считать вероятность того, что владение закончится голом при условии, что мяч «прямо сейчас» находится в точке A. Эту вероятность обозначим за EPV(A) и будем называть ожидаемой ценностью владения. Понятие «находится в точке A» здесь абстрактное, так как мы учитываем не только координату передачи, но и другой контекст, например, какой частью тела совершается передача, находится ли игрок под прессингом и т.д.
Допустим, игрок совершил передачу из точки A в точку B. Тогда можно посчитать EPV в точке A и EPV в точке B. Посчитав разницу EPV(B) – EPV(A), мы получим искомую меру эффективности передачи. Понятно, что EPV(B) – EPV(A) может быть меньше нуля.
В случае неточной передачи будем наказывать игрока так: -EPV(A) – EPV(B), здесь EPV(A) — вероятность, что владение закончится голом в момент передачи, а EPV(B) — вероятность, что владение соперника закончится голом в момент перехвата. Так мы наказываем игрока за то, что он, во-первых, потерял владение своей команды, во-вторых, создал момент для соперника.
Если просуммируем данные разницы по каждому игроку в сезоне и поделим на количество сыгранных минут, то получим некий рейтинг игрока — метрику, которая показывает, как хорошо футболист умеет двигать мяч.
Как мы строили модель в прошлый раз
Если читали прошлую статью, этот раздел можно пропустить.
Общая идея
Строить модель будем, отталкиваясь от идеи, что игрок каждым (почти) своим действием старается:
- повысить вероятность забить (отдавая передачу, идя в дриблинг и т.д.);
- забить (нанося удар по воротам);
- мешает сопернику выполнять первые два пункта.
Соответственно, нужно построить модель, которая будет поощрять игроков за перехват владения соперника и за улучшение владения своей команды, и наказывать за потерю мяча.
Если описать одной формулой наш рейтинг, то получится следующее:
STEAL REWARD + POSSESSION VALUE IMPROVEMENT – TURNOVER PENALTY
Вот только под этими тремя факторами подразумеваются не сырые статистики, а полноценная модель.
Что есть владение?
Под владением будем подразумевать действие или серию действий, в ходе которых игроки действительно cтарались улучшить свое владение или забить гол. Очевидно, что пас или удар подходят под эту категорию. Вынос, сейв вратаря, фол — нет. Соответственно, если перехват передачи закончился подбором атакующей команды, угловым или аутом, то владение команды атаки продолжается. Поэтому такой перехват — не перехват владения, но и не потеря. Если владение «прервалось» фолом команды защиты, то штрафной или пенальти не являются началом владения.
Реализация
1) Построим модель xG.
2) На стадии обучения каждому событию (например, передаче) присвоим суммарный xG, который был создан последующими событиями в ходе данного владения. Обозначим этот суммарный xG за PV (possession value). Если в ходе владения не было ударов, то PV = 0. Если был один удар, то все события до удара (в рамках одного владения) получат xG этого удара, события после удара (если они были) получат PV = 0.
Ситуацию с несколькими ударами в ходе одного владения лучше разберем на примере. Представим ситуацию. Произошел первый удар, вратарь перевел мяч на угловой. После подачи был нанесен второй удар, вратарь отбил мяч в поле. Команда атаки подобрала мяч, но через некоторое время потеряла его. В такой ситуации все события до первого удара получат сумму xG первого и второго ударов. События между первым и вторым ударами получат xG второго удара, события после второго удара получат 0. Это логично, так как ценность действий определяется будущими событиями, а не прошлыми.
3) Каждое событие владения опишем различными признаками. Например, расстояние до ворот соперника.
4) На основе признаков будем подгоняться под PV. То есть по каждому событию в матче будем делать прогноз, чем закончится данное владение.
Что исправили или выкинули
Сразу исправим глупую ошибку с PV. Суммировать xG некорректно, хотя бы потому, что такая сумма может быть больше единицы, что абсурдно. Нужно учесть вероятность того, что если n-й удар закончился голом, то n+1-го удара не было бы. Посчитать это можно так:
P(владение закончится голом) = 1 – P(владение не закончится голом)
P(владение не закончится голом) = P(первый удар не стал голом) * ... * P(последний удар не стал голом)
PV = 1 – (1 – xG(первого удара)) * ... * (1 – xG(последнего удара))).
В этой статье будем обсчитывать только передачи, дриблинг и ведение мяча, так как EPV-метрики наиболее стабильны (от сезона к сезону) именно по этим действиям.
Наконец, понятно, что описание игрового контекста стало более скудным. Поскольку мы не используем трекинг, то мы не можем посчитать признаки вроде «количество игроков соперника в радиусе 5 метров от мяча».
Улучшения
Чистое время
Почти все метрики в футболе пересчитывают на игровое время. Футболист в сезоне нагенерил некоторую статистику, и ее обязательно надо поделить на количество сыгранных минут. Вот только эти сыгранные минуты не совсем сыгранные. По-хорошему нужно не учитывать длительность пауз в игре во время просмотров VAR, замен, стандартных положений. Это мы и сделаем, будем наши метрики пересчитывать на чистое игровое время.
Почему компании вроде Instat, Wyscout и прочих «дата чемпионов» до сих пор все статистики (включая фитнес-метрики) пересчитывают на грязное время... В общем, ладно...
Эффект затухания
В прошлый раз мы на стадии обучения каждому событию присваивали суммарный xG, который был создан последующими событиями в ходе данного владения. Однако такой подход не очень хороший, потому что мы всем событиям до первого удара присваиваем одинаковый PV. Мы как бы сообщаем модели, что все действия до удара имеют одинаковую ценность. Нужно внести эффект затухания: например, передачи под удар должны получить больший вес.
Введем фактор дисконтирования gamma, который должен быть больше 0 и меньше либо равен 1.
Было: PV = 1 – (1 – xG(первого удара)) * ... * (1 – xG(последнего удара)))
Стало: PV = 1 – (1 – gamma ^ (время до первого удара) * xG(первого удара)) * ... * (1 – gamma ^ (время до последнего удара) * xG(последнего удара))).
Подобную технику придумал экономист Пол Самуэльсон. Идея такая: получить 100$ прямо сейчас поприятнее, чем, например, через пять лет. У нас же интерпретация немного иная — мы не сообщаем модели, что забить гол как можно скорее лучше. Мы скорее добавляем такую логику: если передача была такой острой, то почему по воротам ударили только через 20 секунд. Так мы делаем события, ведущие к ударам более ценными.
Для наглядности разберем одно из владений Ливерпуля в прошлом сезоне. Здесь xg — это xG удара, clean_time — чистое время события в секундах, bug_pv — это то, как мы убого считали PV в прошлой статье, pv — это PV без фактора дисконтирования, y^t1/y^t1 = 0.95 ^ время до первого/второго удара, xg1/xg2 — xG первого/второго удара, new_pv — PV с фактором дисконтирования, равным 0.95.
Важно, что фактор дисконтирования задается перед обучением модели. Это дает некоторое пространство для маневра пользователю. Если вы считаете, что футбол должен быть вертикальным, то можно задать параметр равным 0.9, если вам ближе длинные розыгрыши мяча, то можно выкрутить гамму до 0.99.
Possession Risk
У нас осталась еще одна неразрешенная проблема. Нужно учесть то, что когда игрок делает передачу вперед, он не только улучшает владение своей команды, но еще отодвигает угрозу от своих ворот. Обычно поступают так: пытаются прогнозировать не PV нашей команды, а PV нашей команды минус PV команды соперника в следующем владении (после потери нашей команды).
В прошлый раз мы пробовали это делать, но получилась ерунда. А ерунда получилась потому, что у нас фактора дисконтирования не было! Допустим, защитник сделал точную передачу вперед, но атака через 10 секунд закончилась потерей мяча, еще через 20 секунд соперник заработал пенальти. В старой модели передача защитника имела бы таргет равный -0.76. В новой модели -0.95^30 * 0.76 = -0.163. Не такая и страшная была потеря.
Еще одна проблема оригинального подхода к possession risk состоит в том, что возникает вопрос, а почему учитываются только два владения? Ведь можно потерять мяч, потом быстренько отобрать и уже с третьего владения (второго нашего) гол забить? Вспомним розыгрыши Марселя с центра поля в сезоне 17/18. С использованием эффекта затухания можно рассмотреть большее количество владений, в том и дело, что третье, четвертое и т. д. владения скорее всего получат очень маленький PV, которым можно пренебречь.
Руди Гарсия: «Тебе не нужно бояться, что ты потеряешь владение, если ты сразу отдашь мяч сопернику!»
Результаты
Дело за малым: осталось применить модель машинного обучения и научиться предсказывать EPV на основе признаков, описывающих ситуацию на поле, подстраиваясь под PV. После этого сложим все награды за улучшение владений и наказания за потери мяча для каждого игрока по каждому сезону и поделим полученные суммы на чистое игровое время, проведенное футболистом на поле. На основе полученных значений можно сформировать рейтинг игроков. В таблице представлены игроки, сыгравшие хотя бы 1000 чистых минут за сезон. pass_run_reward — суммарные награды/штрафы за передачи, обводки и ведения мяча, pass_reward — только за передачи, run_reward — только за обводки и ведения мяча. Награды пересчитаны на 60 минут чистого игрового времени.
Топ-25 по pass_run_reward
При прогнозе EPV мы никак не учитывали игроков, команды, лиги. Поэтому не нужно удивляться, что некий Додо рядом с Месси. С другой стороны и проблемы в этом нет, можно интерпретировать так: Додо играл в чемпионате Мальты как Лео в Испании.
Проблемы
С добавлением вышеописанных улучшений мы сделали нашу модель логичнее. Но при этом пострадала интерпретация. Раньше мы трактовали полученные результаты как среднее количество голов за матч, которое создал игрок. Сейчас у нас человеческой интерпретации фактически нет. С другой стороны, она и раньше была условная. Допустим, мы хотим приобрести пятерых нападающих со средним xG > 0.6. Означает ли это, что в следующем сезоне наша команда будет забивать как минимум 3 гола за игру?
Что дальше?
В следующих статьях (скорее всего будет две) мы попробуем научиться прогнозировать EPV-метрики игроков на будущий сезон. Если при помощи твоих метрик нельзя спрогнозировать будущий перформанс, то зачем они вообще нужны?
Библиотеки по классике: joblib, numpy, scikit-learn, pandas, optuna, lightgbm, catboost, confz
Получится, что по модели он бесполезный или даже вредный, тогда как тренера всё устраивает.
Конечно, бывает, что такой игрок действительно бесполезен, если счёт на табло требует более агрессивных действий, но ведь бывает, что счёт устраивает его команду и тогда его умение сохранять мяч, пусть и без развития атаки, вполне себе полезно для команды.
А ещё бывает, что из двух вариантов, развить атаку или отдать "бесполезный" пас, игрок выбирает второе, но тому игроку, который с большей вероятностью создаст опасность. В предельном выражении это звучит как "не знаешь, что делать, отдай Гаврилову/Черенкову/Месси". Для модели передача будет бесполезной (назад/поперёк), а на деле это не так, потому что Гаврилов/Черенков/Месси сделают что-нибудь интересное.
Ну и для понимания разница в EPV может быть отрицательной.
В общем, ваши примеры только подтверждают корректность модели. Сами с собой спорите.
Ну ок, соглашусь, есть проблема, что модель не учитывает, что некоторым игрокам лучше пасовать, чем другим.
Соглашусь и с тем, что алгоритм жадный и не просчитывает на несколько шагов вперед. Хотя косвенно все-таки просчитывает.
Эти проблемы ведут к небольшой потере точности - согласен.
Альтернативы какие? Нужно научится оценивать навык продвижения мяча для 10 тысяч футболистов. Что делать будете?
- повысить вероятность забить (отдавая передачу, идя в дриблинг и т.д.);
----------------------
Очевидно же, что ошибочная идея. Игрок может отдать передачу просто ради передачи. Чтобы сохранить мяч и чтобы не провоцировать давление на себя (если оно ещё не случилось). Мало того, так не просто может быть, а в большинстве случаев именно эта цель и преследуется.
Повышение вероятности забить гол вкладывается лишь в небольшую долю передач.
Собственно, на этом месте (изначально ошибочном предположении) обсуждение модели теряет смысл.
В общем, ваши примеры только подтверждают корректность модели.
---------------
Где же корректность, если отдать "бесполезную" (поперёк) передачу Месси выгоднее для команды, чем "полезную" (вперёд) на, допустим, Руиса (нынешний партнёр в ПСЖ)? Игрок, который выбирает адресатом Месси ведь вполне понимает, что делает.
А ещё бывают ситуации, когда игрок умеет просчитывать на ход-два хода вперёд и отдаёт "бесполезную" по мнению модели передачу, потому что понимает, что дальше ситуация резко обострится. Допустим, он этой передачей назад/поперёк вытягивает со своей позиции кого-то из защитников и открывает зону для острой передачи.
--------------
Даже если на Мбаппе или Неймара, ситуация не меняется. Всё равно не на Руиса и Солера. Просто вместо одного Месси три таких адресата.
Это просто пример.
Суть в том, что модель не различает уровня футболистов, а он разный. Есть команды с ровным составом, где нет таких предпочтений. Для них, вероятно, алгоритм будет лучше работать, но команд с ярко выраженным лидером (или 2-3 лидерами) тоже очень много. Не обязательно ПСЖ. С середняками такое даже чаще бывает. Пример - Астон Вилла, когда там играл Грилиш. Или Кристал Пэлас с Заа.
Альтернативы какие? Нужно научится оценивать навык продвижения мяча для 10 тысяч футболистов. Что делать будете?
------------
Если б знал, придумал бы свою модель. В данном случае просто указываю на изначально некорректную или излишне упрощённую предпосылку.
И это не единственная проблема. Это только то, что сразу приходит в голову.