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

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

В конечном счете, мы определяем «хороший» и «плохой» с точки зрения Fantasy Premier League, и поэтому нас интересует только то, забивает ли игрок гол или создает гол («ассист») или нет. Эти два результата (1 = очки или передачи, 0 = ничего не делают) — это все, что мы пытаемся предсказать, поэтому результат является бинарным, и алгоритмы классификации подходят лучше всего.

Данные

Набор данных, который мы будем использовать, был взят из раздела Участники Fantasy Football Scout, предоставленного Opta. Данные предназначены строго для частного использования, однако аналогичные общедоступные данные можно найти на Fbref.com.

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

Определить константы

Исходный набор данных содержит более 200 столбцов, из которых, скорее всего, будут релевантными лишь немногие. Мы определяем некоторые начальные константы для столбцов, которые представляют наибольший интерес. Учитывая, что у нас есть некоторые знания в этой области, мы можем быть уверены, что столбцы, которые мы выбираем, являются наиболее важными. Однако более глубокий анализ сосредоточится на более широком диапазоне столбцов и использует анализ основных компонентов или показатели взаимной информации, чтобы найти наиболее значимые функции.

Импорт данных

Очистка данных и разработка функций

Учитывая большое количество столбцов, мы сначала рассмотрим их типы данных. Большая часть данных находится в форме с плавающей запятой (например, количество попыток в минуту). Поле «Дата» является объектом, однако его следует преобразовать в DateTime, чтобы упростить управление в будущем.

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

В приведенном ниже коде мы создаем скользящие средние данные данного игрока и сдвигаем эти данные на одну строку вниз. Например, мы берем результаты Мохаммеда Салаха между игровыми неделями 1–3 и берем их среднее значение. Затем переместите эти точки данных на одну игровую неделю вниз, чтобы они соответствовали игровой неделе 4. Теперь у нас есть набор данных, состоящий из нашей переменной результата (результат атаки на игровой неделе 4) и набора функций, отражающих его результаты в последних трех играх.

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

Несмотря на то, что этот набор данных был в некоторой степени очищен до статьи, все еще остается много проблем:

Сначала мы проверяем значения NA, и приведенная ниже тепловая карта показывает желтый цвет всякий раз, когда присутствует значение NA.

У нас отсутствуют данные, связанные с «team_spi» и «opponent_spi», что предполагает, что для более ранних сезонов в наборе данных это недоступно. В большинстве столбцов также присутствуют NA (тонкие желтые линии), которые следует проверить.

Данные SPI были предоставлены FiveThirtyEight и измеряют силу команды в этом сезоне на этой игровой неделе. Это динамическое поле, которое будет обновляться по мере победы/поражения/ничьи каждой команды. NA можно рассчитать, взяв среднее значение данных, которые у нас есть для каждой команды, но сила команды в 2011 году, вероятно, будет сильно отличаться от более позднего года, когда данные доступны. К сожалению, для фаната «Арсенала» это слишком важно. Показатель SPI «Арсенала» в 2020 году, вероятно, будет намного ниже, чем в 2011 году. Сейчас мы отбросим данные, по которым у нас нет информации SPI.

Интересно, что у нас есть NA в некоторых данных после 2017 года, где у нас были доступные данные SPI. Это влияет только на 4 игроков, поэтому мы можем отказаться от них.

Далее у нас есть NA, присутствующие в других столбцах данных. Это ожидаемо, так как нам нужно как минимум 3 игровых недели, чтобы взять среднее значение, поэтому мы можем ожидать, что первые 3 игровые недели для любого игрока в данном сезоне будут NA. Опять мы опускаем их.

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

Затем мы создаем целевую переменную, в данном случае простой двоичный код 0 или 1 для обозначения помощи или гола.

Исследовательский анализ данных

Взглянув на целевую переменную, мы видим, что она сильно несбалансирована. Около 82% игроков не дают никакой отдачи.

Однако есть способы определить, какие игроки с большей вероятностью вернутся, как показано на графиках ниже:

  • Созданные шансы:
    Естественно, у игроков, которые создают больше моментов за игру, больше шансов вернуться. Создание 9–12 моментов в среднем за последние 3 игры означает, что вы, скорее всего, получите возврат.
  • FPL Goal Involvements:
    Этот показатель измеряет вклад игроков в прибыль в процентах от его команды. Например, 50 означает, что игрок забил половину голов или отдал голевые передачи своей команде в этой игре. Опять же, это скользящее среднее их предыдущих 3 игр. Это выглядит полезным, но не так много, как другие функции.
  • Попытки по воротам:
    Любая попытка по воротам в створ или вне ворот. Как и ожидалось, это полезный предиктор доходности.
  • Полученные пасы Финал 3-й:
    Больше пасов, полученных ближе к цели, скорее всего, будет хорошо, как следует из сюжета.
  • Штрафные касания:
    Аналогичен предыдущему показателю, но потенциально более полезен, поскольку штрафные касания подразумевают активное участие игрока в атакующей игре.
  • Удары, пропущенные в штрафной площади следующим соперником.
    Данные соперника — полезная метрика. Игрок X имеет больше шансов вернуться, если противник пропускает много ударов. Однако на удивление мы не видим существенной разницы в барах.
  • Успешные кроссы:
    Аналогично созданным моментам, но не каждый кросс приводит к шансу (удар по воротам). Так что, возможно, более слабая метрика. Однако мы видим некоторую разницу в барах.
  • Всего передач:
    Предыдущие функции были косвенными. Ассист в игре по своей конструкции обеспечивает отдачу в атаке. Здесь полезно использовать скользящее среднее число передач.
  • Прикосновения в финальном 3-м месте:
    Мы снова пытаемся определить участие в финальном 3-м месте с помощью этой метрики, и столбцы показывают, что большее количество касаний соответствует большей угрозе.
  • Голы:
    Как и в случае с передачами выше, скользящее среднее количество голов, забитых в предыдущих 3 играх, очень полезно для поиска наиболее "в форме" бомбардиров.
  • Голы, пропущенные соперником:
    Опять же, статистика соперника не выглядит здесь значимой. Возможно, производительность игрока важнее, чем то, кого он играет. Хороший нападающий в среднем забивает «Ливерпулю» или «Норвичу».
  • Позиция:
    Интересно, что у полузащитников самые высокие шансы на возвращение. Нападающие, скорее всего, забьют больше, но если учесть еще и результативные передачи, полузащита — это то, что нужно.
  • Совокупная разница мячей соперника:
    Мы ожидаем, что меньшая разница мячей соперника (забитые голы минус пропущенные голы) будет представлять более слабую команду и даст больше шансов на перенастройку. Это отчасти так.
  • Team_SPI и Opponent_SPI:
    Эти данные предоставлены FiveThirtyEight. Полную методологию можно найти здесь.

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

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

Мы можем оценить важность каждой функции, что невозможно сделать на простых графиках выше.

Прогнозное моделирование

Как уже упоминалось, это проблема классификации (0 или 1), поэтому мы импортируем приведенные ниже модели классификации, используя sklearn, а также некоторые процессы очистки данных.

Сначала мы обучаем все модели и смотрим на их соответствующие оценки, прежде чем отфильтровать наиболее полезные. Однако нам нужно определить полезность.

В этот момент мы пытались предсказать, забьет ли игрок 0 или 1 гол в следующем матче. Однако нас не интересует, наберет ли игрок 0 очков, они бесполезны в игре Fantasy Premier League, поскольку они не набирают очков. Мы больше сосредоточены на обучении модели, которая будет предсказывать 1 и впоследствии видеть, что игрок набирает 1. Другими словами, истинные положительные результаты являются основным направлением даже в ущерб большему количеству ложных отрицательных результатов (прогнозирование игрока, который наберет 0 очков, когда он наберет 1). В этом случае мы будем стремиться максимизировать показатель «Точность».

Precision – Accuracy of positive predictions.
Precision = TP/(TP + FP)

Максимально повышая точность, мы наказываем ложные срабатывания (предсказывают, что они получат 1, когда это не так), поэтому мы можем быть более уверены в 1, которые мы действительно предсказываем.

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

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

Без настройки каких-либо параметров классификатор опорных векторов (SVC) имеет немного более высокую точность и показатель F1, чем другие модели, поэтому мы будем использовать его в качестве нашей базы и постараемся улучшить его с помощью GridSearchCV и максимально увеличить точность.

Отчет о классификации предполагает точность 63% по сравнению с 50%, которые мы могли бы получить при угадывании (после недостаточной выборки). Нас больше всего интересует точность 37%. Это небольшое улучшение по сравнению с ненастроенной моделью SVC.

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

Живые прогнозы:

Используя экземпляр текущей модели, мы можем попытаться предсказать «лучших» игроков, которых можно выбрать в Fantasy Premier League. Мы знаем, что не можем предсказать будущее, и поэтому менее интересно посмотреть, предсказывает ли модель результативную передачу или гол для игрока X, а не «какову вероятность», которую модель дает любому игроку X в отношении его шансов забить гол или помочь.

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

Ниже мы загружаем набор прогнозных данных для 16-й игровой недели сезона 21/22.

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

Вывод:

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

При этом достигнутая точность составила 37%.

Приведенная выше тепловая карта является полезной частью тематического исследования. Представление о том, кто с наибольшей вероятностью забьет, поможет при выборе игрока в игре Fantasy Premier League.

Есть несколько способов улучшить это:

  • Включая функции, которые могут быть менее очевидными, но все же важными
  • Использование более длинного / более короткого скользящего окна для расчета скользящего среднего для функций
  • Изучение методов глубокого обучения, таких как нейронные сети или LTSM, как возможного способа прогнозирования будущих результатов.
  • Вменение данных, которые были потеряны в результате отсутствия данных SPI.