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

  1. Бэттерс выиграл бы, если бы лучше догадывался о том, что будет дальше.
  2. Питчерам было бы полезно знать, что они, скорее всего, бросят дальше, чтобы они могли удивить отбивающего.
  3. Людям, создающим бейсбольные симуляторы и игры, было бы полезно иметь более совершенные модели того, кто и когда подает.
  4. Интересно играть со статистикой бейсбола.

Поскольку мы академики, которые частично изучают и преподают как игры, так и машинное обучение, это, вероятно, в основном № 4. Тот факт, что мы являемся учеными, также означает, что мы должны будем дать нашему (простому) методу аббревиатуру: MAPSIK (Modeling Pitching Sequences in Keras).¹

Полезная/крутая вещь в MAPSIK — которая, как мы полагаем, была сделана ранее аналитиками данных различных команд (позвоните мне, пивовары!) — это то, что она дает вам действительно непротиворечивую модель того, каковы вероятности для заданных наборов питчей. , и это легко проверить против истины. Такого рода вещи проделывались с финансовыми рынками миллионы раз — действительно, я реализовал что-то концептуально похожее, когда был профессиональным инженером-программистом, — но, что неудивительно для финансов, не похоже, чтобы люди часто делились своим кодом. Я поделюсь кодом ниже (для бейсбольного случая) и проведу вас через него.

Я начну с доказательств того, что он делает что-то аккуратное:

Это производит:

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

Начну с точности! Как мы измеряем точность? Вот чистая правда: точность отстой. Предположим, что 30% полей — это фастболы, что примерно соответствует действительности. Если мы предположим, что каждая подача является фастболом, мы получим точность 30%. Это выглядит еще лучше, когда мы используем некоторые глупые метрики точности, такие как деление точности на количество категорий (т.е. возможных шагов) — поскольку в наших данных есть 16 возможных шагов, некоторые метрики предполагают, что мы убиваем его, когда наша модель звучит буквально: «все поля — это фастболы с четырьмя швами». Очевидно, мы должны сделать лучше, чем это.

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

Тем не менее, точность может быть полезной! При взятии случайной выборки MAPSIK получает примерно 48% правильных результатов. Это примерно то же самое, что и сообщение в блоге, которое вдохновило нас, и мы не удивимся, если это будет настолько высоко, насколько кто-либо может получить, поскольку питчеры часто выбирают неожиданные подачи специально, чтобы удивить отбивающего! Теперь у нас получается лучше, чем «все поля — фастболы», но хуже, чем могли бы. Возникает вопрос: после полной корректности, как мы можем измерить производительность модели?

Что ж, в этом коде мы предполагаем, что это мера того, сколько шагов MAPSIK дал шанс на победу. Каков арсенал этого питчера против этого отбивающего? У большинства питчеров есть 4 или 5 подач, которые они могут бросить, по крайней мере, согласно нашей статистике. Какие из них они собираются бросить? Мы считаем, что если это не входит в тройку лучших предложений или с вероятностью более 10% или около того, зачем об этом беспокоиться? Все может случиться — это бейсбол! Что ж, вот и хорошие новости: оказывается, мы можем знать 3 лучшие возможности примерно в 90% случаев. Мы даем правильную подачу с вероятностью более 10% ~ 90% времени. Если мы оценим его высоко и дадим ему высокий шанс, у него действительно будет высокий шанс произойти. Это хорошая модель! Если вы подходите к тарелке, а MAPSIK говорит: «Вероятность резака составляет 90%», тогда садитесь на тарелку².

В ПОРЯДКЕ! Мы обещали провести вас через код:

Мы используем statsapi для загрузки всех игр сезона. Мы берем очень хорошо сформированные данные из прекрасного API — хорошая работа, MLB и statsapi — и разбиваем их на PitchEvent записи (несколько из которых ссылаются на PlayEvent запись).

Теперь у нас есть все данные, необходимые для наших прогнозов! Тем не менее, batter_id и pitcher_id на самом деле не дают нам информации, которую мы хотим. Мы хотим знать, какие именно подачи делает Мариано Ривера, и какие подачи, как правило, бросают Барри Бондсу, а также каковы результаты этих подач. Построение моделей для обработки сумасшедших коллинеарных, чрезвычайно зашумленных данных, чтобы они были непредсказуемо условными — вот для чего нужно «глубокое обучение»! Это ключ и, как мы думаем, причина, по которой эта модель кажется надежной. Превратим каждого игрока (бьющего или питчера) в вектор следующим образом:

Если вы говорите себе: «Подождите, разве это не добавляет каждую подачу, которую делает или делает питчер, в один и тот же вектор? ЧТО О ШОХЕЙ ОТАНИ? Брэндон Вудрафф сразил эту красавицу с Клейтона Кершоу!» Шохей Отани великолепен, и все наши надежды после сезона (возможно, только в MLB The Show) связаны с тем, что Брэндон Вудрафф наберет 0,600 в этом сезоне, но это приемлемая потеря для MAPSIK.³

Как и ожидалось, я сделал кучу глупых ошибок при написании оценочного кода, большинство из которых было связано с эффективностью. Оказывается, списки в Python 3 не созданы для того, чтобы их можно было рассматривать как очереди — я думаю, мне следовало использовать deque? Настоящая проблема была чрезвычайно предсказуемой и чрезвычайно предотвратимой: управление версиями. Keras теперь в основном живет внутри Tensorflow, но у меня было несколько простых ошибок, даже когда действительно, честно говоря, казалось, что и построение модели, и код оценки модели работают под управлением Keras 1.15.0. Я до сих пор не знаю почему, но, похоже, это исчезло, когда я добавил оптимизатор в качестве параметра в загрузчик модели.

((Часть II скоро.))

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

  1. По правде говоря, мы хотели назвать его в честь Мариано Риверы, поскольку, хотя мы и не фанаты Янкиз, он бросал вызов всем этим предположениям, бросая нож за ножом. Модель Риверы была бы довольно проста. (Мы не смогли придумать аббревиатуру, в которой использовался бы Мариано Ривера. Если да, то, может быть, твитните его на @matthewberland?)
  2. Как мы знаем из вышеупомянутого Мариано Риверы, знать, что каттер приближается, не означает, что вы ударите каттер.
  3. Если вы не согласны, разветвите репозиторий и сделайте MAPSIK++ и укажите нас (чтобы пивовары не забыли позвонить).