Прошло почти 2 года с тех пор, как я впервые обучил нейронную сеть заполнить мою скобку Мартовского безумия. Я использовал ту же нейронную сеть, реализованную с помощью Google's TensorFlow, чтобы предсказать мое мартовское безумие в прошлом году, но из-за моего плотного графика (в прошлом году я фактически женился примерно во время мартовского безумия!), У меня не было времени писать сообщение в блоге об этом. Короче говоря, нейронная сеть дала явные признаки того, что Орегон расстроит Висконсин в первом раунде, что штат Огайо расстроит штат Айова в первом раунде, и что UVA выиграет все это. На самом деле у меня был друг, который помог мне сделать несколько ставок на то, что Орегон расстроит Висконсин, а штат Огайо расстроит штат Айова, а также на то, что UVA выиграет все это. В процессе мне удалось превратить 120 долларов в более чем 500 долларов, что неплохо для моей изящной маленькой нейронной сети.

Вкратце, мой подход к мартовскому безумию рассматривает прогнозирование победителей в турнире как проблему ценности. Точно так же, как Уоррен Баффет и Бенджамин Грэм смотрят на инвестирование как на поиск недооцененных акций и избегание переоцененных акций, я рассматриваю исходную позицию каждой турнирной команды NCAA как заранее установленную стоимость этой акции. Затем я использую машинное обучение, чтобы найти, какие комбинации расширенной статистики соответствуют командам, которые отстают (т. Е. Переоценены) или отстают (т. Е. Недооценены) по сравнению с исходными данными. Когда переоцененная команда играет против недооцененной команды, как сказал великий Дик Витале: Расстроенный город, детка!. Как я писал в своей исходной нейронной сети для сообщения в блоге March Madness:

«Я решил обучить свои алгоритмы машинного обучения использовать расширенную статистику, чтобы классифицировать, какие команды с высоким посевом обычно« расстраиваются », а какие команды с низким посевами« расстраивают потенциал ». Для этого я придумал метрику «Выигрыши выше посева», которая измеряет, насколько хорошо команда сопротивляется расстраиванию и насколько хороша команда в опрокидывании более высоких посевов. Короче говоря, Wins Above Seeding (WAS) измеряет, на сколько игр команда выигрывает больше, чем можно было бы предположить при посеве. Например, ожидается, что 7-е посевное выиграет игру против 10-го посевного в первом раунде, но ожидается, что проиграет игру против 2-го посевного во втором раунде. Если это седьмое семя пройдет второе семя и перейдет в сладкую шестнадцать, у него будет WAS +1. Если он выиграет еще одну игру и перейдет в элитную восьмерку, у него будет WAS +2, а если он попадет в Финал четырех (как Южная Каролина, заняв 7-е место в прошлом году), у него будет WAS + 3. И наоборот, если первая посевная команда проиграет во втором раунде, ее WAS будет -3 (поскольку высший посев означает, что команда, как ожидается, выйдет в Финал четырех, продвинувшись на 3 игры после второго раунда). Если бы я мог получить данные как о том, как прошлые команды NCAA обычно играли, так и о том, сколько побед сверх начального уровня им удалось получить, алгоритм машинного обучения смог бы найти закономерности, которые коррелируют с успехом March Madness ».

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

За последние несколько недель я решил навести порядок и обновить свою нейронную сеть March Madness. В моем исходном наборе данных были взяты расширенные статистические данные непосредственно из Sports Reference, но все эти данные были в разных форматах: сила расписания - это число примерно между отрицательными 12 и 12, частота свободного броска и частота трехточечных попыток указаны как десятичные, в то время как PACE и Offensive Rating - числа больше 50. Я решил очистить этот набор данных, используя нормализацию функций: для каждого сезона, когда у меня были доступные данные (с 2010 по 2019), я бы взял наивысшее значение для каждой категории среди всех мартовских безумств связанных команд, вычтите самое низкое значение среди команд мартовского безумия. Затем я бы взял эту разницу и разделил ценность каждой команды на разницу. Например, если бы я смотрел на коэффициент свободного броска в сезоне 2018–2019, я бы взял наивысший коэффициент свободного броска среди команд March Madness, UCF, равный 0,453, и вычел бы самый низкий коэффициент свободного броска среди команд March Madness, Liberty на уровне 0,265 (имейте в виду, что все команды, участвующие в турнире, отмечены тегом NCAA рядом с ними в Sports Reference). В этом случае после нормализации функций мой набор данных закончится тем, что UCF будет иметь значение 1 для Free Throw Rate, Liberty, имеющее значение 0, и команда, подобная Kentucky, с Free Throw Rate 0,419, имеющая нормализованное значение:

(KentuckyFTR-MinimumFTR) / (MaxFTR-MinimumFTR) =
(0,419–0,265) / (0,453–0,265) = 0,819

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

Чтобы добиться этого в Python, я сначала прочитал в своем исходном наборе данных с помощью Jupyter Notebook:

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

Нормализованные данные выглядели примерно так:

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

Вместо TensorFlow моя обновленная нейронная сеть использует Keras, другую библиотеку нейронных сетей с открытым исходным кодом, которая работает на более высоком уровне, чем TensorFlow. По сути, Keras оборачивается вокруг TensorFlow, упрощая сборку нейронных сетей. Как и TensorFlow, Keras также был разработан в Google, в данном случае инженером Франсуа Шоле. Одним из больших преимуществ Keras является то, что мне очень легко добавить регуляризацию, чтобы предотвратить переоснащение, когда моя нейронная сеть слишком близко соответствует существующим данным и теряет способность предсказывать результаты в более общем плане. В данном случае я добавил и регуляризацию отсева, и регуляризацию L2. При отсеве во время обучения некоторые из выходных характеристик слоя нейронной сети случайным образом, ну, выпадают (т.е. устанавливаются на ноль), чтобы бороться с переобучением. В L2-регуляризации стоимость добавляется пропорционально квадрату весовых коэффициентов в нейронной сети, чтобы значения этих весов оставались небольшими.

Как вы можете видеть во фрагменте кода ниже, было легко собрать мою нейронную сеть с помощью Keras. После некоторых проб и ошибок я обнаружил, что получаю надежные результаты для нейронной сети с 256 узлами на входном слое (выбрано, потому что в каждом обучающем экземпляре есть 15 полей данных, а 15² = 225 = ~ 256) со 128 узлами. , 64 узла и 32 узла в каждом из последовательных скрытых слоев. Обратите внимание, что мы добавляем немного регуляризации L2 к каждому слою и добавляем параметр исключения 0,1 после каждого слоя. Поскольку я подхожу к машинному обучению для March Madness как к проблеме категоризации (значение Wins Above Seeding для данной команды соответствует ее категории), я использую функцию активации Rectified Linear Unit (или ReLU). Наконец, на последнем уровне, чтобы упростить категоризацию, я использую категориальную функцию перекрестной потери энтропии.

Такое использование категориальной перекрестной энтропии на последнем уровне означает, что теперь нам нужно, чтобы наши обучающие данные были одним горячим кодированием, то есть каждое значение Win Above Seeding должно быть представлено как 11-битное двоичное значение, только с одним битом, установленным в 1 ( а остальные установлены на 0) для каждой категории. В этом случае WAS -4 (соответствует 1 семени, позорно проигравшему в первом раунде, * cough * * cough * 2018 UVA) будет иметь двоичное значение 00000000001, в то время как WAS +2 (соответствует, для Например, семя 7, делающее это на 2 игры выше ожидаемых для Elite Eight), будет иметь двоичное значение 00001000000. Теперь код для настройки обучающих данных состоит из добавления 5 к значению WAS, чтобы убедиться, что все значения положительны, и затем преобразовав его в одно горячее двоичное представление. К счастью, в Keras есть горячая функция, которая действительно упрощает этот процесс:

Я выделил 94 образца из набора данных для использования в качестве набора для проверки и начал обучение с оставшимися 550 образцами. Изначально я обучил данные для 512 эпох:

что привело к точности, близкой к 98%:

но график потери тренировок показал, что мы можем переобучиться примерно через 200–300 эпох или около того:

В результате я решил переобучить нейронную сеть всего на 256 эпох, что привело к все еще твердой точности около 93%:

Это все еще очень приемлемая точность, особенно если учесть, что сбор только высоких семян дает нам точность только около 76%.

И… вот оно! Новая улучшенная нейронная сеть для March Madness, которую я называю «MadNet» (творческое название, верно?). В ближайшие недели я напишу о другой созданной мною нейронной сети, которая по-новому и креативно использует часто критикуемый бокс-счет, так что следите за новыми статьями в этом «BoxNet»!

Если вам нравится то, что вы читаете здесь, и вы хотели бы поддержать повторную ставку HOOP-PER, мы принимаем пожертвования криптовалютного эфира по адресу: 0xC909ce5d714B3cBD98D498331a45A64E62F786bf