Машинное обучение / Наука о данных

Прогнозирование киберспортивных игр

Подход машинного обучения для перехвата рынка киберспорта

Немного о предыстории

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

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

Итак, я хотел найти проект, в котором я мог бы:

1) Создайте службу данных, которая будет иметь ценность для бизнеса.

2) Оцените производительность по сравнению с профессионалами в этой области.

3) Избегайте больших начальных затрат, так как я буду делать это из своего бюджета

4) Получайте удовольствие, делая это

Придумывал разные варианты:

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

- Современная обработка естественного языка (NLP) и компьютерное зрение (CV). В настоящее время в области NLP и CV происходят большие разработки, которые постоянно продвигаются все дальше и дальше. Несмотря на то, что это очень интересная сфера, обычно с деловой стороной не все так однозначно. Многие люди создают интересные MVP, которые не продвигаются дальше, потому что при создании чего-то нового требуется много усилий, чтобы убедить клиентов использовать это.

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

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

Начиная с "Почему"

Я начну с «Почему», поскольку я считаю, что это важный вопрос на данный момент, и для меня решающими были следующие атрибуты:

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

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

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

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

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

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

Бизнес-проблема

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

У этой проблемы есть несколько интересных особенностей, которые могут быть неочевидны с самого начала:

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

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

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

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

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

3. Построение предигровой модели, чтобы превзойти букмекерские конторы. Это требует больше всего времени, но приносит больше всего пользы с точки зрения обучения. Речь идет о сборе исторических данных, изучении их и создании системы, которая автоматически обновляет данные и делает прогнозы. Вы сравниваете этот прогноз с результатами букмекерской конторы и делаете ставки на те, в которых уверены. Как уже упоминалось в предыдущих подходах, это не означает, что вам нужно прогнозировать результаты игры / матча / раунда, вы также можете выбрать длину игра или первая кровь (подробнее об этом здесь, в разделе убийства героев), если это кажется более полезным.

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

Первый и второй подход технически менее сложны и могут дать результаты, аналогичные третьему. Кроме того, в третьем нет четкой модели, которую следует построить, результаты могут отличаться из-за сложности модели («первую кровь» может быть труднее предсказать, чем «точку совпадения») и количества возможностей предсказания (сколько букмекеры действительно это предлагают).

В течение короткого периода времени я пробовал первый и второй подход. Они были довольно сосредоточены на извлечении данных и были довольно просты. Я хотел попробовать что-то новое и более сложное, поэтому я решил построить свою собственную модель прогнозирования матчей перед игрой, чтобы превзойти модель букмекеров. В своей первой итерации я сосредоточился на DotA2, но позже расширился до LoL и CS: GO.

Анализ данных

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

В то время как сначала я начал изучать как анализировать данные из видео, я быстро понял, что если я спущусь в эту кроличью нору, я застряну только на сборе данных для остальной части моего проекта. Итак, я нашел отличный ресурс, который уже этим занимался. Open Dota 2 - отличный бесплатный ресурс, который помог мне получить мой первый набор данных и понять, какие данные мне нужны.

Еще одним источником данных были данные букмекеров. Я построил 3 скребка для загрузки данных из GGBet, Unibet и Optibet. Не было особой причины, по которой я выбрал именно эти. Пока они были достаточно надежными и устойчивыми, чтобы не исчезнуть через несколько месяцев. Они предлагают множество возможностей для ставок, в частности GGBet.

Хотя это было отличное место для начала, но были и некоторые подводные камни:

1) Данные были ограничены DotA 2 - она ​​не зря называется Open Dota. Несмотря на то, что она включала довольно подробную статистику, было непросто распространить модель на другие игры, кроме DotA 2.

2) Будущие игры были недоступны - при использовании Open Dota у меня не было доступа к будущим играм, а это означало, что мне нужно было построить еще один парсер для будущих игр от Liquipedia или использовать информацию букмекеров. В любом случае это означало, что мне нужно было бы сразу начать работу с сопоставлением данных между сайтами, что не казалось отличным способом начать с MVP.

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

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

Очистка и аннотирование данных

Важным аспектом использования службы API является то, что самые неприятные проблемы с качеством данных уже решаются на стороне PandaScore, поэтому у меня не было проблем с этим.

В исторических играх отсутствовали некоторые значения: отсутствовали результаты матчей или подробные результаты. Такие пропущенные значения составляли менее 1% исторических данных, поэтому я не выполнял для них никакой специальной обработки данных, а просто отбрасывал их при обучении модели. Я также попытался выполнить вменение (в основном для средней статистики, такой как продолжительность игры и т. Д.), Но это никак не повлияло на обучение модели.

Более интересно было заняться аннотацией данных или «сопоставлением между сайтами». Чтобы рассчитать исторические и теоретические результаты производительности модели, мне нужно было сопоставить команды по шкале между PandaScore API и статистическими данными букмекеров.

Например:

«Virtus Pro» также может быть «Virtus.Pro» и «VP».

«LGD-Gaming» также известна как «PSG.LGD» или «LGD».

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

Моя следующая итерация заключалась в сопоставлении по названиям команд и времени игры. Сопоставление по времени игры отлично сработало для будущих игр, но не для исторических, поскольку время их начала сильно различается в зависимости от источника данных. Для исторических игр PandaScore записывает фактическое время начала, в то время как Unibet не корректирует время начала, когда игра задерживается.

Разница в названиях команд между сайтами по-прежнему присутствовала, поэтому сопоставление названий команд по-прежнему было проблемой.

Для решения вышеуказанных проблем я разработал тройное решение:

1) Найдите совпадение, сравнив время начала и названия команд в нижнем регистре.

2) Если не найдено, проверьте, не сообщалось ли ранее, что у команды есть псевдонимы. С течением времени я составлял словарь названий команд.

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

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

Решение не является полностью автоматическим, но со временем дает хорошие результаты. В первые недели мне приходилось подбирать 20–30 команд в неделю, а сейчас только 5–10. Возможно, в долгосрочной перспективе может потребоваться лучшее решение, но пока я им доволен.

Создание оракула

Здесь развлекается, по крайней мере, так нам сказали. 😊

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

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

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

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

Такой подход помогает выявить потенциальных «препятствий» на раннем этапе, он экономит время, а это очень важно, когда проект не работает.

Я использовал следующие итерации с точки зрения структуры модели:

1) Экспертная модель. Как упоминалось выше, эта модель предсказывала результат на основе предыдущих побед. Я не проводил никаких испытаний и калибровок, я использовал эту модель просто как заполнитель.

2) Случайный лес, SVM и Logit. В качестве второй итерации я рассмотрел самые классические статистические модели. Это простой шаг после исследовательского анализа (отличный пример здесь) и перед испытанием более сложных моделей. Все эти модели обладают разными свойствами, которые помогают понять, что искать дальше. Например, мои результаты с использованием SVM и Logit были относительно слабыми, в то время как Random Forest превзошел их довольно значительно. Я использовал эту информацию, чтобы спланировать свою следующую итерацию.

3) XGBoost и LightGBM - последняя итерация заключалась в повышении точности модели. Эти фреймворки отлично подходят для этой цели, когда вы уже выполнили начальную разработку переменных и исследовательский анализ. В этом проекте Random Forest дал лучшие результаты по сравнению с предыдущими моделями, но проблема с Random Forest в том, что он не обрабатывает различные корреляции / динамику в пределах данных. XGBoost помогает решить эту проблему, создавая поддеревья, которые лучше понимают динамику внутри подгрупп и, следовательно, могут решать более сложные проблемы с аналогичными объемами данных, но имеют более высокую вероятность переобучения.

Теперь, когда конвейер запущен и работает, моя главная цель в проекте - точность модели. В качестве следующей итерации я планирую протестировать DNN и GNN, как рекомендуют коллеги / другие.

Вечный двигатель

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

Настройка в AWS с самого начала. Думаю, самая важная часть обучения, которую я получил, - это начать использовать AWS с нуля. Вначале я пробовал использовать локальные базы данных, файлы csv и т. Д., Но довольно быстро стало ясно, что мне нужна правильная БД с доступом с разных машин с минимальными накладными расходами - иначе есть еще одна вещь, о которой нужно беспокоиться. Для меня база AWS RDS PostgreSQL сделала свое дело. Его легко настроить, и если данные не являются сверхчувствительными, беспокоиться буквально не о чем.

Настройка cronjobs для парсинга - парсинг и извлечение данных из API должны быть регулярным действием, которое постоянно обновляет вашу базу данных. Я рассматриваю это как отдельную часть конвейера, который постоянно работает, даже если отдых (например, делать прогнозы и делать ставки) по какой-то причине не работает. Итак, отделите его и продолжайте работать круглосуточно, 7 дней в неделю, поскольку это данные, вводимые из внешних источников, и не должно иметь никаких зависимостей с остальной частью вашего кода.

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

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

Если не работает, дайте ему сломаться. В своих предыдущих проектах я много работал с ошибками, чтобы выявить ошибки / аномалии в коде, при этом сохраняя работоспособность системы. В этом проекте я на собственном опыте выяснил, почему производственные системы ломаются, когда они устраняют неожиданные ошибки. Если есть какие-то аномалии в данных (например, все данные отсутствуют), то обработка их так же, как некоторые отсутствующие значения (также известные как «fillna»), не лучшая идея, потому что если ваш скребок сломан (или другая часть кода ) то вы об этом не узнаете. Из этого я научился так: если есть серьезная ошибка, позвольте коду сломаться, и вам нужно исправить это соответствующим образом. В этом случае нельзя продолжать думать, что все работает, а на самом деле это не так.

Положить деньги туда, где есть рот

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

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

Легко делать ставки на игры, где букмекер дает вероятность 50% -50%, а ваша модель говорит, что это больше похоже на 70% -30%, но становится интереснее, когда букмекер говорит 70% -30%, а ваша модель говорит 30% -70%. . Последний сценарий действительно проверяет, насколько вы доверяете своей системе.

Прежде чем начать делать ставки на реальные деньги с использованием вашей модели, следует учесть несколько моментов:

Торговля на бумаге. У вашей системы будут проблемы, надеюсь, немного, но они будут. Бумажная торговля имитирует процесс ставок без фактической ставки денег, но все же проходит процесс и записывает результаты. Это дает объективное представление об ожидаемых результатах и ​​помогает искоренить любые проблемы, которые могут возникнуть в системе. Также помните о законе малых чисел: если ваша модель в среднем приносит 10% прибыли по нескольким ставкам, это не значит, что вы будете получать этот результат каждую ставку / день / неделю / месяц. Бумажная торговля - отличный способ укрепить доверие к вашей системе, не теряя при этом много денег.

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

Автоматизируйте процесс и придерживайтесь его. Вы прошли через все эти трудности, чтобы создать систему, которая лучше любого человека знает, на что делать ставки, поэтому, в конце концов, нет смысла делать ставки. говоря: «Я знаю лучше». Если вы действительно серьезно относитесь к одной ставке, вы всегда можете ее пропустить, но это не должно быть долгосрочной стратегией. Ручные корректировки вряд ли когда-либо будут хорошими в долгосрочной перспективе, и если вы видите систематическую ошибку в своем прогнозе, вам следует исправить ее на уровне модели. В конечном итоге, если вы ее создали, отслеживаете, протестировали и готовы вложить в нее деньги, то также доверяйте ей - это ваша система.

Исход

Прошло 3-4 месяца с тех пор, как я начал этот проект, и за это время я пробовал разные стратегии и уровни автоматизации. В этом разделе я более подробно опишу одну из основных моделей, на которых я работал, с достаточно длинной историей результатов.

Настройка модели:

  1. Каждый час модель собирает букмекерские коэффициенты с сайта ставок и получает самые свежие данные от PandaScore.
  2. На основе обновленных данных он вычисляет новые вероятности победы для всех матчей, используя только данные до матча для принятия решений.
  3. Для каждой очищенной игры модель вычисляет разницу между «моей оценкой вероятности» и «оценкой вероятности букмекера». Когда абсолютная разница составляет:

‹10%, модель не делает ставки

10–20%, модельные ставки 2 €

20–30%, модельные ставки 3 €

30% -40%, модельные ставки 5 €

40 +%, модельные ставки 8 €

  1. Модель делает ставки на 3 разные игры: Dota2, CS: GO и LoL.
  2. Ставки совершаются за 2 часа до начала матча: при подходящем матче детали отправляются мне по электронной почте, и я делаю ставку вручную.

Полученные результаты:

В целом результаты были неоднозначными. Хотя 2 месяца игр кажутся достаточно долгими, количество реальных ставок невелико. За июнь-июль 2020 года модель провела 290 матчей, сделала 88 ставок - это около 30% матчей, что по моему опыту довольно много. Большинство этих матчей прошли в Dota 2.

Общая сумма ставки составляет 285 евро, а возврат составляет 60,44 евро, следовательно, коэффициент возврата составляет 21%. Хотя в целом эта статистика выглядит великолепно, между играми есть большая разница в производительности.

Например, доходность для Dota составляет около 14%, для CS: GO - около 98%, а модели LoL за этот период ничего не заработали. Это указывает на то, что это мог быть просто хороший период для CS: GO, когда большинство из 6 ставок были успешными, но не лучший период для LoL.

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

Хотя общие результаты хороши, на еженедельной основе они были довольно нестабильными для каждой игры. В Dota 2 было больше всего игр, но неделя за неделей производительность была нестабильной. Хотя в конце июня у LoL была хорошая неделя, в июле он продолжал терять деньги.

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