Мне очень нравится смотреть MotoGP, и я не думаю, что есть более захватывающий автоспорт, на который стоит смотреть. Поэтому, когда пришло время попрактиковаться в парсинге веб-страниц и линейной регрессии, это стало идеальным предметом для изучения.
Я решил посмотреть, смогу ли я создать модель, которая может предсказать, сколько времени потребуется, чтобы выиграть мотоциклетную гонку MotoGP, на основе:
- 🛣 Характеристики гусеницы (длина, самая длинная прямая, количество поворотов, ширина, прошлые средние скорости и т. Д.)
- 🌦 Погодные данные (температура воздуха, температура трека, влажность)
- 📊 Исторические результаты гонщика (среднее количество очков за гонку на протяжении всей карьеры)
- 🏍 Некоторые характеристики мотоцикла (класс гонок, 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-й степени.
Для дальнейшего исследования остаточные значения могут быть исследованы с помощью различных графиков невязок (показаны ниже).
- Первый график показывает, что остатки относительно случайно распределяются по предсказанному значению.
- Средний график показывает, что распределение вполне нормальное.
- График Q-Q показывает, что распределение ошибок довольно нормальное, за исключением нижнего предела. Есть еще некоторые значения, которые эта модель не очень хорошо предсказывает, но она хорошо работает для подавляющего большинства данных.
Выводы
- Время финиша гонки можно предсказать с помощью регрессии! Однако простая линейная регрессия - слишком простая модель для этого. Требуются полиномиальные характеристики.
- Даже в этом случае результирующая ошибка довольно высока для этого приложения, так как интервал 37 секунд составляет 50% + времени финиша гонщика. Дополнительная информация о характеристиках и навыках гонщика, вероятно, поможет модели в дальнейшем.
Это говорит о том, что, несмотря на очень хорошее значение R², модель может не сразу оказаться полезной для конкретного приложения. Код, полученные файлы CSV и т. Д. Можно найти в моем репозитории Github. Спасибо за прочтение!