Как игрок с приличным рейтингом в League of Legends, я всегда задавался вопросом о важности уклонения в рейтинговых играх. Если вы видите, что ваш топ Riven находится в полосе проигрышей из пяти игр, или вы впервые получаете Талию в миде, стоит ли вам рисковать остаться и разыгрывать ее, или вам следует уклоняться, чтобы избавить себя от неприятностей? Я начал этот проект, чтобы наконец ответить на этот вопрос и лучше понять факторы, влияющие на рейтинговую игру.

Цели

  • Насколько точно я могу предсказать исход матча до его начала?
  • Какие особенности выбора чемпиона наиболее важны при принятии решения о исходе игры?

Набор данных

Для этого проекта я работал с 1700 образцами совпадений. Каждый матч рассматривался как две точки данных: одна для победившей команды и одна для проигравшей. С помощью общедоступных API Riot и Champion.gg я создал 14 функций для каждого игрока в команде, всего 70 функций на команду. Первые 5 характеристик относятся к общей статистике чемпиона, выбранной игроком, а остальные 9 относятся к личной статистике игрока. Особенности были:

  1. Винрейт чемпиона * - средний винрейт чемпиона.
  2. Скорость игры чемпиона * - средняя скорость игры чемпиона.
  3. Скорость игры чемпиона в ролевой игре * - средняя скорость игры чемпиона в той роли, для которой он был выбран.
  4. Рейтинг чемпиона * - рейтинг, присвоенный Champion.gg чемпионом.
  5. Процент побед в матче чемпиона * - средний процент побед чемпиона в матче на линии / роли.
  6. Последние 2 игры - количество побед, которые одержал игрок над чемпионом в 2 последних играх.
  7. Последние 15 игр - то же, что и выше, но для последних 15 игр с рейтингом.
  8. Игры, сыгранные с чемпионом - количество игр, сыгранных игроком с чемпионом в своих 300 последних играх.
  9. Рейтинговые игры с чемпионом - То же, что и выше, но только рейтинговые.
  10. Мастерство чемпиона - очки мастерства, которые игрок получает за чемпиона.
  11. Уровень игрока - уровень призывателя игрока.
  12. Ранг игрока - Ранг игрока, численно рассчитываемый в диапазоне от 0 (Bronze V 0LP) до 3000 (Challenger).
  13. Сыгранные с ролевыми играми - количество игр, сыгранных игроком в соответствии с его ролью в 300 последних играх.
  14. Рейтинговые игры с ролевыми играми. То же, что и выше, но только рейтинговые.

Всякий раз, когда выбирался чемпион вне мета, некоторые из характеристик чемпиона имели бы NaN-значения, так как на Champion.gg не было достаточно данных, чтобы иметь точную статистику для чемпиона. Чтобы учесть это, я использовал две схемы замены NaN:

  1. Замена каждого значения NaN на среднее значение этой функции по всем выборкам.
  2. Удаление всех образцов со значениями NaN. Это приводит к меньшему количеству данных для работы.

Выбор модели

В этом проекте я сравнил эффективность глубокого обучения, случайных лесов, опорных векторных машин, градиентного повышения и логистической регрессии в прогнозировании выигрышей / проигрышей. Разделив свои данные на 70% обучения и 30% теста, я использовал поиск по сетке, чтобы найти лучшие гиперпараметры для каждой модели. Это были мои результаты с использованием первой схемы усреднения значений NaN:

Это были мои результаты с использованием второй схемы удаления значений NaN:

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

Чтобы проверить, достаточно ли у меня данных, я обнаружил точность каждой модели на увеличивающихся подвыборках моего общего набора данных:

Все модели выходят на плато в производительности около 2000 выборок, поэтому размер моего набора данных в 3400 выборок достаточно велик, чтобы получить точное представление об общем пространстве выборок. Кроме того, модели случайных лесов и повышения градиента превосходят другие модели для обеих схем замены NaN, и поэтому я буду использовать две вышеупомянутые модели для определения важности функций. Интересно отметить улучшение производительности нейронных сетей, SVM и моделей логистической регрессии на выборках, не содержащих NaN. Однако случайные леса и повышение градиента выполнялись примерно одинаково для обеих схем. Таким образом, для определения важности функции я буду усреднять значения NaN, поскольку это дает больше данных для работы. Все значения NaN относятся к особенностям, зависящим от чемпионов, поэтому, возможно, три модели с улучшением гораздо более чувствительны к этим функциям, чем случайные леса и повышение градиента.

Важность функции

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

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

Возможные предубеждения

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

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

Заключение

Я остался очень доволен своими результатами, так как они более или менее оправдали мои ожидания. Даже с настроенными гиперпараметрами моя лучшая модель имела точность только 60% в предсказании выигрышей / проигрышей. Это показывает, что игры не решаются при выборе чемпиона, так как во время матча происходит много случайности. Однако могут быть случаи, когда моя модель предсказывает очень высокий процент (›90) проигрыша, и уклонение от этих игр может быть разумным.

Я также обнаружил, что роль АЦП оказывает наименьшее влияние на игру (да ладно, я главный АЦП), в то время как все остальные роли имеют примерно равное влияние. Выбор чемпиона гораздо менее важен, чем игрок, который его выбирает, поэтому не думайте, что ваш игрок средней линии троллит, когда выбирает Гекарима на миде.

GitHub для этого проекта: https://github.com/arilato/ranked_prediction

Публичный API Riot: https://developer.riotgames.com

Публичный API Champion.gg: http://api.champion.gg