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

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

  1. 🛣 Характеристики гусеницы (длина, самая длинная прямая, количество поворотов, ширина, прошлые средние скорости и т. Д.)
  2. 🌦 Погодные данные (температура воздуха, температура трека, влажность)
  3. 📊 Исторические результаты гонщика (среднее количество очков за гонку на протяжении всей карьеры)
  4. 🏍 Некоторые характеристики мотоцикла (класс гонок, motogp vs moto3 и т. Д.)

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

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

Загрузив необработанный HTML, выполнив поиск определенных тегов и используя эту информацию для «угадывания» URL-адресов для другой статистики, я смог загрузить результаты гонок для классов Moto3, Moto2 и MotoGP с 2005 по 2017 год.

Очистка данных

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

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

Линейная регрессия OLS

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

В конечном итоге линейная регрессия дала наилучшие результаты со следующими параметрами:

  • Оптимизирован с 16 функциями
  • Данные испытаний R-квадрат = 0,53
  • Среднее RMSE = 110 698 миллисекунд (~ 2 минуты)

Полиномиальная регрессия

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

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

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

Выводы

  • Время финиша гонки можно предсказать с помощью регрессии! Однако простая линейная регрессия - слишком простая модель для этого. Требуются полиномиальные характеристики.
  • Даже в этом случае результирующая ошибка довольно высока для этого приложения, так как интервал 37 секунд составляет 50% + времени финиша гонщика. Дополнительная информация о характеристиках и навыках гонщика, вероятно, поможет модели в дальнейшем.

Это говорит о том, что, несмотря на очень хорошее значение R², модель может не сразу оказаться полезной для конкретного приложения. Код, полученные файлы CSV и т. Д. Можно найти в моем репозитории Github. Спасибо за прочтение!