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

До сих пор поиск подходящих сборок элементов выполнялся в основном методом проб и ошибок, с упором на аналитику и опыт, а не на прогнозирование и машинное обучение. Иногда невероятно мощные предметы оставались незамеченными в течение многих месяцев (Ardent Censor 2016) или никогда не успевали проявить себя, несмотря на их невероятную мощь (Essence Reaver до патча 9.2).

Сборки стрелков - Максимальный урон

Стрелки - особый класс чемпионов в League of Legends. Как дилеры первичного урона, вся их детализация вращается вокруг максимизации наносимого урона.

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

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

Предсказание урона в секунду от предметов

Моя первая идея заключалась в использовании линейной регрессии, чтобы я мог легко получить доступ к коэффициентам модели. У меня была интуиция, что урон сильно коррелирован с предметами, и что после нормализации урона по нескольким факторам его можно будет достаточно прилично предсказать только по предметам. Поэтому я начал разрабатывать «метрику повреждений», которая максимально соответствовала предметам. Я также ограничил свой анализ играми продолжительностью от 20 до 40 минут, потому что игры за пределами этого диапазона имеют высокий шанс выпадать из общего ряда.

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

Для начала я решил запустить алгоритм только с предметами на входе и моим «счетом в секунду» на выходе.

Чтобы не переборщить с нишевыми предметами, я решил учитывать только те предметы, которые присутствуют более чем в 5% игр и стоят более 500 золотых. Я представил предметы одним горячим вектором. Я добавил к нему несколько горячих полей, представляющих пары предметов, например IE + Statikk Shiv, потому что я думал, что синергия предметов является основным фактором нанесения урона для стрелков.

С другой стороны, мне потребовалось около часа, чтобы найти правильный способ индексирования вектора, но я был очень горд, обнаружив, что решение было для элементов i и j, i * items_list_length- (i * (i + 1) / 2) + j. Ура базовой математике.

Итак, с items_vectors и scaled_dps_scores, представляющими наши входы и выходы, вот код, который я запустил, используя методы из sklearn:

# Model calculation and validation
X_train, X_test, y_train, y_test = train_test_split(items_vectors, scaled_dps_scores, test_size=0.2)
lm = LinearRegression()
lm.fit(X_train, y_train)

# Display the results vs prediction. Should be close to a diagonal.
predictions = lm.predict(X_test)
plt.scatter(y_test, predictions)
plt.show()

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

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

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

Поэтому я добавил чемпиона, который использовался как еще один уровень нормализации созданного мной DPS.

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

Что ж, выглядит немного лучше! хотя наши прогнозы все еще слишком банальны, мы видим, что прогнозы становятся все ближе к диагонали x = y.

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

Анализ цен на товары

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

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

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

Видишь, куда я иду? Еще раз, линейная регрессия - отличный способ решить проблему! Представляя предметы по их статистике, можно использовать линейную регрессию для вычисления «истинного» значения каждого показателя в золоте.

Для этого я попытался сгруппировать похожие эффекты, насколько мог. Например, я сгруппировал все пассивы «холодное оружие» и представил их полем, имеющим значение 1, а затем посчитал «Холодное сердце» как 1,2 пассивного умения «холодное оружие». Таким же образом я сгруппировал пассивные умения Sheen, QSS, упорство ... Этот метод означает, что я ввел некоторые личные предубеждения, но он также помог мне учесть гораздо больше предметов при расчете ценности эффектов в золоте.

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

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

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

Заключение

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

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

Надеюсь, вам понравилось это понимание моей работы в Splyce. В следующий раз я сделаю более короткий пост о распознавании ролей, о том, что мне нужно было реализовать довольно рано, чтобы иметь надежные вычисления разницы cs!

PS: МЫ СОЗДАЛИ ПЛЕЙОФФЫ ДАВАЙТЕ ГООООООООООО