21 мин.

Строим модель Expected Possession Value на трекинг-данных по РПЛ

В статье про expected passes мы построили модель, оценивающую сложность передачи. Данная модель неплохо характеризует умение играть под давлением, однако она не очень полезна с точки зрения оценки эффективности передач. В этом материале я расскажу, как решалась это проблема и к чему мы в итоге пришли.

Non-shot xG

Сначала была идея построить простенькую модель non-shot xG, потом скрестить ее с моделью xP. Суть NSxG состоит в том, что каждому владению присвается xG удара, которым закончилось владение. Поле нарезается на квадратики. Каждый квадратик получает вес, равный среднему xG владений, которые проходили через него.

Эффективность передачи можно посчитать так: NSxG(в точке приема передачи) - NSxG(в момент передачи). Таким образом модель оценивает вклад каждого действия в развитие атаки.

Первоначально я думал использовать формулу вроде xP * (NSxG(B) - NSxG(A)). Да, эта формула имеет сомнительный физический смысл, так как прирост NSxG коррелирует со сложностью паса. Однако идея ясна, будем поощрять игроков, которые не просто эффективно двигают мяч, но и делают это под давлением.

На практике все оказалось чуточку сложнее. Модель была построена, но получилась не очень хорошей. Возникали неприятные пограничные эффекты, когда хороший (но чуть-чуть назад) пас под удар оценивался отрицательно. Возможно, просто не очень удачно разбил поле на зоны.

В общем, я не стал лучше подбирать разбиение, а решил построить более сильную модель, которая будет оценивать не только эффективность пасов, но и ценность владения в целом. О самой модели чуть позже, а пока обсудим баскетбольную метрику PER.

Player Efficiency Rating

Рейтинг был придуман Джоном Холлинджером, бывшим вице-президентом по баскетбольным операциям в Мемфис Гриззлис. Сейчас он пишет отличные статьи на The Athletic. Рейтинг оценивает эффективность игрока в минуту в зависимости от его статистических показателей. Делает он это так:

Всю формулу разбирать не будем, все-таки статья в футбольном разделе находится. Однако попрошу обратить внимание на слагаемые VOP * TOV и VOP * STL. VOP - это ценность владения, фактически, сколько в среднем набирает команда НБА за одно владение, TOV - количество потерь игрока, STL - количество отборов. Перед VOP * STL стоит плюс, так как отбор - это позитивное действие, а численно оценить его пользу можно через ценность владения. В современной НБА VOP равен примерно 1.1 очкам за владение. Сответственно, если игрок отобрал мяч, то он, грубо говоря, отнял эти 1.1 очка у соперника. Похожая история с VOP * TOV, игрок потерял мяч, тем самым лишил свою команду 1.1 очка.

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

Проблема футбольной аналитики

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

Но проблема не только в результативности. Сырая футбольная статистика не имеет смысла без контекста. Игрок отдал точный пас. И что? Было ли это стандартное положение? Пас был на своей половине или в чужой штрафной? Игрок находился под давлением? Партнер был открыт? Была ли передача в одно касание? Если в одно касание, то удобно ли было игроку обработать мяч?

Если взять трехочковый бросок (возможно, самый важный навык в современной НБА), то его можно очень неплохо охарактеризовать тремя параметрами: открытый/не открытый, с получения/не с получения, из угла/не из угла. Поэтому никто в НБА и не строит xG, это не нужно. Много бросков, поделил их на 6 категорий и смотришь проценты.

Общая идея

Строить модель будем, отталкиваясь от идеи, что игрок каждым (почти) своим действием старается:

- повысить вероятность забить (отдавая передачу, идя в дриблинг и т.д.);

- забить (нанося удар по воротам);

- мешает сопернику выполнять первые два пункта.

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

Если описать одной формулой наш рейтинг, то получится следующее:

STEAL REWARD + POSSESSION VALUE IMPROVEMENT - TURNOVER PENALTY

Вот только под этими тремя факторами подразумеваются не сырые статистики, а полноценная модель.

Что есть владение?

Под владением будем подразумевать действие или серию действий, в ходе которых игроки действительно cтарались улучшить свое владение или забить гол. Очевидно, что пас или удар подходят под эту категорию. Вынос, сейв вратаря, фол - нет. Соответственно, если перехват передачи закончился подбором атакующей команды, угловым или аутом, то владение команды атаки продолжается. Поэтому такой перехват - не перехват владения, но и не потеря. Если владение "прервалось" фолом команды защиты, то штрафной или пенальти не являются началом владения.

Реализация

Ценность владения будем считать следующим образом.

1) Построим модель xG (как она строилась, обсудим ниже).

2) На стадии обучения каждому событию (например, передаче) присвоим суммарный xG, который был создан последующими событиями в ходе данного владения. Обозначим этот суммарный xG за xg_pos. Если в ходе владения не было ударов, то xg_pos = 0. Если был один удар,то все события до удара (в рамках одного владения) получат xG этого удара, события после удара (если они были) получат xg_pos = 0.

Ситуацию с несколькими ударами в ходе одного владения лучше разберем на примере. Представим ситуацию. Произошел первый удар, вратарь перевел мяч на угловой. После подачи был нанесен второй удар, вратарь отбил мяч в поле. Команда атаки подобрала мяч, но через некоторое время потеряла его. В такой ситуации все события до первого удара получат сумму xG первого и второго ударов. События между первым и вторым ударами получат xG второго удара, события после второго удара получат 0. Это логично, так как ценность действий определяется будущими событиями, а не прошлыми.

Это не самый очевидный момент. Я сначала присваивал всем событиям в ходе одного владения суммарный xG. Потом удивлялся, что у меня угловые получились очень ценными, а забивают с них не так часто.

3) Каждое событие владения опишем различными признаками. Например, расстояние до ворот соперника или количество соперников в радиусе трех метров от мяча.

4) На основе признаков будем подгоняться под xg_pos. То есть по каждому событию в матче будем делать прогноз, чем закончится данное владение. Этот прогноз будем называть ценностью владения (обозначим за EPV). Не всего (продолжительного) владения, а владения в данный момент времени, фактически события.

Как строилась модель xG и зачем она вообще нужна?

Читая предыдущий раздел, читатель мог задаться вопросом, а зачем вообще здесь нужен xG? Можно было бы просто всем владениям, закончившимся голом, присвоить 1, а не голом - 0. Так было бы проще и естественнее. А сейчас получается, что мы одной моделью прогнозируем прогноз другой модели (чтоооо?).

Проблема в том, что голов очень мало, из-за чего одни события при схожих обстоятельствах будут оцениваться выше других, только потому, что в данных первые события чаще заканчивались голами.

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

Таким образом xG добавляет модели стабильности.

Но есть и свои минусы. Данные содержат в себе неточности, на этих данных мы строим xG, который тоже содержит ошибки. На основе кривого xG строим EPV, который очевидно тоже не идеален. Сможем ли мы вообще получить что-то адекватное? Посмотрим.

Признаки, который использовались при построении Expected Goals:

  • Удар был нанесен ногой, головой или другой частью тела.

  • Удар был нанесен со штрафного, пенальти или из игровой ситуации.

  • Координаты удара, расстояние до ворот, угол между мячом и центром ворот.

  • Удар с добивания.

  • Удар в одно касание.

  • Какое событие было предыдущим: пас, ведение и т.д.

  • Разница в x, y координатах по сравнению с предыдущим событием.

  • Команда в большинстве/меньшинстве.

  • Расстояние до ближайшего соперника.

  • Расстояние до вратаря.

  • Количество соперников в радиусе 3, 5... 15 метров от мяча.

  • Количество соперников в треугольнике между мячом и двумя штангами.

  • Есть ли вратарь в этом треугольнике.

  • Угол передачи, если удар был нанесен в одно касание после паса.

Как строились EPV

Признаки, которые использовались при построении Expected Possession Value:

  • Координаты события, расстояние до ворот, угол между мячом и центром ворот.

  • Часть тела, которой играет футболист.

  • Событие - это игровая ситуация или штрафной, аут, угловой, пенальти.

  • Было ли событие началом владения. Было ли событие первым после потери соперника в игровой ситуации.

  • Первое ли это касание игрока, например, прием передачи или пас в одно касание.

  • Событие в штрафной площади соперника.

  • Команда в большинстве/меньшинстве.

  • Расстояние до ближайшего соперника/партнера.

  • Расстояние до вратаря.

  • Количество соперников/партнеров в радиусе 3, 5... 15 метров от мяча.

  • Количество соперников в треугольнике между мячом и двумя штангами.

  • Есть ли вратарь в этом треугольнике.

  • Количество партнеров/соперников за линией мяча.

Как видим, многие признаки из модели xP перешли в текущую модель. Для подсчета xG и EPV использовалась модель LightGBM.

Как составлялся рейтинг

После того, как модель построена, будем оценивать каждое действие игрока с точки зрения улучшения/ухудшения владения.

Улучшение владения своей команды. Например, игрок сделал точную передачу из точки A в точку B. Тогда вклад игрока в развитие атаки будет оценен как EPV(B) - EPV(A). Понятно, что данное значение будет зависеть от уровня "обострения" передачи и может быть отрицательным. Гол будет оцениваться как 1 - EPV(момент удара).

Награда за переход владения. Будем награждать игрока за действие, которое привело к переходу владения в игровой ситуации. Очевидно, что за вброс аута или за свободный удар награждать игрока было бы абсурдно. Таковыми действиями могут быть отбор, перехват передачи, сейв (если мяч сохранился у команды). Награда будет оцениваться как сумма ценности владения соперника в момент потери и ценности владения команды в момент отбора/перехвата. Например, соперник делает неточный пас в точке A, игрок перехватывает его в точке B, тогда игрок получит награду EPV(A| соперник) + EPV(B| команда игрока).

Штраф за потерю мяча. Под потерей будем подразумевать любое действие игрока (кроме гола), которое привело к переходу владения. Неточный пас, потеря мяча при неудачном дриблинге, фол в нападении, офсайд, удар мимо ворот и т.д.

По аналогии с перехватами, штраф за потерю равен: - EPV(A| команда игрока) - EPV(B| соперник).

Однако на практике возникло много нюансов и спорных моментов, которые лучше разобрать на примерах.

Дьявол в деталях

Честно признаюсь, я не люблю, когда некоторые авторы вставляют скриншоты в свои статьи, пытаясь обосновать свои выводы. Можно найти моменты, где Месси хорошо прессингует, и написать, что Месси молодец. Как и можно найти эпизоды, где Леонель в носу ковыряется, и написать, что он вредит команде. Поэтому ниже будут приведены не только примеры, где модель работает хорошо, но и примеры, где она сильно лажает. Примеры взяты из матча Краснодар - Зенит.

Подборы

Одной из первых проблем, с которой я столкнулся, была интерпретация подборов в случае перехода владения. На первый взгляд кажется, что это перехват владения, значит игрок должен получить steal reward. Однако обычно игрок вообще не предпринимает никаких действий, когда подбирает мяч. Он сам к нему прилетает. С другой стороны, в нужное время в нужном месте тоже надо уметь оказываться, поэтому игрока имеет смысл поощрить.

Я решил награждать подбирающего игрока ценностью владения в момент подбора, но не добавлять ценность владения соперника в момент потери. Мне кажется, это плюс-минус справедливо, т.к. ценность подбора не должна зависеть от ценности передачи/выноса соперника. Какая разница, откуда мяч прилетел? Однако имеет смысл отличать подбор в своей штрафной от подбора в центре поля. Второй должен быть ценнее.

Но есть проблема. Рассмотрим пример.

Подбор Дзюбы

Подбор Азмуна

Дзюба подбирает без сопротивления, Смольников даже не изображает давление. EPV этого подбора равен 0.107. Азмун выигрывает забег у Петрова, первым оказывается на мяче, краснодарец активно прессингует. EPV подбора Сердара равен 0.027.

Справедливо, что ценность владения Дзюбы выше, чем у Азмуна. Вот только парадокс в том, что награда за подбор у Артема выше, что не честно, так как иранец приложил больше усилий.

Прерывание подвладения

Еще одна проблема - это действия игроков защищающейся команды, которые не прерывают владение соперника. Например, вынос мяча или фол.

В случае выноса я решил поступать так. Автор неточной передачи получает штраф в виде EPV в момент паса. Но раз потери как таковой не было, то штраф будет не очень большим. Предположим, что игрок перевел мяч на угловой. Тогда оценим его действие как разность ценностей передачи и углового. Рассмотрим пример.

Дзюба бьет по воротам, EPV = 0.047, Петров накрывает, мяч уходит на угловой. EPV углового 0.044. Таким образом, Петров за свое действие получает 0.003, Дзюба теряет 0.003.

Фолы

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

Фол в нападении трактуется как потеря.

За карточки сейчас никак не штрафуем. За желтые, на мой взгляд, это и не нужно делать. После получения желтой, игрок скорее всего будет играть аккуратнее, реже идти в единоборства, что косвенно повлияет на его рейтинг, так как отборов будет меньше.

В случае красной карточки нужно подумать. Понятно, что ее влияние зависит от минуты удаления, но, как это посчитать, пока неясно.

Еще примеры

Давайте рассмотрим еще парочку примеров, чтобы лучше понимать, как устроен EPV - где работает нормально, а где не очень.

Первый гол.

Газинский делает неточную подачу в штрафную. EPV = 0.027, выглядит правдоподобно.

Чистяков выносит мяч из штрафной, но не прерывает владение соперника. Хотя мяч не доходит до адресата, это не потеря, поэтому игрок Краснодара штрафуется только на свое значение EPV. Таким образом Газинский получает -0.027 за неточный пас.

Вынос, который не прервал чужое владение - это не перехват, но и не потеря. Игрок получит разницу EPV между соседними владениями. Вынос закончился подбором Краснодара, EPV которого равняется 0.039. Чистяков таким образом отштрафован на 0.012. Да, по факту защитник Зенита перехватил опасную подачу, но это скорее заслуга Газинского, а не Чистякова.

С другой стороны, возможно, имело смысл "проучить" защитника за неточный пас. Ему никто не мешает, партнер открыт. И это проблема. Нужно научить модель отличать выносы, в которых игроку было трудно прервать владение, от подобных этому.

Газинский (возможно, с фолом) помогает Олссону подобрать мяч. Поскольку Газинский не касался мяча, то его действие не нашло отражения в модели. EPV в момент подбора равен 0.039, именно такую награду получает Олссон.

Олссон ведет мяч вперед, улучшая позицию. Алгоритм оценил движение в 0.027 (0.039 -> 0.066).

Кристофер делает точную передачу на Ионова. Стоимость передачи шведа равна 0.253 (0.066 -> 0.319).

Ионов забивает в одно касание, тем самым получая награду 1 - 0.319 = 0.681, так как EPV = 0.319 в момент касания.

Однако самая большая проблема в этом эпизоде - это игнорирование моделью ошибки Чистякова. Игрок не выдержал линию офсайда и не перехватил передачу, хотя имел возможность. Интересно, что если бы защитник перехватил мяч, то он бы получил награду 0.066 + EPV в точке перехвата. В этом и состоит ключевая проблема steal reward: мы поощряем игроков за отборы и перехваты, но не наказываем за моменты, когда они не совершались.

То, что в моделях есть ошибки, это нормально. Все модели неточные. Грустно становится там, где ошибки несимметричны. По аналогии с судьями, мы понимаем, что судьи могут ошибаться, и это небольшая проблема, длинный сезон сгладит ошибки. Но если судейство предвзято, это может дорого обойтись командам.

Второй гол.

Мяч у Кузяева, EPV = 0.019.

Газинский отбирает мяч. EPV = 0.056. Газинский за отбор получает 0.075. Кузяева штрафуем на -0.075.

За пас на Ионова Юрий получает 0.006 (0.056 -> 0.062).

В момент приема передачи EPV = 0.062. На мой взгляд значение должно быть больше.

Ионов входит в штрафную, EPV = 0.371.

Ракицкий догоняет Ионова, но тот на замахе убирает его. Это действие привело к улучшению ценности владения на 0.052 (0.371 -> 0.424).

В момент удара EPV = 0.424, значит за результативный удар игрок получит 0.576.

Ситуации, когда EPV > xG

В данных нередко попадались случаи, когда EPV в момент удара превышал xG этого удара. Я нахожу три возможных объяснения таким ситуациям:

  1. Игрок мог улучшить позицию, но решил пробить по воротам.

  2. Модель учитывает вероятность того, что удар может закончиться добиванием или угловым, после которого может быть забит гол. Например, EPV пенальти равен 0.75, а xG 0.733.

  3. Модели просто ошибаются.

Рейтинг игроков

Мы разобрались как считается EPV, за что игроки награждаются, за что штрафуются. Если сложить все награды/штрафы за сезон, то получим суммарный вклад игрока в успех своей команды. Так мы сможем отранжировать игроков. Только давайте поделим полученный рейтинг на минуты, проведенные на поле, чтобы футболисты, которые играли больше не имели преимущества. По-хорошему, нужно делить на чистое игровое время, но это как-нибудь потом.

Рейтинг считался на матчах РПЛ сезона 20/21 за исключением матчей с участием Тамбова после зимней паузы. Отсеем игроков, сыгравших меньше 1000 минут и вратарей.

delta_epv - прирост ценности владения в случаях, когда владение не было потеряно,

steal_reward - награда за перехват владения,

tov_penalty - штраф за потерю мяча,

passes - вклад игрока от передач,

dribbles - вклад игрока от ведения мяча, обводок,

shots - вклад игрока от ударов,

standards - вклад игрока от стандартов,

rebounds - вклад игрока от подборов,

fouls - вклад игрока от фолов.

Все статистики представлены в пересчете на 90 минут игрового времени.

Юсупов и Реми попали в топ-3, благодаря сумасшедшей реализации. Забивать в ситуациях, в которых другие не забивают, очень полезно, но останется ли эта реализация на том же уровне в следующем сезоне - большой вопрос.

Здесь кроется основная проблема нашего рейтинга - его неустойчивость относительно голов и заработанных/привезенных/нереализованных пенальти. Не коснись бы Фернандес рукой мяча в своей штрафной в матче против Зенита, забей бы на гол больше, он поднялся бы на позиций 20-30 в рейтинге. Другое дело, что такие мелкие эпизоды и решают исход матча или целого сезона, поэтому все "честно". Жалко, что в РПЛ по 30 матчей играют, а не по 72 (82 до пандемии) как в НБА. На дистанции такие эффекты бы сгладились.

Однако мы может разложить рейтинг на составляющие, например, посмотреть на вклад игрока в успех команды своими передачами.

Передач за сезон накапливается много, поэтому оценки стабильны.

Где нападающие?

Давайте выведем рейтинги пяти лучших бомбардиров РПЛ.

У Дзюбы и Соболева отрицательный рейтинг. Получается, они вредят команде больше, чем приносят пользы? Давайте разбираться.

Неудивительно, что проблем с реализацией у нападающих нет.

У игроков маленький steal reward, что хотя и ожидаемо, но требует некоторых комментариев. Нападающие часто вступают в прессинг, который провоцирует потерю соперника. Защитник под давлением выбивает мяч в аут или на соперника. Поскольку нападающий не отобрал мяч, а "лишь" спровоцировал потерю, то его удачный прессинг не найдет отражения в модели. Это первая проблема.

Вторую проблему мы уже обсуждали в статье про xP. Мы относимся к передачам так, что вся ответственность лежит на тех, кто эти пасы делает. Однако это неверно в случае длинных передач. Успех таких передач во многом зависит от нападающих. Нужно будет считать delta_epv не только относительно автора передачи, но и ее адресата, что сделает рейтинг более точным.

Вообще, как мне кажется, навык "цепляться за мяч" недооценивается болельщиками. Любой команде в мире, какими техничными футболистами она бы не обладала, как долго бы она не тренировала выход из обороны в атаку через короткий пас, иногда приходится просто выбивать мяч на нападающего. И такие футболисты как Дзюба, Соболев, Деспотович, Заболотный очень полезны в таких ситуациях.

То, что в топ-10 РПЛ по пасовому рейтингу находятся 3 защитника Зенита, во многом заслуга Дзюбы и Азмуна.

Possession Risk

Так же была попытка построить модель, которая предсказывает xg_pos в следующем владении соперника. Такая модель полезна, так как, отодвигая мяч от своих ворот, игроки не только увеличивают вероятность своей команды забить, но и уменьшают вероятность соперника забить в следующем владении. В теории, такая модель должна выше оценивать выносы. Однако на практике получилась ерунда. Возможно, это связано с тем, что когда по одному действию игрока пытаешься предсказать успешность следующего владения соперника, на самом деле предсказываешь случайный шум. Действительно, как по передаче в центре поля можно понять, чем закончится следующее владение соперника? Наверняка зависимость имеет место быть, но она очень слабая. Возможно, если расширить данные, получится ее уловить.

Ну и? А дальше-то что?

В целом, я перечислил основные проблемы текущей модели. Наверняка есть и другие, которые я пока не заметил. Также нужно повнимательнее почитать работы других авторов, все-таки идея EPV не новая. Хотя самому строить модели тоже полезно, так лучше понимаешь, что находится у них под капотом.

***

Завел телеграм-канал. Вряд ли буду там часто писать, так как такие статьи делаются долго, а писать обо всем подряд не очень хочется.