ДАННЫЕ ИСТОРИИ | СПОРТИВНАЯ АНАЛИТИКА | KNIME АНАЛИТИЧЕСКАЯ ПЛАТФОРМА

Могу ли я предсказать исход футбольного матча (и заработать деньги)?

Эксперименты по спортивной аналитике с использованием KNIME Analytics Platform

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

Для всех этих проектов я использую KNIME, платформу для анализа данных с низким кодом и без кода. KNIME предлагает комбинацию стандартных узлов KNIME по умолчанию и возможность при необходимости включать код (Python/R/Java), что делает его моим любимым решением. Кроме того, KNIME Analytics Platform доступна бесплатно. Скачать его можно бесплатно здесь.

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

Как это началось

Все началось с моего изучения Tableau. Я начал создавать различные визуализации, посвященные матчам голландского турнира (Eredivisie), которые можно найти в моем профиле Tableau. Однако перед визуализацией данных я разработал рабочий процесс KNIME для подготовки данных.

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

Итак, от 1 строки на игру (результат 306 матчей за один сезон) к 1 строке на команду (место в рейтинге), с набором новых столбцов (на команду, на раунд, на сезон, в результате получается 612 записей в общий).

Предсказание исхода футбольного матча

Через несколько сезонов я накопил значительный набор данных, что заставило меня задуматься над следующими вопросами:

  1. Могу ли я предсказать исход матча (победа/поражение/ничья), используя информацию о предыдущих матчах обеих команд и другие соответствующие факторы? Другими словами, могу ли я создать формулу, в которой результат матча (победа/поражение/ничья) определяется функцией, учитывающей характеристики домашней команды, характеристики команды гостей, общие характеристики и характеристики, связанные с датой?
  2. Если я смогу разработать модель прогнозирования, используя этот набор данных, сможет ли эта модель превзойти букмекерские конторы? И (или?) можно ли получать прибыль с моей моделью?

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

Набор входных данных

Для обучения модели мне потребовались дополнительные данные, так как в футболе могут быть неожиданные исходы. Поэтому я включил не только результаты матчей голландского турнира (Eredivisie), но и результаты последних семи сезонов турниров в Германии (Бундеслига), Франции (Лига 1), Испании (Премьер-дивизион), Англии (Премьер-лига). ) и Италии (Серия А). Полезные наборы данных были получены с сайта football-data.co.uk, а с помощью узла KNIME CSV Reader данные были легко загружены.

Путем объединения всех этих данных с помощью описанного выше рабочего процесса был создан набор данных размером примерно 13 000 совпадений.

Создание функций, разработка и выбор

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

Кроме того, я решил создавать функции только с пятого раунда конкурса. Этот выбор был сделан потому, что некоторые функции требовали ретроспективного просмотра определенного количества матчей, например, количество голов, забитых в последних 3 матчах. Кроме того, рейтинги команд, которые использовались в модели, могут быть не «реалистичными» в начале сезона, как вы могли заметить из первоначальных визуализаций в этом блоге.

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

  • Характеристики команды из игры FIFA PlayStation
  • Ценность команды и трансферная стоимость
  • Смесь национальностей в составе
  • Информация о травмированных или дисквалифицированных игроках
  • Результаты предыдущих матчей в других соревнованиях (например, Лига чемпионов, Кубок Англии)
  • Стаж текущего менеджера/тренера команды в месяцах/годах

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

Чтобы создать эти функции, я широко использовал узлы KNIME Lag Column в блоке Group Loop.

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

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

  • Очки впереди в рейтинге
  • Вероятность победы, если предыдущий матч был проигран
  • Разница мячей
  • Очки, набранные дома/в гостях
  • Серия забитых/пропущенных мячей
  • День недели

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

Алгоритм классификации

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

XGBoost

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

Получив более окончательный набор функций, я переключил свое внимание на улучшение модели путем выбора и точной настройки алгоритмов. В конце концов я переключился на алгоритм XGBoost, популярный выбор из-за его производительности. KNIME сыграл решающую роль, помогая мне оптимизировать конфигурацию и настройки параметров узла Learner, что позволило мне эффективно настроить модель с помощью узлов цикла оптимизации параметров.

Керас

Изначально в мои планы не входило использование другого алгоритма наряду с XGBoost. Тем не менее, выпуск книги Глубокое обучение без кода с KNIME Кэтрин Мелчер и Розарии Силипо, наряду с многочисленными рабочими процессами по этой теме в KNIME Community Hub, предоставил мне ценную возможность углубиться в модели обучения и оценки. созданный с помощью нейронной сети Keras.

Перед обучением модели Keras необходимо было внести определенные коррективы в функции. Это включало обработку пропущенных значений, нормализацию данных и разработку архитектуры нейронной сети, например определение количества слоев и нейронов. Кроме того, для настройки узла Keras Learner потребовалось несколько итераций, чтобы найти оптимальные настройки для достижения удовлетворительных результатов. Одним из аспектов, которые я считаю особенно полезными в Keras Learner, были идеи, предоставляемые Learning Monitor, которые давали ценный взгляд на процесс обучения.

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

Насколько хорошо модели предсказывают?

Для оценки эффективности прогнозирования исхода футбольных матчей по набору признаков я создал тестовый сценарий. Модели обучались на наборе данных футбольных матчей разных сезонов и соревнований. Затем я использовал эти модели для прогнозирования результатов матчей в Eredivisie на сезон 2022–2023 гг., которые не были включены в обучающий набор данных.

Чтобы оценить производительность моделей, я проанализировал общую точность и точность прогнозов. При обучении модели набор данных был разделен на обучающий и тестовый. Это разделение является случайным. Чтобы получить хорошее представление о производительности моделей, я обучал каждую модель автоматически с использованием циклов KNIME Loops 50 раз (каждый раз со случайным назначением обучающего и тестового набора).

Выяснилось, что модель Keras в среднем достигла чуть более высокой точности — 55 %, а модель XGBoost — 52 %. Чтобы представить эти результаты в перспективе, я также сравнил их с показателями конкретной букмекерской конторы (например, Bet365). Букмекер продемонстрировал чуть лучшую точность с показателем 57%.

Основываясь на этих выводах, можно сделать вывод, что, хотя модели показали некоторую прогностическую способность, производительность букмекера была немного лучше с точки зрения точности. Однако важно отметить, что сама по себе точность может не дать полной картины производительности моделей. Поэтому я также проверил точность. Точность — это метрика, которая показывает, насколько часто прогноз модели для каждого отдельного исхода (выигрыш/проигрыш/ничья) верен.

Похоже, что прогнозы модели на победу домашней команды имеют в среднем более высокую точность 59% (модель XG Boost) и 61% (модель Keras) по сравнению с общей точностью букмекера 58%. Это говорит о том, что, когда модели предсказывают победу домашней команды, они с большей вероятностью окажутся правильными по сравнению с прогнозами букмекеров.

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

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

(Общая) точность с течением времени

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

Хотя я вполне доволен тем, как модели предсказывают реальные совпадения, модели XGBoost и Keras не достигают того же уровня точности, как при оценке на невидимом проверочном наборе. Заметно, что средняя точность обоих наборов тестов немного выше среднего балла букмекера. Однако реализованная точность в невиданном наборе матчей Eredivisie сезона 2022–2023 годов снова немного ниже.

Заметная разница все же есть, но этому несоответствию может быть несколько объяснений. Набор данных, на котором обучаются модели, состоит из матчей шести различных соревнований и нескольких сезонов. Вопрос в том, точно ли этот набор данных представляет футбольные матчи, которые я пытаюсь предсказать. Я считаю, что это не так, и есть возможности для улучшения построения набора обучающих данных.

Зарабатывать деньги?

Как было показано, можно в некоторой степени предсказать исход футбольного матча. Однако остается главный вопрос: можно ли на этом заработать? Ответ зависит от различных факторов. Например, если бы я делал ставку в 1 евро на каждый матч, ни одна из моих моделей в среднем не приносила бы прибыли. Но и слепое следование самой низкой котировке, которую предлагают букмекеры, также не приносит прибыли.

Данные из приведенной выше таблицы были получены путем обучения и оценки моделей 50 раз. Таким образом, существует отклонение от среднего значения. Эта вариация немного больше для модели XGBoost по сравнению с моделью Keras. С моделью Кераса у вас меньше риска потерять значительную сумму денег, но также меньше шансов получить значительную прибыль.

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

Эпилог, "Близко, но нет сигары"

В целом качество прогнозов еще можно улучшить. Это правда. Тем не менее, что я действительно ценю, так это то, что использование KNIME позволило довольно легко предсказать исход футбольного матча. Путешествие по созданию этой модели прогнозирования футбольных матчей, как и любой деятельности по прогнозному моделированию, не является прямым путем к финишу. Путем экспериментов и тестирования я получил ценные знания в области обучения моделей, подсчета очков и использования KNIME. Было разработано несколько версий моделей, и я думаю, что текущая версия не будет последней. Как показано в этом посте, всегда есть возможности для улучшения, будь то дополнительные данные, более точные функции, лучшая оценка параметров, изучение альтернативных алгоритмов или выбор конкретных игр для ставок. Возможно, в итоге мне удастся обыграть букмекеров?