Как мы использовали (и вы тоже можете) машинное обучение, чтобы лучше понять роль статистики в спорте.

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

  1. Сбор релевантных данных - откуда мы собираем соответствующую статистику по командам и игрокам за несколько сезонов?
  2. Очистка и обработка данных - как мы можем эффективно объединить очищенные данные, чтобы их можно было как читать, так и использовать?
  3. Разработка функций. Какие дополнительные показатели мы можем добавить к нашим наборам данных, чтобы помочь любому пользователю или модели машинного обучения лучше понять и спрогнозировать, соответственно, результаты и тенденции на основе данных?
  4. Анализ данных - можем ли мы определить какую-либо коллинеарность или другие отношения в данных, которые могут лучше информировать наши прогнозы?
  5. Прогнозы - какие модели и функции были бы наиболее полезны для нас при разработке точного прогноза? Сфокусируемся ли мы на групповой статистике или на совокупной индивидуальной статистике?

Прежде чем мы углубимся в подробности нашего рабочего процесса, давайте рассмотрим и отметим другую работу, проделанную именно по этой теме. Во-первых, в 2013 году Ренато Торрес из Университета Висконсин-Мэдисон решил достичь той же цели, что и мы, и спрогнозировать результаты конкретного сезона на основе данных НБА с использованием различных моделей машинного обучения. Он использовал несколько методов, представленных в нашем проекте, в первую очередь сокращение признаков для устранения мультиколлинеарности из доступных данных, а также исследовал различные модели, чтобы исследовать те, которые имеют самую высокую точность. Как и в нашем проекте, его избранные функции включали набранные очки, но в отличие от нашего проекта особое внимание уделялось проценту выигрышей и проигрышей дома и в гостях. (Мы рассмотрим наш анализ возможностей позже.)
Много другой фантастической работы было проделано ранее, и ее можно прочитать здесь:

Ченг, Ге и Чжан, Чжэнью и Кебамбе, Моисей и Насер, Кимбугве. (2016). Прогнозирование исхода плей-офф НБА на основе принципа максимальной энтропии .
Джонс, Эри. (2016) Прогнозирование результатов игр НБА. Государственный университет Северной Дакоты .
Фаяд, Александр. Построил свою первую модель машинного обучения | Алгоритм прогнозирования NBA. Навстречу науке о данных .
Полная история НБА. FiveThirtyEight .

В ходе нашего исследования мы обнаружили, что лучшая из опубликованных моделей имела точность прогнозов 74,1% (для исходов плей-офф), а большинство других достигли верхней границы в пределах 66–72% точности. Большинство опубликованных исследований также сосредоточено на прогнозировании результатов плей-офф, что может привести к необъективным данным: команды плей-офф более последовательны в ряде статистических данных на протяжении всего регулярного сезона, и в результате ожидаемые результаты игр плей-офф, вероятно, будут иметь меньшую дисперсию. Критически отметим, что показатель расстройства за весь сезон в НБА в среднем составляет 32,1%. В плей-офф процент неудач, определяемый командами с меньшим количеством побед в регулярном сезоне, падает до 22% (что на самом деле означает, что большинство моделей прогнозирования плей-офф НБА хуже). Поскольку наш проект был направлен на предсказание исхода любой игры НБА и не зависит от плей-офф, мы стремились разработать модель, которая могла бы достичь и, надеюсь, превзойти точность 67,9% - и тем самым предсказать некоторые проблемы.

Не стесняйтесь следить за здесь или просматривать наши файлы на GitHub.

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

Мы извлекли наши данные из доступной информации в Баскетбольном справочнике, который содержит чрезвычайно подробные данные о командах и игроках для каждой игры, сыгранной с сезона 2008–2009 годов. Парсинг занял несколько дней из-за ограничения скорости (так как нам приходилось запрашивать результаты каждой игры за 12 сезонов), и первоначально он был скомпилирован в формат JSON и, наконец, сохранен в файлы csv.

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

Теперь у нас была и статистика игроков, и статистика команд для каждого сезона НБА, сохраненная в виде отдельных файлов csv. Нашим следующим шагом было считать все эти данные и объединить их в два больших фрейма данных: один будет содержать статистику игроков за последние 12 сезонов, а другой - статистику команды. После создания мы очищали фреймы данных, чтобы удалить недопустимую статистику (отрицательные минуты) и столбцы, которые не имели для нас особого смысла (например, взятые / зафиксированные платежи).

Затем мы сохранили эти новые фреймы данных в следующих файлах csv, что позволило нам (и вам) пропустить трудоемкие и длительные этапы как парсинга, так и очистки данных при перезапуске среды выполнения нашего ноутбука:

Функциональная инженерия

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

  1. Рейтинги Эло

Это, пожалуй, лучший существующий метод для релятивации силы и результативности команды НБА на протяжении многих сезонов. Способ расчета рейтинга Эло прост: все команды начинают со средним баллом 1500, и им либо даются, либо вычитаются баллы в зависимости от окончательного результата каждой игры и места проведения, с учетом разницы в баллах, расстроек и местоположения. . По сути, это более сложный рекорд выигрышей и проигрышей. Большинство моделей прогнозирования НБА не учитывают рейтинги Эло, а вместо этого объединяют простой отчет о победах и поражениях с несколькими другими статистическими данными. Мы хотели использовать Эло для надлежащего взвешивания качественных побед (и поражений), при этом осознавая, что не все команды созданы равными.
Точная формула выглядит следующим образом:
Если 𝑅_𝑖 - текущий рейтинг Эло для команды команда, ее рейтинг Эло после того, как она сыграла в свою следующую игру, определяется следующим образом:

Здесь S_team - это переменная состояния: 1, если команда выигрывает, 0, если команда проигрывает. E_team представляет собой ожидаемую вероятность победы команды, которая представлена ​​как:

k - подвижная константа, зависящая как от разницы в победе, так и от разницы в рейтингах Эло:

Также важно отметить, что рейтинги Эло переносятся от сезона к сезону (поскольку не все команды созданы равными, хорошие команды, как правило, остаются хорошими или, по крайней мере, постепенно снижаются - очень редко команды выпадают на карту или с нее). Если R представляет собой последний Эло команды в одном сезоне, его рейтинг Эло в начале следующего сезона будет примерно таким:

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

2. Последние результаты команды (средняя статистика по 10 последним играм)

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

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

3. Последние результаты игроков (средняя статистика по 10 последним играм)

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

4. Результаты игрока за сезон

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

5. Рейтинги эффективности игроков (PER)

Важно отметить, что, как и в случае с командами с помощью рейтингов Elo Ratings, мы хотели иметь возможность релятивизировать производительность игроков, используя метрику, объединяющую, казалось бы, несвязанную статистику. Мы надеялись, что сможем использовать Рейтинги эффективности игроков Холлингера для сравнения и прогнозирования производительности команд по совокупным показателям PER их игроков. В НБА игрокам легко получить сильно завышенную или заниженную статистику (например, количество очков в минуту) просто на основании количества игрового времени, которое они получают, против игроков на скамейке запасных или против стартеров, количества сыгранных игр или даже из-за выбросы производительности. Мы не хотели полагаться исключительно на средние показатели игроков просто из-за их способности искажать результаты. PER решает эту проблему, взвешивая определенную внутриигровую статистику по отношению к количеству сыгранных минут, что создает показатель, который определяет производительность игрока относительно количества сыгранных минут.
Таким образом, для каждого игрока мы добавили столбец для PER в данной игре по следующей формуле:

PER = (FGM x 85.910 + Steals x 53.897 + 3PTM x 51.757 + FTM x 46.845 + Blocks x 39.190 + Offensive_Reb x 39.190 + Assists x 34.677 + Defensive_Reb x 14.707 - Foul x 17.174 - FT_Miss x 20.091 - FG_Miss x 39.8.190 - TO x ) x (1 / Минуты)

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

Наш анализ данных был сосредоточен на использовании рейтингов Эло в качестве тестового показателя. По сути, можем ли мы быть уверены, что Эло коррелирует с другими статистическими данными и правильно объединяет их? Кроме того, было бы более подходящим для нас прогнозировать результаты игры, используя статистику команды (рейтинги Elo) или усредненную статистику игроков (рейтинги PER)?

Во-первых, давайте исследуем плотность рейтингов Эло в НБА по сезонам. Это немного говорит нам об уровне паритета в лиге: если мы увидим, что рейтинги Эло приближаются к нормальному распределению, это будет означать, что команды лиги относительно хорошо подобраны. В противном случае мы видим большие диспропорции и развитие «суперкоманд».

Отойдя от понимания рейтингов Эло с точки зрения лиги, мы попытались увидеть, как рейтинги Эло соотносятся с результатами отдельных команд в других статистических данных.

Сначала мы попытались построить график распределения Эло для случайной команды от среднего количества очков, набранных в последних играх:

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

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

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

Из представленных на графике данных видно, что агрегированный PER по сравнению с противниками не показывает большой корреляции с силой команды, определяемой рейтингом Elo Rating. Напротив, набранные очки лучше воспринимаются - что имеет некоторый смысл, поскольку эффективность игрока не обязательно связана с набиранием наибольшего количества очков - а очки, набранные против оппонентов, являются определяющим фактором победы в игре и, следовательно, влияют на Эло.

Мы можем увидеть это дальше, сопоставив средний и средний рейтинг PER Орландо Мэджик с его оппонентами за те же сезоны, и обнаружим, что почти нет связи между средними или средними значениями PER команды и силой команды.

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

Прогнозирование исхода игр на основе статистики команд и рейтингов Эло

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

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

Для начала мы использовали простую непараметрическую модель LR со статистикой нашей команды и рейтингами Elo в качестве параметров, используя sklearn:

Поигравшись с настройкой гиперпараметров, мы обнаружили, что использование max_iter = 131 и verbose = 2 немного улучшило нашу первоначальную точность тестирования до 66,95%. Определенно неплохо для непараметрической модели и очень близко к желаемой точности прогноза. Однако мы попытались выяснить, можем ли мы лучше настроить наши гиперпараметры, чтобы повысить нашу общую точность. По сути, мы бы попробовали множество комбинаций возможных гиперпараметров на наших данных, чтобы получить абсолютные наилучшие веса для нашей модели LR.

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

Используя RandomizedSearchCV, мы провели поиск среди 2 * 4 * 5 * 11 * 3 * 3 * 5 * 3 = 59 400 возможных настроек, и поэтому наиболее эффективным способом сделать это было бы взять случайную выборку ценности.

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

В этом случае реализация GridSearch лишь незначительно повысила нашу точность с нашей моделью LR.

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

Сразу же мы получаем, что RandomForestClassifier достигает начальной точности 66,95%, что опять же неплохо. Как и в случае с моделью LR, мы попытались настроить гиперпараметры для получения более точных результатов - сначала с помощью RandomizedSearchCV.

В отличие от модели LR, мы обнаружили, что RandomizedSearch улучшает настройку гиперпараметров, давая нам лучшую точность на 67,15%.

Запуская GridSearchCV аналогично тому, что мы делали выше, мы также стремились явно протестировать 2 * 1 * 6 * 2 * 3 * 3 * 5 = 1080 комбинаций настроек вместо случайной выборки распределения настроек. GridSearch также дал нам улучшение по сравнению с базовым RandomForestClassifier с точностью 67,11%.

В целом, при запуске как LinearRegression, так и RandomForestClassifier для статистики команды и рейтингов Elo, мы достигли точности прогноза выигрыша на уровне 66,95% –67,15%. Для баскетбольных игр, которые, как мы установили ранее, сильно различаются по своим фактическим и прогнозируемым результатам, это значительный результат.

Прогнозирование исхода игр на основе статистики и результатов отдельных игроков

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

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

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

Вместо использования модели логистической регрессии для подсчета очков мы будем использовать модель линейной регрессии, поскольку мы стремимся предсказать диапазон возможных значений (набранных очков) вместо того, чтобы просто предсказать выигрыш или проигрыш. Наша RMSE (среднеквадратичная ошибка) для всех игроков составила 5,56, или эквивалент каждого игрока, сделавшего или пропустившего примерно 2–3 игры в корзину относительно своих средних значений.

На тестовом наборе мы сгруппировали прогнозируемые результаты каждой команды для каждой игры и сравнили их с их фактическими результатами. Вычисление количества выигранных игр по отношению к победителю на основе прогнозируемого результата дало нам соотношение 1483/2528 или точность 58,66%. Ясно, и как мы поняли ранее, глядя на распределение PER команд по сравнению с их противниками, совокупная производительность игроков слишком изменчива, чтобы точно предсказать исход игр - особенно по сравнению с производительностью команды, которая имеет тенденцию быть более последовательной в разных играх.

Выводы и соображения на будущее

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

Наша модель регрессии случайного леса с параметрами, оптимизированными с помощью RandomSearchCV, дала нам наивысшую точность тестирования 67,15%. Он немного выше, чем модель логистической регрессии, и намного выше, чем модель линейной регрессии, основанная на статистике отдельных игроков. Оптимизация параметров с помощью GridSearchCV и RandomizedSearchCV отнимала много времени и вычислительных ресурсов, и это приводило лишь к незначительным изменениям в точности тестирования. Если бы у нас было больше времени, мы, вероятно, потратили бы меньше времени на оптимизацию параметров и больше времени на выбор модели.

Лучшие модели прогнозирования игр NBA точно предсказывают победителя только примерно в 70% случаев, поэтому наша модель логистической регрессии и классификатор случайного леса очень близки к верхней границе существующих прогнозов. Если бы у нас было больше времени, мы бы исследовали другие модели и посмотрели, насколько высока точность тестирования, которую мы можем получить. Некоторые из этих кандидатов включают SGD-классификатор, линейный дискриминантный анализ, сверточную сеть или наивный байесовский классификатор.

Надеюсь, вам так же понравилось читать о нашей работе, как и нам, - и вы тоже кое-чему из нее научились.