Мой процесс создания модели предсказания футбольного матча

1. Цель и цели

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

  1. Домашние победы
  2. Победы на выезде
  3. Рисовать

По этой причине я решил, что было бы интереснее использовать другую парадигму: предсказание забитых голов. При таком подходе вы можете предсказать ожидаемые голы, а также вывести из этого классификацию. Я также решил использовать довольно линейную модель (сочетая 2–3 линейных слоя с ReLU).

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

2. Получение данных

Я использовал Европейскую футбольную базу данных. Он содержит данные о более чем 25 тысячах матчей, а также подробные атрибуты команд и игроков. К сожалению, включены только 11 европейских стран, поэтому моя модель не подходит для прогнозирования игр за пределами Европы. Тем не менее, я не хочу включать другие наборы данных из-за нехватки времени, необходимого для реструктуризации двух наборов данных, а также потому, что объединенный набор данных, вероятно, будет иметь серьезные пробелы.

3. Очистка и разбор данных

Этот этап был пройден довольно быстро. Атрибуты класса, такие как низкий, средний и высокий, должны были быть заменены целыми числами, такими как 1, 2 и 3. Чтобы отфильтровать повторяющиеся данные, я удалил атрибуты класса, которые уже сопровождались точными числами (например, 1). –100).

Затем я сделал программу, которая считывает все соответствующие файлы и объединяет их в новый, который можно передать непосредственно в модель: модель обучается на основе сопоставления, где все точки данных

Сначала я просто поместил в модель все оставшиеся точки данных. Данные самого матча, 2 команд и 22 игроков в сумме составили 904 параметра.

Разделение набора данных на поезд и тест происходит в

4. Обучение первой модели

Структура слоев моей первой модели сочетала в себе 3 линейных слоя с 2 слоями relu. Его входными характеристиками были 904, скрытыми юнитами 64 и выходными характеристиками 2 (соответствующие двум подсчетам голов для каждой команды).

Кроме того, я использовал оптимизатор SGD с потерей MSE.

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

Результат? После медленного процесса обучения потери уменьшились с 1,7 до примерно 1,25.

5. Улучшение модели

Было много вещей, которые нужно было улучшить:

  • Во-первых, я реализовал базовое отсечение градиента, чтобы предотвратить взрыв градиента. Это позволило повысить скорость обучения. Теперь он установлен на 0,005, потому что более высокое значение не даст лучших результатов. (Вместо этого потеря будет только прыгать вверх и вниз)
  • Во-вторых, я сократил количество входных признаков до 504, в основном путем фильтрации точек данных, таких как ловкость вратаря, которые имели высокую корреляцию с другими параметрами, такими как ловкость, поэтому «повторяя» понимание.
  • В-третьих, фильтрация набора данных на совпадения со слишком большим количеством неизвестных точек данных сократила полный набор данных до 23 тысяч совпадений. С более надежными значениями модель может обучаться быстрее.

Последняя модель потеряла 1,25 примерно к эпохе 600. Новой модели для этого требовалось 300. Это уменьшило потери примерно через 800 эпох примерно до 1. Переобучение не было проблемой, поскольку разница потерь между тестовым набором и набором поездов в основном была меньше 4%.

6. Анализ прогнозов

Далее мы должны проанализировать модель. Полезные данные для рассмотрения:

  • Верно ли была предсказана победившая сторона? (Команда-победитель или жеребьевка были правильными)
  • Были ли голы предсказаны правильно? (округленные прогнозы голов верны)
  • Были ли прогнозируемые голы недалеко от реальных? (округленные прогнозы голов правильны +-1 по сравнению с реальными голами)

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

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

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

Точнее, это не означает, что модель не может предсказать результаты. В целом точность предсказания исхода матча составила ок. 42%. Тем не менее, модель все равно потеряет деньги при тестировании в реальном мире. Если быть точным, около 6% за ставку.

Анализ прогнозов для тестового набора данных дает нам следующие ключевые показатели эффективности:

Average gain per bet:                         - 5.10%
Predictive accuracy (match outcome):           42.19%
Win rates: Home: 46.34% | Away: 30.18% | Draw: 23.48%
More accurate than betting solely on home:    - 9.82%
More accurate than betting randomly:           19.96%
Estimation accuracy (goals soft):               7.89%

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

8. Множество симуляций Монте-Карло

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

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

  • Количество симуляций = 20
  • Продолжительность итераций (количество ставок) = 100
  • Размер каждой ставки = 10%
  • Начальная стоимость (здесь: начальный баланс) = 100 (€)

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

Вот пример:

Моделирование 1 имеет начальное значение 100 и долю 0,2 (20%).

  1. Итерация 1. Модель делает ставку 20 (100 * 0,2) и правильно предсказывает победу команды гостей. Букмекеры установили коэффициент 2. Это означает, что модель выиграла 20 (20 * (2–1)) и теперь имеет значение 120.
  2. Итерация 2. Теперь модель делает ставку 24 (120 * 20), и ее прогноз для этого матча неверен. Следовательно, он теряет значение ставки 24 и имеет значение 96.

Вот некоторые из результатов:

Как видите, это просто статистическая игра: всегда есть 1-2 выброса с положительной эффективностью, но подавляющее большинство стремится к нулю. Это соответствует среднему убытку в 6% на каждую ставку, которую принимает модель мы рассчитали ранее.

9. идеи по улучшению

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

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

Обучение

  • Больше параметров не означает лучших прогнозов. Речь идет о том, как эти параметры влияют на результат.
  • Более сложные нейронные сети, такие как CNN, вероятно, будут лучшим вариантом для сложных наборов данных (таких как этот).
  • Набор данных должен быть тщательно подготовлен, чтобы избежать ошибок во время обучения (например, из-за неправильного форматирования CSV-файлов, что приводит к неправильным входным данным, которые нелегко найти).
  • Пользовательский фреймворк для pytorch реально экономит время.
  • Сохраняйте модели во время обучения, чтобы выбрать ту, которая работает лучше всего, чтобы вам не пришлось иметь дело с переобучением (которое со временем увеличило бы потери)
  • Для моделей с большим количеством входных параметров может быть лучше низкая скорость обучения.

Последние мысли

Хотя моя модель не будет работать в реальной ситуации, я достиг своей главной цели: я многое узнал о машинном обучении и о том, как визуализировать данные (используя matplotlib).

На этом статья заканчивается, но, возможно, вы найдете не менее интересную статью на моей средней странице. Также загляните на мой сайт davidewiest.com.

Вы заметили что-то не так или у вас есть отзывы? Пожалуйста, напишите комментарий или заметку. Спасибо!