Прогнозирование бейсбольных полей

Использование машинного обучения для прогнозирования следующей подачи

Введение

Задача отбить бейсбольный мяч на уровне высшей лиги чрезвычайно сложна — учтите, что эталоном для ОТЛИЧНОГО нападающего является средний показатель 0,300 — это всего лишь 30% успеха. Если бы отбивающий знал, какую подачу питчер, скорее всего, сделает следующей, его шансы на успех могли бы значительно возрасти. Текущий анализ плохо передает историю игры через данные. Питчеры более предсказуемы, чем люди думают — люди просто не используют надлежащие инструменты для их измерения.

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

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

Литературный обзор

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

Предсказание следующего шага

Авторы: Гартибан Ганешапиллай и Джон Гуттаг, Массачусетский технологический институт

Используя данные, собранные из набора данных MLB STATS Inc., авторы использовали специальные машины линейных опорных векторов для питчеров, обученные на входных векторах из 48 функций сезона 2008 года и двоичной метке, указывающей тип подачи. Модель тестировалась на данных сезона 2009 года. Всего было обследовано 359 отдельных кувшинов.

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

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

Базовая точность большинства в среднем 59,5% использовалась для оценки производительности модели, которая в среднем показала точность 70% со средним улучшением на 18% в зависимости от питчера.

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

Сбор данных

Данные о поле были собраны из Statcast через пакет pybaseball. Класс statcast Pybaseball позволяет нам запрашивать питчи по диапазону дат. Определив даты начала и окончания регулярных сезонов 2016, 2017, 2018 и 2019*, мы смогли получить кадры данных Pandas, содержащие все поля для каждого регулярного сезона. Затем эти кадры данных подвергались элементарной очистке данных, описанной далее в разделе «Очистка данных и разработка функций» этой статьи. После очистки кадры данных были сжаты и сохранены на github в виде файлов рассола.

С учетом будущего развития проекта данные, помимо того, что они были сжаты и сохранены в основном репозитории проекта GitHub в виде файлов рассола, также хранились в корзине S3 как в виде файлов рассола, так и в формате csv. Затем эти CSV-файлы использовались для создания таблицы Redshift, содержащей все поля регулярного сезона с 2010 по 2019 год. Эта архитектура хранения повторно рассматривается в следующих разделах.

Очистка данных и разработка функций

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

Общая очистка данных

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

Особенности состояния игры

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

Затем мы создали функцию, которая представляла разницу в счете, или на сколько рангов впереди или позади команды питчеров. Затем, используя данные для бейсраннеров, мы преобразовали функции бейсраннера из использования идентификатора бейсраннера в двоичное значение 1/0 независимо от того, был ли бегун на каждой базе. Также мы добавили функцию определения того, был ли ЛЮБОЙ игрок на какой-либо базе по сравнению с пустой базой, а также функцию того, были ли базы загружены. У бегуна на первой базе есть потенциал украсть базу и продвинуться вперед, поэтому, возможно, некоторые питчеры с меньшей вероятностью будут бросать в грязь столько разбивающих мячей, что они могли бы уйти от ловца и позволить бегуну продвинуться в результативную позицию. Возможно, бегун на 2-й базе, хорошо видящий сигналы подачи кэтчера и способный украсть знак и предупредить игрока, играющего с битой, своим собственным сигналом, может повлиять на выбор подачи питчерами. Возможно, некоторые из этих тенденций могли бы помочь модели машинного обучения делать прогнозы.

Strikezone и функции ватина

Используя данные о местоположении из системы статкаст-камеры, границы зоны удара для этого конкретного нападающего в зависимости от его роста/стойки, а также размер домашней площадки, мы создали функцию, которая классифицировала каждое поле как или вне зоны страйка (независимо от того, назвал ли это судья мячом или страйком). Кроме того, используя функцию описания, мы извлекли описания и создали бинарную функцию, показывающую, замахивался ли отбивающий на поле. Объединив эти инженерные функции, мы создали функцию, которая показывает, «преследовал» ли нападающий поле, которое находилось за пределами зоны удара. Мы подумали, что это будет полезно позже, когда мы создадим наш скаутский отчет по каждому отбивающему, поскольку, если отбивающий имеет тенденцию преследовать на определенных типах полей за пределами зоны удара, эта информация может быть известна питчеру до матча, и он может с большей вероятностью, чем в противном случае, будет бросать определенные типы подачи против этого игрока.

Категория тона и вменение нулевого значения

К сожалению, у очень небольшого процента питчей в базе данных statcast, возможно, из-за случайных сбоев в системе камеры или по какой-либо другой причине, не было классификации типа тона для этого тона. Вместо того, чтобы просто удалить все эти строки из фрейма данных, чтобы сохранить непрерывность питчей от игры к игре, мы решили вычислить эти значения. Наша стратегия вменения заключалась в том, чтобы просто использовать общие распределения типа высоты звука для данного кувшина и сделать случайное предположение (используя эти распределения в качестве весов для случайного предположения). Затем мы сопоставили различные типы подачи с более общей категорией: фастболы (4-шовные, 2-шовные, режущие, грузящие), брейк-болы (кривые мячи, ползунки, изгибы суставов, чудаковатые) и оффспид-питчи (переходные мячи). , костяшка и шаг eephus).

Особенности теста

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

Для каждого нападающего мы отфильтровали кадр данных для всех подач, с которыми столкнулся нападающий, и записали общий процент подач, с которыми столкнулся игрок, для каждой категории типа подачи, думая, что если отбивающий сталкивается с необычно высоким процентом от определенной категории типа подачи, возможно, имело место Основная причина, по которой питчеры делали это против этого нападающего. Кроме того, мы объединили эти оценочные значения avg batting avg, woba и iso для мячей, попавших в игру, для каждой категории поля. Наконец, мы вычислили характеристику процента ударов отбивающих для каждого типа поля (как часто поле было в зоне удара и отбивающий предпочитал не замахиваться), а также как часто отбивающий преследовал поле за пределами зоны удара. для каждой категории питча. Наконец, на основе соотношения количества размахов отбивающего на каждом типе подачи к количеству раз, когда мяч вводился в игру (а не промахов или фолов), мы создали процент «замахов мяча в игре» для каждого типа поля. категория шага.

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

Чтобы предотвратить утечку данных, когда для создания этих агрегатов использовались будущие/неизвестные данные о тенденциях нападающих, отчет о разведке нападающих создавался итеративно, месяц за месяцем. Первоначальная статистика посева была рассчитана на основе данных поля за 2017 год, а затем для каждого месяца регулярного сезона с 2018 года по конец августа 2019 года мы рассчитали отчет о тестировании для всех полей в этом месяце, основываясь только на предварительной информации. Затем статистика за этот месяц была объединена с предыдущими данными за 2017 год и включена в предыдущие данные для расчетов за следующие месяцы. Кроме того, чтобы уменьшить влияние выбросов данных из-за небольшого размера выборки, если отбивающий не прошел 100 бросков с этим типом поля, мы присвоили значения NaN для этого отчета о разведке нападающих для этого типа поля. Позже мы использовали агрегированные данные, основанные на положении этих отбивающих в порядке ударов, чтобы вычислить эти значения NaN, полагая, что одинаковые отбивающие в одном и том же порядке ударов были достаточно близким приближением.

На этом этапе предварительной обработки данных мы решили сохранить фрейм данных в файле pickle и хранить в github, и в конечном итоге его можно было импортировать в csv или SQL db. Это было естественной точкой остановки, потому что после выбора конкретного кувшина производилась дальнейшая предварительная обработка.

Особенности кувшина

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

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

Особенности игры за игрой

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

Порядок подачи и количество бросков

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

Функции игрового процесса

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

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

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

Особенности предыдущего матча Pitch-Batter

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

Разработка модели и настройка гиперпараметров

Бинарная классификация

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

Мультиклассовая классификация

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

Для всего нашего прогностического моделирования мы протестировали несколько различных типов моделей и сравнили точность прогнозов по типам моделей для нескольких избранных стартовых питчеров, у которых была большая выборка бросков, брошенных в 2018–2019 годах.

Кодирование категориальных переменных

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

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

Масштабирование числовых функций

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

Тренировочный тестовый сплит

Для каждого кувшина мы разделили данные на 85 % / 15 % – тест на поезд. Разделение было рассчитано на основе даты, поэтому тестовый набор 85% состоял из первых 85% бросков, а тестовый набор — самых последних 15% бросков. Этот метод гарантирует, что при обучении модели не будет использована утечка будущих неизвестных данных.

Выбор модели

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

Оптимизация гиперпараметров

Для каждой модели мы выполнили либо поиск по сетке, либо рандомизированный поиск по ряду различных гиперпараметров, включая различные стратегии регуляризации, чтобы предотвратить подгонку моделей к обучающему набору, выполняя как минимум трехкратную перекрестную проверку для каждого. Мы сохранили результаты этого поиска в кадре данных pandas и отсортировали по рангу оценки точности проверки. В зависимости от требуемой вычислительной мощности и того, сколько времени потребовалось для обучения этого типа модели, мы затем использовали 30–100 лучших гиперпараметрически настроенных моделей для каждого типа и проверили точность на тестовом наборе, а также сохранили 10 самых точных моделей для проверки. каждый отдельный тип модели для дальнейшего анализа и последующего ввода в групповой классификатор голосования

Интерпретация модели и важные особенности

Бинарные модели

Вышеупомянутый поиск по сетке с перекрестной проверкой и рандомизированный поиск были выполнены для четырех разных питчеров, выбранных из числа стартовых питчеров с наибольшей выборкой питчей в данных за 2018–2019 годы. Выбранными питчерами были Джейкоб де Гром, Тревор Бауэр, Макс Шерцер и Зак Грейнке. .

Для каждого питчера в качестве наивного предположения использовался основной класс из тренировочного набора, точность базовой модели для сравнения с точностью различных моделей. В частности, в качестве наивного предположения для каждой подачи в тестовом наборе выбирался тот процент подач для целевой переменной fastball/not-fastball, который был выше в тренировочном наборе. Затем оценка точности для каждой из моделей сравнивалась с точностью наивного предположения. Среди четырех питчеров, после группировки всех моделей вместе и получения среднего значения разницы в точности модели по сравнению с наивным предположением, Джейкоб де Гром показал самый высокий процент увеличения точности, чуть менее 15% лучше, чем наивное предположение. Точность модели Макса Шерцера была гораздо менее успешной, со средней разницей примерно на 3% лучше, чем наивное предположение.

При группировке по кувшинам и сравнении типов используемых моделей случайные леса имели самую высокую точность по сравнению с базовым наивным предположением, примерно на 12% выше. Чуть ниже случайных лесов деревья с градиентным усилением, модели LDA и машины линейных опорных векторов в среднем примерно на 9–10% превышают наивное предположение. Stochastic Gradient Descent Classifier и sklearn SVC работали намного хуже, в среднем примерно на 6% выше наивного предположения.

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