Lolstats

De WikiGarcia

Lolstats es un proyecto personal el que intento aplicar conocimientos de procesamientos de datos e Inteligencia Artificial a las estadísticas extraídas de la API de Riot Games del popular juego League of Legends.

El propósito principal es crear un modelo que inicialmente pueda predecir si una partida resultará en victoria o derrota considerando el historial de partidas de cada jugador y su rendimiento histórico.

En Documentación técnica se encuentra la guía y scripts para llevar a cabo este proyecto.

Conceptos básicos

A continuación se mencionan los conceptos básicos para tener en cuenta durante el desarrollo de éste proyecto.

League of Legends

League of Legends (LoL) Es un videojuego MOBA (Multiplayer Online Battle Arena) que se encuentra entre los más populares para PC. El juego cuenta con varios modos de juego siendo el principal un mapa 5 contra 5 donde el objetivo es destruir la base enemiga que se encuentra al otro lado de un mapa con tres carriles y una jungla.

Más información:

Grieta del invocador (5v5)

Modo de juego 5 contra 5, donde cada jugador selecciona a un campeón con habilidades únicas. Los 10 jugadores entran a un mapa con 3 carriles y una jungla con las bases en extremos opuestos. Cada jugador debe recolectar oro asesinando súbditos o campeones enemigos o destruyendo estructuras enemigas para poder comprar objetos que mejoren sus habilidades y subir de nivel.

Dentro del juego es común utilizar los siguiente términos:

  • Invocador: Es el nombre que se le da a un jugador. Cada jugador tiene su Nombre de invocador único.
  • Nivel de Invocador: Jugar partidas otorga experiencia la cual se acumula para subir de nivel.
  • Clasificación: El juego permite jugar en modo Clasificación donde el resultado de la partida otorga puntos para colocar al jugador en una tabla de clasificación general de toda la región.
  • Región: Por cuestiones de logística los jugadores de distintas regiones geográficas juegan en distintas regiones (servidores). Entre estas regiones se encuentran: Lationamérica Norte, Latinoamércia Sur, Norte América, Europa del Este, Corea, China, etc.
  • Rango: Dependiendo de qué tan bueno sea un jugador se le asigna un rango en la clasificación general, yendo de menor a mayor: Hierro, Bronce, Plata, Oro, Platino, Diamante, Maestro y Retador.
  • División: Dentro de cada Rango hay subdivisiones, yendo del IV al I. Ej: El siguiente nivel de Oro I es Platino IV.

Dentro de la partida es común utilizar los siguientes términos:

  • 5v5: Abreviación de 5 contra 5.
  • Campeón: Personaje del juego que tiene estadísticas y habilidades únicas.
  • Estadísticas: Características del personaje, principalmente se refiere a su jugabilidad. Ej: Puntos de ataque, puntos de defensa, velocidad de ataque, puntos de vida, etc.
  • Habilidades: Movimiento especial de un campeón que tiene efectos especiales. Ej: Hacer daño extra, curar vida, desplazamientos, control de masas, etc.
  • Mapa: Terreno de juego.
  • Carril: Camino amplio por donde se puede transitar y se mueven los súbditos y campeones.
  • Súbdito: Personaje no jugable (NPCs) que ayuda a los jugadores a combatir.
  • Jungla: Parte del mapa que no forma parte de los carriles, tiene caminos estrechos y monstruos neutrales.
  • Monstruo neutral: Personaje no jugable (NPCs) que no ayuda a ningún equipo pero otorga recompensas al matarlo.
  • Oro: Moneda de cambio dentro de la partida, se usa para comprar objetos.
  • Objeto: Elemento que se puede equipar a un campeón para mejorar sus estadísticas.
  • Build o Itemización: Se le llama así al conjunto de objetos que utiliza un campeón.
  • Estructura: Se refiere a las construcciones con las que los jugadores pueden interactuar, generalmente tienen una función y pueden ser destruidas.
  • Nivel: Dentro de la partida los campeones mejoran sus estadísticas cuando suben de nivel. Es incremental hasta llegar al nivel 18.
  • Experiencia: Matar enemigos o realizar ciertas acciones en la partida otorga experiencia la cual se usa para subir de nivel.

Riot API

Riot Games (compañía creadora de LoL) proporciona para los desarrolladores una Interfaz de Programación de Aplicaciones (API) para obtener los datos de los jugadores y las partidas que hay jugado, ésto con el fin de crear herramientas para ayudar a los jugadores a entender mejor el juego, mostrar estadísticas y comparaciones de objetos, campeones y jugadores, etc.

Una de las herramientas de este tipo más comunes es la página OP GG (https://lan.op.gg) que muestra información de los invocadores, recomendaciones de objetos y cuenta con herramientas de apoyo durante la partida.

De aquí se extraen todos los datos utilizados en este proyecto.

La documentación de la API se encuentra en: https://developer.riotgames.com/apis

Riot Games también proporciona un repositorio de recursos relacionados con el juego para utilizar en conjunto con la API. A este repositorio le llama Data Dragon y contiene información de los campeones, objetos, mapas, rangos, además de recursos como imágenes.

La documentación del repositorio se encuentra en: https://developer.riotgames.com/docs/lol

Inteligencia Artificial

La inteligencia artificial es una rama del Aprendizaje Máquina que se centra en encontrar modelos que sirvan para llevar a cabo una tarea (Ej: clasificación, predicción, optimización, etc) utilizando métodos que normalmente incluyen un entrenamiento previo del modelo.

El proceso (muy general) de un algoritmo de inteligencia artificial comúnmente es el siguiente:

  1. Determinar el alcance esperado del modelo.
  2. Obtener las muestras de entrenamiento y definir sus características útiles.
  3. Definir el modelo.
  4. Entrenar el modelo.
  5. Mejorar el modelo hasta alcanzar un óptimo. Puede requerir redefinir las características de las muestras y el modelo mismo.
  6. Probar el modelo con nuevas muestras.
  7. Liberar el modelo.

Proyecto

Alcance del proyecto

Crear un modelo que sea capaz de predecir, al inicio de una partida, cuál de los dos equipos va a ganar utilizando los datos históricos de los jugadores y las estadísticas generales del juego.

Idealmente el proceso de recopilación de datos se debe realizar durante un único parche para evitar que las modificaciones que éste contenga afecten los resultados.

Actualmente se trabaja con el parche de versión:

Definición y obtención de la información

Como se mencionó anteriormente, se usará la API de Riot en conjunto con el repositorio Data Dragon para extraer la mayor cantidad de datos significativos del juego.

Para entender mejor los datos, lo dividiremos en dos categorías: Datos semi-estáticos y dinámicos.

A partir de este punto, nos referiremos a los datos por sus términos en inglés ya que así son como se obtienen de la API y el repositorio.

Datos semi-estáticos

Llamaremos datos semi-estáticos a aquellos que casi no cambian a lo largo del tiempo, como son: Campeones, objetos, mapas, definiciones de rangos, etc.

Para una definición más precisa, los datos semi-estáticos son aquellos que no cambian en un parche. Todos los datos estáticos se obtienen de Data Dragon.

Para este proyecto los datos que se contemplarán son:

  • Champions: Lista de campeones, ej. Aatrox, Ahri, Zed, etc.
  • Maps: Lista de mapas, ej. Grieta del invocador, Abismo de los lamentos, etc.
  • Ranks: Lista de rangos disponibles, ej. Retador (IV-I), Maestro (IV-I), etc.
  • Regions: Lista de regiones, ej. LAN, LAS, NA, EUW, etc.
  • Queues: Lista de colas para buscar partida, ej. Solo/Duo 5v5, Normal 5v5, etc.

Los datos anteriores se encuentran disponibles en archivos JSON dentro del repositorio.

Datos dinámicos

Son todos aquellos que cambian con el tiempo, como son: historiales de partidas, rango del jugador, estadísticas de cada partida, porcentajes de victoria, etc. Algunos de estos datos se obtienen tras procesar los datos en crudo que proporciona la API.

Los datos crudos que se pueden obtener (y que son útiles para este proyecto) son:

  • Datos del invocador:
    • SummonerName: Nombre de invocador.
    • SummonerID: ID del invocador.
    • PUUID: ID único del jugador.
    • Level: Nivel actual del invocador.
    • Region: Región en la que juega el invocador.
    • Rank: Rango actual del invocador.

Nota: Nótese que invocador y jugador hacen referencia a la persona que juega, sin embargo, usaremos invocador para referirnos a los aspectos relativos a la cuenta y jugador para referirnos a los aspectos relativos a las partidas.

  • Datos de la partida
    • Participants: Lista de los jugadores que participaron en la partida.
      • PUUID: ID del jugador
      • TeamId: Identifica el equipo al que pertenece cada jugador

Todos los datos anteriores se obtienen haciendo peticiones a la API tipo REST de Riot.

Definición del Modelo

Para la iteración inicial de este proyecto utilizaremos una red neuronal básica con una capa de entrada, una de salida y tres ocultas.

La idea es considerar cada partida como un vector de entrada para el modelo y la salida un valor que indique el porcentaje de victoria para cada equipo.

Como las personas tienen a ser más consistentes en las partidas clasificatorias, solo se usaran los resultados de esa cola para alimentar el modelo.

En el modelo inicial se usarán datos de distintos parches, esto para evitar tener que filtrarlos y posiblemente descartar datos.

Entrada

La capa de entrada tendrá igual número de neuronas que propiedades a analizar. Las propiedades son las siguientes:

  • Estadísticas del jugador (Para cada jugador):
    • Level
    • Rank
    • WinRate: Porcentaje de victoria en esa cola. Últimas 50 partidas.
    • ChampionWinRate: Porcentaje de victorias con ese campeón. Solo se buscará en las últimas 50 partidas jugadas.
    • ChampionMastery: Puntos de maestría con el campeón.
    • WinStreak: Número de victorias seguidas al momento.
    • WinRateEnemy[1-5]: Winrate contra cada uno de los campeones enemigos. Solo se buscará en las últimas 50 partidas jugadas.
    • WinRateAlly[1-4]: Winrate con cada uno de los campeones aliados. Solo se buscará en las últimas 50 partidas jugadas.
    • MeanKDA: Promedio de KDA (Asesinatos, Muertes, Asistencias) en las últimas 50 partidas.
    • ChampionMeanKDA: Promedio de KDA con el campeon.
  • Estadísticas del campeón (Para cada campeón):
    • GlobalChampWinRate: Porcentaje de victorias global del campeón. Se consideran 500 partidas aleatorias.

Los datos anteriores se acomodan en un vector de 1x180 de la forma siguiente:

  • Equipo 1
    • Estadísticas del jugador 1
    • Estadísticas del campeón 1
    • Estadísticas del jugador 2
    • Estadísticas del campeón 2
    • Estadísticas del jugador 3
    • Estadísticas del campeón 3
    • Estadísticas del jugador 4
    • Estadísticas del campeón 4
    • Estadísticas del jugador 5
    • Estadísticas del campeón 5
  • Equipo 2
    • Estadísticas del jugador 6
    • Estadísticas del campeón 6
    • Estadísticas del jugador 7
    • Estadísticas del campeón 7
    • Estadísticas del jugador 8
    • Estadísticas del campeón 8
    • Estadísticas del jugador 9
    • Estadísticas del campeón 9
    • Estadísticas del jugador 10
    • Estadísticas del campeón 10

Capas ocultas

El modelo tendrá 3 capas completamente conectadas como capas ocultas. Cada capa tendrá 360 neuronas.

Como función de activación se usará una sigmoide.

Salida

La salida constará de un vector de 1x2 neuronas donde se indicará:

  1. Probabilidad de victoria equipo 1
  2. Probabilidad de victoria equipo 2

El valor de salida de cada vector será un valor entre 0 y 1.

Aunque hablemos de probabilidades es posible que la suma de ambos valores no sea 1, pero lo mantendremos así en la primera versión.