Моя модель машинного обучения точно предсказывала, что Вилланова выиграет чемпионат, принесла мне первое место из 34 в моем офисном пуле, 63 место из 608 в соревновании Kaggle (лучшие 11%) и ~ 123 000 из 13 миллионов в ESPN's. общий рейтинг »(первые 1%).

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

Некоторые предостережения:

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

Я сделал по крайней мере одну ошибку при построении своей скобки на основе своих прогнозов, что показано на скриншоте скобки в первом сообщении. Я случайно показал, что WVU превзойдет UNC в элитной восьмерке, когда мой алгоритм выбрал UNC. Так что в бассейне я бы справился лучше, чем в бассейне, но это ничего бы не изменило. Есть очень большая вероятность, что я сделал ошибки где-то еще, к лучшему или к худшему. Я проверил, что Нова должна была пройти весь путь. / вытирает лоб

Несмотря на то, что я выбрал Нову, чтобы выиграть, по моему собственному признанию я дал только 10% шансов, что это действительно произойдет. См. Первый пункт выше об удаче.

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

Готовый продукт

Я выпустил здесь код, а теперь взглянем на мою последнюю скобку!

Установка

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

Они предоставили статистику игрового уровня (через Кена Мэсси) для тысяч студенческих игр, датируемых 1985 годом. Это единственный источник данных, который я использовал для моей модели из-за нехватки времени. Есть так много других источников данных, которые я мог бы распределить по слоям: расстояние в пути, дни между играми, время дня, в которое проводится игра, данные об игроках в каждой команде, прогнозы других экспертов и т. Д. Я бы, наверное, сделал это, если бы уделил больше времени, и, вероятно, в итоге получил бы лучшую модель. Шансы на то, что он все еще выбирает Нову? Кто знает.

Гипотеза

Мне казалось, что недавнее выступление команды и текущий результат Эло (который дает команде рейтинг; подробнее читайте в Five Thirty Eight) сопоставимы с недавними выступлениями другой команды и оценкой Эло. было бы достаточно, чтобы предсказать исход данной игры.

Кажется достаточно разумным. Но насколько важны и влияют на результат каждый недавний показатель эффективности и результат Эло? Введите: Машинное обучение.

Небольшая заметка о машинном обучении

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

Я использую классификатор, называемый логистической регрессией. Через WikiPedia:

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

Насколько я понимаю это с точки зрения непрофессионала:

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

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

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

Данные

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

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

  • wfgm - забиты с игры
  • wfga - попытки попадания с игры
  • wfgm3 - сделано три указателя
  • wfga3 - попытки трех указателей
  • wftm - выполненные штрафные броски
  • wfta - попытки штрафных бросков
  • wor - подборы в атаке
  • wdr - подборы в защите
  • wast - помогает
  • wto - обороты
  • wstl - ворует
  • wblk - блоки
  • wpf - личные фолы

Я также подсчитал:

  • fgp - процент бросков с игры
  • 3pp - три процентных пункта
  • ftp - процент штрафных бросков

На каждой итерации (просматривая каждую игру в наборе данных) я вычислял среднее команд для каждой из этих точек данных за предыдущие N игр. Я экспериментировал с несколькими значениями N, и, честно говоря, я забыл, какие из них я использовал для своего окончательного представления. Я хочу сказать, что было 8 или 9.

Вот и все! Это все данные, которые я использовал: оценка Эло и среднее значение по 16 категориям характеристик из предыдущих игр для каждой из двух команд.

Делать прогнозы

После того, как я загрузил все данные в свою модель, мне оставалось только предсказать результаты. Kaggle выпустил обновленный файл «Seeds» после Selection Sunday, который я использовал для получения идентификаторов каждой команды в турнире.

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

Классная вещь в использовании вероятности заключается в том, что модель не просто говорит, что команда A победит команду B, но что команда A победит команду B с вероятностью, скажем, 0,55 или 55%.

Вот как выглядят некоторые из этих прогнозов:

Кронштейн

Я знаю два способа построить скобку, используя эти вероятности:

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

По общему признанию, версия 2 кажется разумным решением, но я использовал версию 1. Сначала я думал, что версия 1 имеет больше смысла, поскольку я специально предсказал результаты, так почему я должен отклоняться от этого? Но после первого раунда, когда только 23 из моих выборов оказались удачными, я понял: да, нам не удастся сделать все идеально, так почему бы не спланировать лучшее?

Я никогда не моделировал результаты, поэтому не уверен, что Нова по-прежнему будет моим выбором. Тем не менее, я думаю, что буду использовать версию 2 в следующем году, без сожаления по поводу использования версии 1 в этом году.

Последние мысли

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

Спасибо, Kaggle и Ken Massey, за проведение этого конкурса. Не могу дождаться, когда снова приму участие в следующем году.