Формула-1 Race Predictor

Подход машинного обучения для прогнозирования победителя следующего Гран-при F1

11 июня 2020 г. · Чтение займет 11 мин.

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

Спустя годы я все еще увлечен этим невероятным видом спорта, поэтому подумал, что было бы интересно предсказать вероятность того, что определенный гонщик выиграет Гран-при, и сравнить ее с коэффициентами букмекеров. Этот проект будет разделен на три части:

  • Сбор информации
  • Анализ данных
  • ML-моделирование

1. Сбор данных

В первой части я объясню, как я собрал все данные и процесс принятия решений.

DataFrame_1: гонки

Для своего интеллектуального анализа данных я нашел два отличных источника: репозиторий данных Ergast F1 и официальный веб-сайт Формулы 1; по сути, у них одни и те же данные, но я использовал и те, и другие для большей точности и полноты.

Мой первый фрейм данных содержит информацию обо всех чемпионатах и ​​гонках с 1950 по 2019 год, включая их местоположение и ссылку на страницу википедии.

DataFrame_2: результаты

Для моего второго фрейма данных я повторял каждый год и каждый раунд моего файла гонок, чтобы запросить Ergast API и получить информацию обо всех результатах гонщиков. Я включил такие функции, как сетка и финишное положение каждого гонщика, его команды и другие менее важные переменные, такие как дата рождения, национальность и статус финиша, которые я изучу позже, чтобы проверить, может ли быть корреляция между возрастом водителей и их производительности, если гонки в их родной стране могут иметь какое-либо психологическое воздействие, или если некоторые водители более склонны к авариям, чем другие 1 win официальный сайт регистрация.

DataFrame_3: Положение пилотов

Очки начисляются во время Чемпионата в зависимости от того, где гонщики и команды финишируют в гонке. Только первые 10 финишировавших гонщиков получают очки, а победитель получает 25 очков. API Ergast показывает количество очков, побед и положение каждого гонщика и команды на протяжении всего Чемпионата. Поскольку очки начисляются после гонки, мне пришлось создать функцию поиска, чтобы сдвинуть очки с предыдущих гонок в рамках того же чемпионата.

DataFrame_4: Конструктор Положение

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

DataFrame_5: квалификация

Получение квалификационных данных о времени было самой сложной частью, в основном потому, что в репозитории данных Ergast есть некоторые дыры в данных, а также потому, что квалификационные правила сильно изменились с годами. С 2006 года квалификация проводится в субботу днем ​​по трехэтапной системе «нокаут», когда машины пытаются установить свое лучшее время круга. Раньше квалификация состояла только из одного или двух сеансов, из-за чего в моем фрейме данных отсутствовали данные. Я решил учитывать только лучшее квалификационное время для каждого гонщика, независимо от того, сколько квалификационных сессий было проведено в этом году. Лучшее квалификационное время отражается в позиции сетки, поэтому позже я рассчитаю совокупную разницу во времени между первой квалифицированной машиной и другими, надеясь, что это может дать мне представление о том, насколько быстрее машина по сравнению с другими. .

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

DataFrame_6: Погода

Погода в Формуле 1 играет важную роль при выборе шин, производительности гонщиков и общей стратегии команд. Я решил просмотреть ссылки в Википедии каждой гонки, добавленные в races_df, и очистить прогноз погоды. Поскольку страницы википедии не имеют согласованной структуры html, мне нужно изучить несколько разных таблиц, и даже в этот момент у меня все еще есть много пропущенных значений. Однако я заметил, что могу найти оставшуюся информацию на соответствующих страницах на другом языке. Затем я использовал селен, чтобы переходить по каждой ссылке на итальянскую страницу и добавлять недостающие данные о погоде. В конце концов, я создал словарь, чтобы классифицировать прогнозы погоды и отображать свои результаты.

2. Анализ данных

Первый чемпионат мира среди пилотов прошел в 1950 году на Гран-при Великобритании в Сильверстоуне и включал всего семь гонок. Количество Гран-при за сезон менялось в разные годы, в среднем за последние сезоны было проведено 19 гонок. Расположение гонок также менялось со временем в зависимости от пригодности трассы и других финансовых причин. В настоящее время только Гран-при Италии и Великобритании - единственные соревнования, которые не пропускали ни одного сезона с 1950 года.

Постепенно к списку подходящих хозяев для чемпионата F1 добавлялось больше неевропейских трасс. На карте показаны места проведения всех Гран-при с начала сезона.

Насколько важна поул-позиция?

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

Какое влияние оказывают гонки на вашу страну?

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

Самые опасные трассы

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

У каких команд было больше отказов машин?

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

Кто более склонен к сбоям?

Автомобили в Формуле 1 могут развивать максимальную скорость 375 км / ч (233 миль в час), поэтому аварии могут в конечном итоге прервать гонку для гонщиков. В таблице ниже показано соотношение аварий некоторых гонщиков, участвовавших в гонках за последние два сезона.

От быстрых 40-летних до звезд-подростков

В первые годы чемпионата мира большинству ведущих пилотов было за сорок: Нино Фарина выиграл первый титул чемпиона мира, когда ему было 43 года, а Луиджи Фаджиоли установил рекорд старейшего победителя в истории Формулы-1 в 1952 году в возрасте 53 лет и старше. вряд ли когда-либо превзойдут его в ближайшие годы. Однако их замена на новое поколение было лишь вопросом времени. С 1960-х по 1993 год средний возраст составлял около 32 лет, а в последние сезоны было всего несколько водителей старше 30 лет.

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

3. Моделирование машинного обучения.

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

Показатели успеха

  • Оценка точности - процент правильно предсказанных победителей в сезоне 2019
  • Сравнение шансов - сможет ли моя модель превзойти шансы?

Подготовка данных

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

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

Проблема регрессии или классификации?

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

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

Вот как выглядит prediction_df в функции подсчета очков для любой гонки в 2019 году. Фактический подиум отображается 0 и 1 (победитель), как и прогнозируемые результаты после сортировки. В этом случае модель ошибочно предсказывает Боттаса как победителя гонки, поэтому модель получит оценку, равную 0.

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

В этом случае, даже если вероятность победы Макса Ферстаппена составляет всего 0,35, поскольку это самая высокая вероятность победы в этой гонке, функция правильно отображает его как победителя.

ML-моделирование

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

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

ПОЕЗД - ТЕСТОВЫЙ СПЛИТ: набор поездов содержит все гонки с 1983 по 2018 год включительно. Тестовый набор состоит из всех 21 гонок сезона 2019 года.

Выводы

После нескольких дней выполнения всех поисков по сетке классификация с помощью нейронных сетей и SVM, похоже, дает самые высокие баллы, правильно предсказывая победителя в 62% гонок в 2019 году, что соответствует 13/21 гонкам.

Я также использовал сезон 2018 и 2017 в качестве тестовых наборов, чтобы проверить, будут ли модели по-прежнему работать хорошо. Нейронные сети показали более высокий балл, чем классификатор SVM за оба года, поэтому я решил, что я выберу классификатор NN со следующими параметрами.

  • hidden_layer_sizes = (75, 25, 50, 10)
  • активация = личность
  • solver = lbfgs
  • альфа = 0,01623776739188721

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

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

Может ли алгоритм превзойти шансы?

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

В таблице ниже в разделе «Коэффициенты фаворита» показан водитель с наибольшими шансами на победу в гонке согласно SkySport, тогда как «Прогнозируемый водитель» - это победитель, предсказанный нейронной сетью. Имена драйверов, выделенные красным цветом, указывают на неправильный прогноз, поэтому они отличаются от столбца «Фактический» драйвер. Строки, выделенные зеленым цветом, показывают, что предсказанный алгоритм алгоритма оказался верным, вопреки предсказанию вероятностей; тогда как выделение красным цветом показывает, что мне, вероятно, следовало поставить на фаворита по шансам. В последних двух столбцах показаны коэффициенты вознаграждения и прибыль, которую я получил бы, если бы последовательно инвестировал 100 евро в каждую гонку, получив в итоге прибыль в размере 4255,00 евро.