Статьи

Ставка Супер Боул 50 Like A Boss с Apache Spark

На этот раз это личное. Суперкубок 50 разыгрывается на стадионе Леви в Санта-Кларе — в поле зрения многих самых инновационных технологических компаний мира, включая MapR. Это Суперкубок Силиконовой долины *, поэтому имеет смысл только то, что это будет самый переоцененный случай в истории (по крайней мере, до следующей большой игры).

Большие события с неизвестными результатами привлекают большие деньги. За последние несколько Суперкубков в спортивной книге Лас-Вегаса было разыграно более 100 миллионов долларов. Везде, где есть большие деньги , вполне естественно, что вы найдете большие данные . Мы использовали Apache Spark для анализа результатов игр в НФЛ, применяя машинное обучение, чтобы найти самородок, который, возможно, пропустили диезы в Вегасе.

* В 1985 году в Стэнфорде была организована игра, которая превратилась в псевдо-домашнюю игру для 49ers. Можно утверждать, что этот конкурс был первым Суперкубком «Силиконовой долины», но ведущие предприниматели этого поколения, которые были малышами в то время, могут не согласиться.

Более / менее

Суперкубок известен своими «опорными» ставками, которые включают бросок монеты, длину государственного гимна или цвет Gatorade, брошенного на победившего тренера в последние секунды. Если цель состоит в том, чтобы использовать методы больших данных, чтобы дать нам преимущество, предпочтительно придерживаться основных ставок, поскольку для анализа доступны тысячи игр и результатов.

Двумя основными ставками, по которым доступны данные, являются спред (предел победы, который фаворит должен превысить, чтобы выиграть) и овер / минус. Последний — общее количество очков, набранных обеими командами; если мы сможем проанализировать данные игры и решить, будет ли она похожа на игру с низкими показателями по сравнению с прорывом, основанным на нарушениях, у нас может быть возможность делать ставки. Стоит отметить, что цель установления линии не состоит в том, чтобы предсказать результат — Спортивные книги устанавливают линии так, чтобы с обеих сторон была поставлена ​​равная сумма денег. Вот почему линии будут корректироваться, когда деньги поступают слишком односторонне.

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

супер-шар-apachespark-блог-img1

Одним заметным аспектом игр НФЛ является то, что команды постепенно набирают больше очков с 1990 года (общее увеличение на 5 пунктов). Есть много вероятных факторов, которые способствуют этому результату (например, расширение, изменения правил, которые способствуют нарушению и т. Д.), Но также отмечают, что предсказанные очки, набранные (то есть, больше / меньше), отслеживают эту модель почти идеально.

Получение данных в Apache Spark

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

Apache Spark — это отличный инструмент с открытым исходным кодом для анализа больших данных, который также хорошо работает за пределами сети. После очистки популярного спортивного справочного сайта для игровых данных скриптом Python данные импортируются в оболочку Spark для некоторого исследовательского анализа. Все данные и код для воспроизведения результатов или изучения самостоятельно находятся здесь.

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

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

1
2
3
4
5
6
rawFeatures.map{game=> (game._1,game._10) }.sortBy(_._2).take(5).foreach(println)
(New York Jets  at  Washington Redskins - December 11th, 1993,3.0)
(Miami Dolphins  at  Pittsburgh Steelers - November 26th, 2007,3.0)
(Indianapolis Colts  at  New England Patriots - December 6th, 1992,6.0)
(Atlanta Falcons  at  Chicago Bears - October 3rd, 1993,6.0)
(New York Jets  at  New England Patriots - November 28th, 1993,6.0)

Самой результативной игрой в наборе данных (которая включает в себя регулярный сезон и плей-офф с сезона 1990 года) была игра с 106 очками между Кливлендом и Цинциннати в 2004 году (бенгальцы выиграли 58-48):

1
2
3
4
5
6
rawFeatures.map{game=> (game._1,game._10) }.sortBy(_._2,false).take(5).foreach(println)
(Cleveland Browns  at  Cincinnati Bengals - November 28th, 2004,106.0)
(New York Giants  at  New Orleans Saints - November 1st, 2015,101.0)
(Denver Broncos  at  Dallas Cowboys - October 6th, 2013,99.0)
(Cincinnati Bengals  at  Cleveland Browns - September 16th, 2007,96.0)
(Green Bay Packers  at  Arizona Cardinals - January 10th, 2010,96.0)

Мы можем использовать Spark, чтобы найти, что самый высокий спред в игре с 1990 года был 26,5, когда Денвер принимал Джексонвилль в 2013 году (Бронкос выиграл 35-19, но не покрыл спред):

1
2
3
4
5
6
rawFeatures.map{game=> (game._1,game._8) }.sortBy(_._2,false).take(5).foreach(println)
(Jacksonville Jaguars  at  Denver Broncos - October 13th, 2013,26.5)
(Philadelphia Eagles  at  New England Patriots - November 25th, 2007,24.5)
(Cincinnati Bengals  at  San Francisco 49ers - December 5th, 1993,24.0)
(Miami Dolphins  at  New England Patriots - December 23rd, 2007,22.5)
(New York Jets  at  New England Patriots - December 16th, 2007,20.5)

Впечатляет то, как часто фактическая оценка выше или ниже, чем выше / ниже (это расщепление 48% / 49%):

1
2
3
4
5
6
rawFeatures.map{game=> (game._1,game._10-game._9)}.filter(m=> m._2 > 0).count
res23: Long = 3249 ### number of games where score > over/under
rawFeatures.map{game=> (game._1,game._10-game._9)}.filter(m=> m._2 < 0).count
res25: Long = 3317 ### number of games where score < over/under
rawFeatures.map{game=> (game._1,game._10-game._9)}.filter(m=> m._2 == 0).count
res26: Long = 125  ### a push – where the points scored = over/under

Этот вид исследования важен для понимания ваших данных, но до сих пор мы не узнали ничего, что не было бы доступно посредством быстрого поиска в Интернете (где вы можете обнаружить, что в 1966 году была еще более высокая оценка — 113 очков!). Нам следует покопаться немного глубже, чтобы увидеть, сможем ли мы найти некоторые идеи, которые могут дать нам преимущество в ставках за / против.

K-ближайший соседний алгоритм

Метод K-Nearest Neighbor (KNN) — это хорошо известный нелинейный алгоритм машинного обучения, в котором поиск всех точек данных выполняется для нахождения K-наиболее похожих точек, а затем результаты из этих K точек объединяются для получения ответ. Чтобы предсказать количество очков, набранных за Суперкубок 50, мы сравним эту игру со всеми играми, начиная с 1990 года. Для ближайших матчей мы посмотрим на количество очков, набранных среди похожих игр, а затем сравним это распределение с положительным / отрицательным устанавливается спортивными книгами.

Вот числовые функции, которые мы будем использовать для поиска «похожих» игр (помните, что мы ограничены общедоступными и доступными до игры данными):

супер-шар-apachespark-блог-img2

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

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

Больше или меньше?

Прогноз для Супер Боул этого года — 60 ° F с влажностью 72% и ветром около 10 миль в час. В игру будут играть на траве, на открытом воздухе, ранний спред составляет 4,5 очка, а значение «больше / меньше» установлено на 45.

Исходя из тенденции роста количества очков в лиге с 1990 года, более ранняя половина очков была признана непригодной для включения в аналогичные игры. Приведенные ниже команды оболочки Spark использовались для расчета евклидова расстояния между прогнозом Суперкубка и играми, сыгранными с 2002 года, а затем для нахождения 50 наиболее похожих игр (также приведены квадрат расстояния и общее количество очков):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def calcDistance(game:(String, Double, Double, Double, Double, Double, Double, Double, Double, Double, String),
        test:(String, Double, Double, Double, Double, Double, Double, Double, Double, Double,String)):(Double) = {
   var distance = 0.0
   //(parts(0),time,roof,field,temperature,humidity,wind,spread,overunder,points)
   distance += math.pow(game._2-test._2,2)
   distance += math.pow(game._3-test._3,2)
   distance += math.pow(game._4-test._4,2)
   distance += math.pow(standardize(game._5,tempStats)-standardize(test._5,tempStats),2)
   distance += math.pow(game._6/100-test._6/100,2)
   distance += math.pow(standardize(game._7,windStats)-standardize(test._7,windStats),2)
   distance += math.pow(standardize(game._8,spreadStats)-standardize(test._8, spreadStats),2)
   distance += math.pow(standardize(game._9,overStats)-standardize(test._9,overStats),2)
   (distance)
}
 
val distances = rawFeatures.filter(m=> m._5 > -99.0 && m._6> -99.0 && m._7> -99.0 && m._8> -99.0 && m._11.toDouble >2001).map{ game =>
   (game._1,calcDistance(game,parsedTest),game._10)
}
distances.sortBy(_._2).take(50).foreach(println)
(New Orleans Saints  at  Oakland Raiders - October 24th, 2004,0.0042870560083087,57.0)
(Minnesota Vikings  at  Oakland Raiders - November 16th, 2003,0.0055692573219246,46.0)
(Dallas Cowboys  at  Green Bay Packers - October 24th, 2004,0.005933245943430532,61.0)
(Denver Broncos  at  San Diego Chargers - October 19th, 2009,0.00604229789149342,57.0)
(New York Giants  at  San Francisco 49ers - November 13th, 2011,0.00610927509202,47.0)

Самой похожей игрой была битва между Святыми и Рейдерами 24.10.04, в которой было набрано 57 очков. Гистограмма, показывающая распределение очков между всеми 50 играми, показана ниже:

супер-шар-apachespark-блог-img3

Среднее число очков, набранных среди наиболее похожих 50 игр (т. Е. Зеленая линия), выше, чем положительное / отрицательное значение (т. Е. Красная линия @ 45). Это небольшое свидетельство того, что количество очков в Суперкубке 50 будет выше 45, и мы должны ставить больше. Граница победы может быть небольшой, но в конечном итоге вам будет гораздо лучше, чем подбрасывать монету.

Ссылка: Ставьте Супер Боул 50 Like A Boss с Apache Spark от нашего партнера JCG Джозефа Блу в блоге Mapr .