Объединяя мир спортивной аналитики и машинного обучения

РЕДАКТИРОВАТЬ: С момента написания этой статьи мы запустили службу подписки на https://infinitysports.ai, которая дает доступ к API и результатам нашей новой модели прогнозирования NBA. Теперь мы можем предсказать победителя, спреды и общее количество очков. Мне очень понравилось работать над этим проектом, пожалуйста, обращайтесь с любыми вопросами!

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

Учитывая мой опыт работы в сфере коммерции и информатики, я хотел больше узнать о роли количественного аналитика и специалиста по данным. Я начал исследовать мир науки о данных и начал с изучения основ пакета Scikit-learn, учитывая мой опыт работы с Python. В оставшейся части этой статьи я расскажу, как я перешел от почти ничего не знающего о Data Science и машинном обучении к созданию моей первой модели прогнозирования NBA с точностью ~ 72% (подробнее об этом позже, но результаты не так хороши, как они кажутся).

Оглавление

  1. План игры
  2. Сбор данных
  3. Исследование и обработка данных
  4. Выбор подходящей модели
  5. Тестирование и результаты

План игры

Использование статистики в НБА, как и во многих других видах спорта, за последние 10–20 лет экспоненциально росло. Я начал свой поиск наиболее релевантной статистики НБА с чтения Какие статистические данные НБА на самом деле приводят к победам Чинмей Вайда. Его исследование показало, что лучшими предикторами побед в НБА были рейтинг атаки, рейтинг защиты, дифференциал отскока, 3-очковый% и другие статистические данные, о которых вы можете узнать больше, перейдя по ссылке выше.

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

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

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

Для сбора данных в этом проекте я использовал Selenium, пакет Python, который упрощает парсинг веб-страниц, чтобы получать нужные мне данные с различных веб-сайтов. Я также решил ограничить свой поиск данными, начиная с сезона 2008–2009 годов по настоящее время.

Прошлые результаты

Моим источником данных для прошлых результатов был Basketball-Reference.com, на котором были результаты матчей за 1946 год.

Используя Selenium, я скопировал эти таблицы одну за другой и преобразовал их в файлы CSV для дальнейшего использования.

Статистика за прошлый месяц

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

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

Обработка и исследование данных

Обработка данных

Теперь нам нужно было обработать наши 2 набора файлов CSV в формате, в котором их можно было бы сравнивать и анализировать. Я вставил ниже примеры первых 5 строк каждого файла CSV в том виде, в котором они были удалены.

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

После этих шагов наши наборы данных теперь выглядят следующим образом:

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

После выполнения кода, описанного выше, наш набор данных теперь выглядит так:

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

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

Исследование данных

Наш текущий набор данных выглядит так:

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

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

Во-первых, мы можем сказать, что, поскольку и верхний левый, и нижний правый квадранты имеют наиболее коррелированные характеристики, статистика команды сильно коррелирует сама с собой. Если у команды высокий PACE, вероятно, у нее также будет высокий OFFRTG.

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

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

Причину высокой важности Team2NETRTG можно увидеть на ленточном графике выше; когда команда 2 имеет более высокий чистый рейтинг, команда 1 имеет тенденцию выигрывать меньше, и, с другой стороны, когда команда 2 имеет более низкий чистый рейтинг, команда 1, как правило, имеет выше шанс на победу.

Наконец, последний интересный график - это распределение побед команды 1. Судя по тому, как были получены наши данные, команда 1 всегда находится на выезде. Это распределение показывает, что команда гостей проигрывает ~ 59% времени, что иллюстрирует то, что мы называем преимуществом домашней площадки.

Выбор подходящей модели

Я выбрал Scikit-learn, учитывая простоту реализации множества алгоритмов и мой опыт работы с python. Используя эту блок-схему, предоставленную Scikit-learn, я определил несколько моделей, которые хотел бы попробовать, и посмотреть, какая из них наиболее точно работает с моим набором данных. Мои попытки начались так:

Из всех опробованных моделей наиболее точной была модель машинного классификатора SVC с опорными векторами с точностью 72,52% на исторических данных! Пришло время протестировать эту модель в реальном мире, где я попытался предсказать исход 67 игр до закрытия НБА из-за COVID-19.

Тестирование и результаты

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

Основная слабость моего алгоритма - способность предсказывать сбои. В первый день работы моей модели в 5 из 7 игр проигравший выиграл. Мой алгоритм обычно соответствовал тому, что публиковали сайты, посвященные онлайн-ставкам на спорт, что было хорошим знаком. Читая онлайн, мы видим, что НБА обычно имеет 32,1% неудач, в то время как в моей выборке показатель неудач составлял 40,2%.

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

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

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

Будущие шаги

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

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