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

9 июля 2020 г. · Чтение займет 8 мин.

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

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

72% точности (подробнее об этом позже, но результаты не так хороши, как кажется).

Оглавление

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

План игры

Использование статистики в НБА, как и во многих других видах спорта, за последние 10–20 лет экспоненциально росло. Я начал поиск по наиболее соответствующих статистике НБА, прочитав какой NBA Статистика Вообще Перевести на Wins по Chinmay Вайда . Его исследование показало, что лучшими предикторами побед в НБА были рейтинг атаки, рейтинг защиты, дифференциал отскока, 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 или по электронной почте.