scieee AI-readable full text Open interactive document viewer

Predicción de resultados deportivos mediante técnicas de aprendizaje estadístico. Aplicación al tenis

Piedras Martínez, Juan

Abstract

Este trabajo aborda la predicción del resultado de partidos de tenis profesional correspondientes a torneos de Masters 1000 y Grand Slam disputados durante el año 2024, utilizando distintas técnicas de aprendizaje estadístico. En primer lugar se presenta un marco teórico de las distintas técnicas empleadas, con especial énfasis en el Gradient Boosting Machine, un algoritmo que combina modelos débiles para alcanzar una gran capacidad de predicción. Además, se presentan ciertas herramientas de interpretación del modelo construido que permitan entender el origen de las predicciones realizadas. Por otro lado, se introducen varios conceptos clave de este deporte junto a la construcción de una base de estadísticas anuales. Además, se analiza si la inclusión de estas variables en el modelo mejora su capacidad de clasificación. Se presta especial atención al empleo de técnicas de regularización, con el objetivo de mejorar la capacidad predictiva a partir de los datos utilizados, evitando el sobreajuste.

Full text

Doble Grado en Física y Matemáticas TRABAJO FIN DE GRADO Predicción de resultados deportivos mediante técnicas de aprendizaje estadístico. Aplicación al tenis Juan Piedras Martínez Sevilla, Junio de 2025 Índice general Resumen........................................ iii Abstract........................................ iv 1. Introdución 1 1.1. Estadodelarte ................................. 1 2. Gradient Boosting Machine 3 2.1. Introducción al aprendizaje supervisado . . . . . . . . . . . . . . . . . . . . 3 2.2. Modelosdébiles................................. 4 2.2.1. Árbolesdedecisión........................... 5 2.3. Optimización numérica del problema . . . . . . . . . . . . . . . . . . . . . 7 2.4. Funcionesdecoste ............................... 9 2.5. AlgoritmoGBM................................. 10 2.6. Tamaño ideal de los árboles . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.7. Regularización.................................. 13 2.7.1. Velocidad de aprendizaje . . . . . . . . . . . . . . . . . . . . . . . . 14 2.7.2. Criterios de parada temprana . . . . . . . . . . . . . . . . . . . . . 14 2.7.3. Subsampling............................... 15 2.8. Interpretación del modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.8.1. Importancia de las variables predictoras . . . . . . . . . . . . . . . 17 2.8.2. Gráficos de dependencia parcial . . . . . . . . . . . . . . . . . . . . 17 2.8.3. SHAP .................................. 18 3. Construcción de una base de datos 21 3.1. Eldeportedeltenis............................... 21 3.1.1. RankingATP.............................. 22 3.2. Descripción y procesado de los datos . . . . . . . . . . . . . . . . . . . . . 22 3.3. Estadísticasanuales............................... 24 3.3.1. Tendencias del deporte . . . . . . . . . . . . . . . . . . . . . . . . . 26 i 4. Predicción del resultado de partidos 29 4.1. Análisis descriptivo de los datos . . . . . . . . . . . . . . . . . . . . . . . . 30 4.1.1. Gráficosboxplot ............................ 31 4.1.2. Matriz de correlaciones . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.2. Modelosdepredicción ............................. 34 4.2.1. Árboles de decisión . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.2.2. Gradient Boosting Machine . . . . . . . . . . . . . . . . . . . . . . 36 4.2.3. Conclusiones .............................. 45 A. Apéndice: Código R implementado 47 A.1. Construcción de una base de datos . . . . . . . . . . . . . . . . . . . . . . 47 A.2. Predicción del resultado de partidos . . . . . . . . . . . . . . . . . . . . . . 52 A.2.1. Análisis descriptivo de los datos . . . . . . . . . . . . . . . . . . . . 61 A.2.2. Modelos de predicción . . . . . . . . . . . . . . . . . . . . . . . . . 62 Bibliografía 73 ii Resumen Este trabajo aborda la predicción del resultado de partidos de tenis profesional correspondientes a torneos de Masters 1000 y Grand Slam disputados durante el año 2024, utilizando distintas técnicas de aprendizaje estadístico. En primer lugar se presenta un marco teórico de las distintas técnicas empleadas, con especial énfasis en el Gradient Boosting Machine, un algoritmo que combina modelos débiles para alcanzar una gran capacidad de predicción. Además, se presentan ciertas herramientas de interpretación del modelo construido que permitan entender el origen de las predicciones realizadas. Por otro lado, se introducen varios conceptos clave de este deporte junto a la construcción de una base de estadísticas anuales. Además, se analiza si la inclusión de estas variables en el modelo mejora su capacidad de clasificación. Se presta especial atención al empleo de técnicas de regularización, con el objetivo de mejorar la capacidad predictiva a partir de los datos utilizados, evitando el sobreajuste. iii Abstract This document focuses on predicting the outcomes of professional tennis matches played in the 2024 Masters 1000 and Grand Slam tournaments, using various statistical learning techniques. First, a theoretical framework is presented covering the different methods used, with special emphasis on the Gradient Boosting Machine, an algorithm that combines weak learners to achieve high predictive performance. In addition, several model interpretation tools are introduced to help understand the origin behind the predictions made. Furthermore, several key concepts from the sport are introduced, along with the construction of an annual statistics database. The analysis also explores whether the inclusion of these variables improves the model’s classification performance. Special attention is paid to the use of regularization techniques, aiming to enhance predictive accuracy based on the available data while avoiding overfitting. iv Capítulo 1 Introdución Desde tiempos inmemoriables, el ser humano ha tenido como uno de sus grandes objetivos la predicción de lo que está por acontecer. Ya en culturas antiguas, como en la Antigua Grecia, los oráculos desempeñaban un importante papel en la sociedad mediante sus predicciones proféticas en la anticipación de eventos futuros. Con el desarrollo de la estadística moderna, surge una disciplina con la que se desarrolla un método que permite la extracción de información a partir de datos, como censos o muestras. Hoy en día, con el fuerte desarrollo de la capacidad de computación, la irrupción de nuevos modelos de predicción basados en el aprendizaje estadístico ha cambiado el paradigma de trabajo de numerosos campos del conocimiento. Mientras que antes se contaba con una gran limitación en la cantidad de datos a analizar, en la actualidad la complejidad y tamaño de las bases de datos con las que se trabaja han alcanzado cotas inimaginables hace unas décadas. La aplicación de estos modelos engloba multitud de ámbitos, desde el diagnóstico médico hasta la creación de asistentes virtuales o vehículos autónomos, pasando por el análisis de datos deportivos. Así, la predicción de resultados deportivos es un tema de investigación en auge, y no es para menos. La industria de las apuestas deportivas se ha convertido en un negocio el cual mueve miles de millones de euros al año a nivel mundial. Sin embargo, es obvio que no se está ante una tarea fácil. Si lo fuera, los espectáculos deportivos perderían el atractivo que viene ligado a la incertidumbre de su resultado y que los hace tan populares. 1.1. Estado del arte En este trabajo el enfasis estará puesto en la aplicación de determinadas herramientas estadísticas, las cuales serán presentadas posteriormente, a un deporte en concreto, el tenis. Aunque el tenis no alcanza las cotas de popularidad de las que gozan otros deportes como el fútbol o el baloncesto, no es complicado encontrar numerosos artículos dedicados a la aplicación de distintas técnicas de aprendizaje estadístico al análisis del mismo, sobre todo al uso de diferentes modelos para la predicción del resultado de partidos de tenis profesional. Uno de los artículos más antiguos dedicados a este tema que se puede encontrar es un estudio realizado por Boulier y Stekler [4] en 1999. En este, los autores hacen uso de 1 1.1. ESTADO DEL ARTE modelos probit para analizar si la diferencia de ranking entre los contrincantes actuaba como un predictor efectivo del resultado del partido, obteniendo una conclusión positiva. De forma similar, en otro artículo publicado en el año 2000 por Clarke [6], se hace uso de un modelo de regresión logística para, a partir de la posición en el ranking ATP de cada uno de los jugadores que participaba en un torneo, estimar la probabilidad que tenía cada uno de ganar el mismo. En años posteriores, algunos autores como Del Corral y Prieto-Rodríguez [7] en 2010, además de utilizar la posición del ranking, incorporan a su análisis elementos como la diferencia de edad o la mano dominante de cada jugador. Es interesante que, para incluir el efecto del ranking, calculan la diferencia entre logaritmos naturales para así aumentar la diferencia de nivel entre puestos altos del ranking y disminuir su efecto en puestos más bajos. Por último, merece la pena mencionar un artículo más reciente en el que el modelo utilizado es el tratado en este trabajo, el Gradient Boosting Machine. Es un artículo publicado en el año 2024 por Wentao Shi [19] en el que se incorporan variables como el histórico de resultados de los enfrentamientos entre ambos jugadores o el estado de forma del jugador calculado a partir de sus últimos partidos disputados. Aunque aplicado al estudio de un único torneo, muestra la efectividad del algoritmo GBM en el campo del análisis deportivo. 2CAPÍTULO 1. INTRODUCIÓN Capítulo 2 Gradient Boosting Machine El Gradient Boosting Machine, o también conocido por sus siglas GBM, es un algoritmo de aprendizaje estadístico utilizado para problemas tanto de regresión como de clasificación. Básicamente, es una técnica que combina un conjunto de modelos de predicción débiles con el fin de formar un algoritmo final con gran capacidad de predicción. En esta sección se trataran los fundamentos matemáticos del mismo, los cuales son tratados en libros como [11] y artículos como [16] y [8]. Una impletación más práctica, aunque recomendable para obtener una idea intuitiva del algoritmo, se puede encontrar en [3]. Todos ellos han sido consultados durante la realización de esta sección. Antes de comenzar a presentar lo que sería el fundamento del algoritmo GBM, parece conveniente empezar por realizar una introducción al aprendizaje supervisado, ya que resultará imprescindible para el tratamiento de los modelos posteriores. 2.1. Introducción al aprendizaje supervisado La modelización estadística pretende explicar el comportamiento de una o más variables en los individuos de una población, las cuales se denominarán variables respuesta, en función de una serie de características asociadas a estos individuos, que no serán más que otras variables observadas en los mismos, que se conocerán como variables predictoras. Así, estos métodos explicativos requieren de la elección de un modelo que describa la relación entre las variables. Se considera una muestra de la población de la que se conoce tanto la respuesta como las características, es decir; se tiene una muestra de la forma (x, y)N i=1 ∈(X, Y )donde X= (X1, ..., Xp)son las variables predictoras e Yes la variable respuesta. El objetivo del aprendizaje supervisado será construir una función f:X→Yque realice una predicción de la respuesta en función de las variables de entrada: f(xi)≈yii= 1, ..., N En el caso en el que en el que Y=R, se tendrá un problema de regresión; mientras que si |Y|=K, K ∈Nse tiene un problema de clasificación. En algunas ocasiones, esta dependencia es conocida y solo hay que ajustar ciertos parámetros de un modelo teórico. Sin embargo, en la mayoría de casos se desconoce la 3 2.5. ALGORITMO GBM probabilidad de pertenencia a cada una de las clases pl(x),l= 1, ..., K, como será en el caso aquí tratado. Se generaliza el modelo logístico a Kclases, pk(x) = efk(x) PK l=1 efl(x) lo que asegura que 0≤pk(x)≤1y que el sumatorio de estas probabilidades es uno. Se tienen Kdiferentes funciones lineales a las que se impone que PK l=1 fl(x) = 0. Así, se define la desvaición binomial como: L(y, p(x)) = − K X k=1 I(y=Gk) log pk(x) = − K X k=1 I(y=Gk)fk(x) + log K X l=1 efl(x)! Así, en cada iteración se construyen Kárboles, donde cada árbol Tkm se ajusta a su correspondiente vector de gradiente negativo gkm cuyas componentes vienen dadas por −gikm =∂L(yi, f1m(xi), ..., f1m(xi)) ∂fkm(xi)=I(yi=Gk)−pk(xi) 2.5. Algoritmo GBM Se presenta en esta sección el algoritmo del Gradient Boosting Machine. Se ha supuesto que el modelo base seleccionado son los árboles de decisión, un caso más general sería en el que se introdujera el modelo débil h(x, θ)a implementar. Se ha optado por presentar el algoritmo para una función de coste diferenciable arbitraria. El procedimiento a seguir con el objetivo de seleccionar el número de regiones terminales o tamaño de los árboles Jmy el número de iteraciones Ma realizar se comentará en la siguiente sección. Algoritmo Gradient Boosting Machine para regresión Datos de entrada: Datos de entrenamiento (xi, yi)N i=1 Número de iteraciones M Elección de la función de coste L(y, f(y)) Algoritmo: 1. Inicializar f0con una constante: f0=arg m´ınγPN i=1 L(yi, γ) 2. Desde m= 1 hasta M 10 CAPÍTULO 2. GRADIENT BOOSTING MACHINE 2.6. TAMAÑO IDEAL DE LOS ÁRBOLES Para i= 1, ..., N calcular rim ="∂L(yi, f(xi)) ∂f(xi)#f(xi)=fm−1(xi) Ajustar un árbol de regresión a los residuos generalizados rim calculando las regiones terminales Rjm,j= 1, ..., Jm. c θm=arg m´ın θ N X i=1 (−gim −T(x;θm))2 Para j= 1, ..., Jmcalcular γjm =arg m´ın γX xi∈Rjm L(yi, fm−1(xi) + γ) Actualizar la estimación de la función de predicción fm(x) = fm−1(x) + Jm X j=1 γjmI(x∈Rjm) 3. Fin. b f(x) = fM(x) 2.6. Tamaño ideal de los árboles Como ya ha sido comentado, el algoritmo GBM combina modelos débiles para construir el modelo final. El análisis desarrollado ha sido enfocado en el uso de árboles de decisión como modelos débiles. Así, al trabajar con estos, uno de los dilemas que surge es el de qué tamaño o profundidad de los árboles es el idóneo. Una de las maneras de abordar el problema sería determinar el tamaño de cada árbol por separado. Así, este procedimiento no se separaría del seguido en el caso de la construcción de un único árbol de decisión. Por tanto, uno de las posibilidades sería que, para cada nodo, únicamente se realizase una división en caso de que esta reduzca la impureza por encima de un cierto umbral. La impureza estima el nivel de homogeneidad en tanto a clases existente en un nodo, y puede ser medida a través de métricas como el índice de Gini o el error de clasificación. Sin embargo, con este procedimiento no se estaría teniendo en cuenta que, más allá de una división que a priori no es ventajosa, puede aparecer una divisón que reduzca considerablemente la impureza de los nodos resultantes. Así, una estrategia más adecuada sería la de construir un árbol T0, digamos de gran tamaño, y que el procedimiento secuencial de división de los nodos finalice cuando los nodos terminales alcancen un mínimo número de registros que deberá ser escogido por el usuario. Una vez se ha obtenido ese árbol T0, se definen los súbarboles T⊂T0, los cuales se obtienen podando T0. La poda de un árbol de decisión es un proceso que, con el objetivo de optimizar el coste y la complejidad del árbol, elimina ciertos nodos no terminales. Se define el criterio de coste de complejidad de la siguiente forma, CAPÍTULO 2. GRADIENT BOOSTING MACHINE 11 2.6. TAMAÑO IDEAL DE LOS ÁRBOLES Cα(T) = |T| X j=1 NjQj(T) + α|T| donde |T|es el número de nodos terminales del árbol, los cuales se indexan por j.Njes el número de observaciones en la región Rj, es decir, Nj=| {x∈Rj} |. Además se tiene que, Qj(T) = 1 NjX xi∈Rj L(yi, γj) donde se recuerda que γjes la constante asignada a esta región. La elección del parámetro α≥0debe de ser fruto de la compensación entre la reducción de la complejidad o tamaño del árbol y de su capacidad de ajuste a los datos. Obviamente, si α= 0, el resultado sería Tα=T0. El b αóptimo se puede estimar mediante técnicas de validación. Así, la idea es que una vez fijado α, se halle el subárbol Tα⊂T0que minimice la función Cα(T). La solución es única y una forma de encontrarla es la siguiente: se elimina sucesivamente el nodo interno que produce el menor incremento en PjNjQj(T)hasta llegar a tener un árbol con un solo nodo. Dentro esta secuencia de subárboles debe de estar Tα, que minimiza Cα(T). Sin embargo, este método, el cual es usado en la construcción de árboles de decisión, cuando se aplica al método GBM, no da buenos resultados. Esto es, en primer lugar, debido a que el número de árboles involucrado en este algoritmo es suficientemente grande como para que el costo computacional de este procedimiento sea alto. Además, se debe de tener en cuenta que en la construcción del modelo GBM, los árboles no son independientes entre sí, es decir, se ha tenido en cuenta el error cometido hasta ese momento con el conjunto de árboles utilizados, para determinar los parámetros de los siguientes árboles. Otra de las maneras de abordar el problema sería restringir el tamaño de todos los árboles. De esta forma en cada iteración se crea un árbol de Jnodos terminales: Jm=J∀m= 1,2, ..., M Aquí Mhace referencia al número de árboles usados. Así, Jse convierte en un hiperparámetro del modelo referente a la profundidad máxima que debe de ser determinado de forma el modelo tenga el mejor desempeño posible sobre los datos de los que se dispone. La elección de la profundidad máxima debería de tener en cuenta la complejidad de la relación entre las variables predictoras y la variable respuesta. Con este objetivo se define la función objetivo, donde el valor esperado es calculado sobre la distribución conjunta de (X, Y ). η=arg m´ın fEXY L(Y, f(X)) Esta representa la función óptima que se podría construir en caso de tener acceso a la población de estudio, no solo a una muestra. Esta es la función que se busca aproximar, siendo aquella con menor error de predicción sobre datos futuros. 12 CAPÍTULO 2. GRADIENT BOOSTING MACHINE 2.7. REGULARIZACIÓN Así, se debe de estudiar como interactúan las variables entre sí dentro de esta función η, para lo que se utiliza la expansión ANOVA, la cual realiza un análisis de la varianza. η(X) = X j ηj(Xj) + X jk ηjk(Xj, Xk) + X jkl ηjkl(Xj, Xk, Xl) + ... (2.7) El primer término de la suma es un sumatorio sobre funciones de una única variable predictora. Estas funciones ηj(Xj)son aquellas que conjuntamente mejor aproximan la función objetivo bajo el criterio de coste usado, las cuales se denominan como el “efecto principal” de Xj. El segundo término incluye funciones de dos variables, las cuales se conocen como interacciones de segundo orden de parejas de variables (Xi, Xj). La funciones de tres variables representan las interacciones de tercer orden y así sucesivamente. En la práctica, la mayoría de problemas tienen predominancia de efectos de interacción de órdenes bajos, por los que los árboles con una menor profundidad máxima (J) suelen tener una mayor capacidad de predicción que los árboles de decisión de gran tamaño, los cuales producen interacciones de órdenes mayores. Así, se limita el nivel de interacción de las variables predictoras con el valor de J, ya que no son posibles interacciones de orden que J−1(el número de nodos internos). Si se fija J= 2, el modelo solo contiene árboles de una única división y, por tanto, no se permiten interacciones entre las variables y solo se tienen en cuenta los efectos principales. Sin embargo, esta limitación será en algunos casos demasiado exagerada. En [11], se indica que aunque es cierto que seleccionar un valor de J= 2 es en muchos casos insuficiente, es muy poco probable que sea necesario escoger un valor J > 10, probándose en la práctica que 4≤J≤8funciona correctamente en la mayoría de casos, siendo pocos los cambios que se producen al cambiar el hiperparámetro dentro de este rango. Otra opción es ajustar de manera fina Jprobando diversos valores y seleccionando aquel que produzca menor error mediante técnicas de validación. Sin embargo, esto provoca una mejora insignificante comparada con la selección de un valor J∼ =6. 2.7. Regularización A la hora de construir un modelo de aprendizaje estadístico, se debe de tener claro que el objetivo principal a alcanzar es el de conseguir una capacidad notable de generalización sobre datos futuros. Es decir, uno de los problemas a evitar será el del sobreajuste, con el que se tiene un bajo error de predicción en los datos de entrenamiento, pero los resultados empeoran notablemente sobre datos futuros. Es por esto, por lo que se introducen a continuación algunas de las técnicas de regularización más usadas en el Gradient Boosting Machine. Con la regularización se busca limitar el riesgo de sobreajuste del modelo construido. Sin embargo, estas técnicas, en su mayoría, aumentarán el coste computacional de resolución del algortimo. Luego se deberá de llegar a un equilibrio que dé lugar a un modelo computacionalmente asumible que tenga una capacidad notable de generalización sobre datos futuros. CAPÍTULO 2. GRADIENT BOOSTING MACHINE 13 2.7. REGULARIZACIÓN 2.7.1. Velocidad de aprendizaje Uno de los mecanismos de regularización utilizado para controlar la complejidad del modelo construido es el escalado de la contribución de cada respuesta, que se conoce como velocidad de aprendizaje. La idea intuitiva detrás de esta técnica se puede captar a través de la Figura 2.1 recogida en [3]. Este mecanismo reduce como afecta al modelo final cada nueva iteración, si la velocidad de aprendizaje es muy baja, el algoritmo tendrá que realizar muchas iteraciones a la hora de alcanzar un mínimo; mientras que si por el contrario la velocidad de aprendizaje es muy alta, es posible que se sobrepase el mínimo y se acabe más allá de él. Figura 2.1: Posibles consecuencias en el descenso del gradiente para distintos valores de la velocidad de aprendizaje. Por tanto, en cada paso se añade un factor de escala 0< ν < 1, que penaliza la importancia de cada iteración, quedando la respuesta como fm=fm−1−νρmgm En [9] se recoge como empíricamente se demuestra que valores pequeños de νllevan a un menor error sobre el conjunto test. Esto, correspondientemente conllevará un aumento del número de iteraciones del modelo necesarias. Así, la estrategia más favorable será la de seleccionar un valor pequeño de la velocidad de aprendizaje y determinar el número de iteraciones mediante un criterio de parada temprana. Por tanto, el incoveniente de esta estrategia será un mayor coste computacional, ya que este dependerá del número de iteraciones, pero la mejora será significativa con respecto a los casos en los que no se introduzca el factor ν. 2.7.2. Criterios de parada temprana Además de determinar el tamaño máximo de los árboles involucrados Jo la velocidad de apredizaje ν, otro hiperparámetro a ajustar será el número de interacciones Mdel algoritmo GBM. Cada iteración del algoritmo, hace que se reduzca el error cometido según la función de coste sobre los datos de entrenamiento. Sin embargo, un gran número de iteraciones conllevan que aumente el riesgo de sobreajuste. Por tanto, todo induce a pensar que existe un número optimo de iteraciones M∗, que no haga empeorar la capacidad del modelo a generalizarse a nuevos datos. La elección del 14 CAPÍTULO 2. GRADIENT BOOSTING MACHINE 2.7. REGULARIZACIÓN mismo puede realizarse a través de la estimación del error de predicción para distintos M mediante técnicas de validación. Otra opción será la de usar criterios de parada temprana con el ímpetu de que el algoritmo no continúe iterando, antes de alcanzar las Miteraciones. Es decir, que el algoritmo siga iterando solo y cuando no se empeore el resultado al sustituir en la función de coste o no mejore por encima de un cierto umbral. Además, uno de las ventajas de utilizar criterios de parada temprana es que el número de iteraciones óptimo va a depender de la velocidad de aprendizaje seleccionada para el modelo, por lo que será práctico utilizar la parada temrpana en lugar de tener que determinar el número de iteraciones óptimo cada vez que se modifique la velocidad de aprendizaje. 2.7.3. Subsampling Otro de los posibles inconvenientes que afloran en este modelo es el de encontrar el mínimo global de la función de coste. No todas las funciones de coste serán convexas, por lo que mínimos locales o mesetas de la función donde el gradiente sea cercano al cero pueden dificultar está tarea. Así, se introduce el descenso del gradiente estocástico. Un desarrollo del mismo se puede enontrar en [9]. Este permite abordar el problema mediante el uso de un muestreo de parte de las observaciones en cada paso. Así, es una de las técnicas de regularización más simples, la cual mejora generalmente la capacidad de generalización del modelo a la vez que disminuye el tiempo de resolución del problema. En general, los mejores resultados se obtienen cuando se combina este método de subsampling junto con la introducción de la velocidad de aprendizaje. En cada iteración se toma una fracción ηde los datos de entrenamiento mediante una muestra aleatoria (típicamente sin remplazamiento) y se usa esta muestra para construir el siguiente árbol. Mediante este método se consigue que el algoritmo sea bastante más rápido, reduciéndose el tiempo de computación esta misma fracción η, y además se introduce una cierta aleatoriedad en el proceso de descenso del gradiente de la función de coste. Aunque esta aleatoriedad no permita al algoritmo encontrar la solución óptima, ayuda a que el algoritmo no quede enfrascado en mínimos locales y se consiga una solución subóptima cercana al mínimo absoluto. Cuando se trabaja con un gran número de datos, la literatura al respecto [16] indica que un η= 0.5produce en la mayoría de casos resultados satisfactorios, evitando el sobreajuste a la vez que introduce una cierta aleatoriedad en el proceso. Si se busca encontrar el valor óptimo, este puede ser estimado simplememnte mediante técnicas de validación, comparando la capacidad predictiva de modelos con distintos valores de η. En ocasiones, el uso de un mayor número de observaciones de la base de datos, lo que equivaldría a un ηcada vez mayor, produce una mejora de la capacidad de predición del modelo. Sin embargo, la mejora que se produce en cuanto a resultados es a menudo insignificante, por lo cual es conveniente plantear un mínimo incremento del rendimiento del modelo por debajo del cual no seguir aumentado el número de observaciones usadas. También hay ocasiones en las que es más eficiente combinar el uso de un fracción menor de las observaciones con un mayor número de iteraciones Mdel modelo, que construir el modelo con menos pasos y con un mayor porcentaje de la muestra de la que se dispone. CAPÍTULO 2. GRADIENT BOOSTING MACHINE 15 2.8. INTERPRETACIÓN DEL MODELO Además, en problemas de clasificación, cuando el conjunto de datos con el que se trabaja está desbalanceado en cuanto a las proporciones del número de observaciones de cada uno de los grupos, puede ocurrir que se tienda a sobreajustar la predicción a favor de los grupos mayoritarios, obteniéndose errores de clasificación en los datos test bastante altos. Una solución a este problema sería indicar la proporción de observaciones de cada clase a tomar en la selección aleatoria. Hay otros hiperparámetros que se pueden afinar dentro del descenso del gradiente estocático. Estas son otras variantes que involucran las variables predictoras usadas en la construcción del modelo, cuya repercusión en el modelo va a depender en gran medida de la naturaleza de los datos analizados. Su uso será aconsejable en problemas que presenten una alta multicolinealidad; o en casos en los que gran parte de las variables predictoras no son en realidad relevantes en la predicción. Algunas de estas son: Muestreo en las variables antes de crear cada árbol Muestreo en las variables antes de considerar cada división en cada árbol 2.8. Interpretación del modelo Una de los principales objetivos del aprendizaje estadístico o autónomo en la actualidad, es la interpretación de los modelos construidos y de las predicciones realizadas en base a estos. Hace años, cuando los modelos lineales ocupaban gran parte del análisis estadístico, las conclusiones que se inferían a partir de los mismos eran significativamente mas fácilmente explicables. En la actualidad, con técnicas como las redes neuronales o el Gradient Boosting Machine, la explicación de una decisión tomada a partir de un marco de trabajo en el que se han usado estos modelos es más díficil. Esto siempre traerá problemas a la hora de introducir estos métodos en ciertos ámbitos. Por ejemplo, difícilmente un médico podrá hacer uso de una predicción la cual no pueda interpretar ni explicar su origen. Así, en la práctica, es de gran utilidad contar con la capacidad de interpretar el modelo resultante. En el marco tratado en este trabajo, el modelo construido se basa en árboles de decisión como modelos base o débiles, los cuales sí que son altamente interpretables. Estos pueden ser representados por un gráfico bidimensional, un árbol binario. Sin embargo, cuando se conforma el modelo final, el cual es una combinación lineal de estos modelos débiles de la forma (2.2), se pierde gran parte de esta interpretabilidad. Sin embargo, aunque no se tenga una imagen visual tan clara como en el caso de los árboles de decisión, el resultado del algoritmo GBM puede ser interpretado y analizado mediante las herramientas adecuadas. Así, los modelos resultantes no son cajas negras totalmente opacas a su análisis, permitiendo extraer parte de las dependencias capturadas en el modelo. Se presentan a continuación varias de estas herramientas que permiten la interpretación del modelo GBM. 16 CAPÍTULO 2. GRADIENT BOOSTING MACHINE 2.8. INTERPRETACIÓN DEL MODELO 2.8.1. Importancia de las variables predictoras Una práctica habitual, también usada en árboles de decisión simples y bosques aleatorios, es la identificación de la importancia relativa de las variables predictoras. Esta es interesante a la hora de conocer las variables que realmente han sido determinantes a la hora de construir el modelo. Para un solo árbol de decisión T, este problema fue resuelto en el año 1983 por Breiman et al. [5], de forma que la relevancia de cada variable predictora Xlviene dada por: I2 l(T) = J−1 X t=1 bi2 tI(v(t) = l) Si se procede a analizar la expresión, salta a la vista como la suma se extiende sobre los J−1nodos internos, se recuerda que se consideraban Jnodos terminales a los que se llega tras sucesivas divisiones binarias. Es por esto por lo que se tienen J−1nodos internos. Para cada nodo interno, una de las variables predictoras es usada para realizar la partición de su región asociada en otras dos subregiones. Esta variable escogida es aquella que proporciona una mejora estimada maximal bi2 tpor encima de las divisiones que podrían ser realizadas con otras variables. Así, el cuadrado de la importancia relativa de una variable viene dada por la suma de estas mejoras al cuadrado de cada uno de los nodos internos en los que es elegida como variable divisora. Por tanto, si una variable no forma parte de las divisiones efectuadas en los nodos del árbol, su importancia relativa será cero. Como generalización, en el caso en el que se tenga una suma de árboles fM(x) = M X m=1 T(x;θm) la importancia relativa simplemente se calcula promediando sobre todos los árboles empleados: I2 l=1 M M X m=1 I2 l(Tm) Cabe notar que aquí se están expresando los cuadrados de las importancias relativas. Además, como estas son relativas, se suelen representar asignando un valor de 100 a la variable más relevante o mediante porcentajes. Sin embargo, mediante esta herramienta con la que se consigue determinar las variables más relevantes a la hora de realizar las divisiones en el modelo, no se explica como es la dependencia de estas con la variable respuesta. 2.8.2. Gráficos de dependencia parcial En este sentido, los gráficos de dependencia parcial o Partial Dependency Plots (PDPs) proporcionan una representación gráfica de como afecta una cierta variable predictora a la respuesta del modelo, marginalizando sobre el resto de variables. El inconveniente de estos, es que esta visualización estará limitada a lo sumo a una o dos variables. Es por CAPÍTULO 2. GRADIENT BOOSTING MACHINE 17 2.8. INTERPRETACIÓN DEL MODELO esto por estos gráficos proporcionarán una mayor explicabilidad en casos en los que la respuesta esté dominada por interacciones de órdenes bajos (2.7). A la hora de construir estos gráficos, se considera un subvector XSde l < p variables predictoras. Sea Cel conjunto complementario a S (S∪C={1, ..., p}). En general, una función dependerá de todas las variables predictoras f(X) = f(XS, XC)y se podría definir su dependencia parcial con respecto al conjunto XSde la siguiente forma fS(XS) = EXCf(XS, XC) Esto sería un promedio marginal de la función f, el cual podría proporcionar información sobre el efecto del subconjunto XSen la respuesta del modelo. Puede ser estimada por fS(XS) = 1 N N X i=1 f(XS, xiC) donde se han utilizado los valores XCque toman los datos de entrenamiento {x1C, ..., xNC }. Cabe notar que este cálculo referente a la dependencia parcial representa el efecto de las variables XSen la respuesta supuesto el efecto de los valores medios de las variables XC sobre f(X). Si se pretende obtener efecto de XSsobre la respuesta ignorando el efecto de las variables XCse debería de hacer uso de la siguiente expresión: f fS(XS) = E[f(XS, XC)|XS] Ambos cálculos, f fS(XS)yfS(XS)proporcionaran el mismo resultado únicamente en el caso de que XSyXCsean independientes. 2.8.3. SHAP Se presenta ahora un método que puede ser utilizado a la hora de explicar las predicciones individuales realizadas a través de modelos de clasificación. Este es el SHapley Additive exPlanations o SHAP, modelo explicatorio introducido al aprendizaje estadístico en primer lugar por Strumbelj y Kononenko [20] y desarrollado posteriormente con detalle por Lundberg y Lee [12] en el 2017. Este es un método general el cual puede ser usado para gran variedad de modelos, no es exclusivo del método discutido durante este trabajo y que usa como marco los valores Shapley desarrollados dentro de la teoría de juegos. A diferencia de los métodos expuestos anteriormente como la importancia de las variables o los gráficos de dependencia parcial, donde la interpretación del modelo se efectuaba a nivel global, el método SHAP permite interpretar la predicción efectuada sobre una observación individual. Básicamente, se explicará la predicción a la que se llega mediante las contribuciones de las distintas características. Los valores de Shapley [18], fundamento de este modelo, son un concepto propio de la teoría de juegos. Una introducción a los mismos se puede encontrar en [15]. Originalmente, fueron desarrollados por el matemático LLoyd Shapley en el 1953; con el ímpetu de distribuir de forma justa una recompensa entre una serie de jugadores. En el contexto del aprendizaje estadístico, los jugadores pasarían a ser las variables explicativas y la 18 CAPÍTULO 2. GRADIENT BOOSTING MACHINE 2.8. INTERPRETACIÓN DEL MODELO recompensa sería la decisión tomada por el modelo. Así, los valores de Shapely atribuyen una puntuación a cada variable basada en la importancia. En primer lugar, se introducen los valores Shapley: Dado un conjunto de variables explicativas F={1, .., p}, todas las variables en un determinado subconjunto S⊆Ftienen incidencia en el resultado, la cual se representa mediante una función de valor: val(S)∀S⊆F donde se establece que val(∅)=0. En el contexto de la teoría de juegos, Frepresenta el conjunto de jugadores, los cuales pueden formar ciertas coaliciones (S⊆F), que no son más que subconjuntos de jugadores que deciden trabajar juntos. Esta cooperación le permite alcanzar una ganancia conjunta (val(S)) y se establece que si los jugadores no cooperan, es decir, no se forman coaliciones, no se lográ ningún valor conjunto. Así, los valores de Shapley redistribuyen el valor total del modelo val(F)entre todas las características individuales, según cuanto “aportó” cada una al resultado final. Para ello, se basa en la contribución marginal promedio de cada variable explicativa en todas los posibles subconjuntos S. Específicamente, la contribución de una determinada variable dentro de una coalición viene dada por: △val(i, S) = val(S∪ {i})−val(S) y se promedia a lo largo de todos los S⊆F\ {i}. Así, los valores de Shapley miden la contribución de una determinada variable explicativa a través de la siguiente fórmula ϕval(i) = X S⊆F\{i} |S|(p− |S| − 1)! p!△val(i, S)(2.8) donde el coeficiente |S|(p−|S|−1)! p!se introduce para normalizar el resultado. Si se reformula el desarrollo anterior en el contexto de los modelos de predicción, la contribución de cada variable se mediría a través de la diferencia de la respuesta entre el modelo construido con y sin ella: △val(i, S) = fS∪{i}−fS Las siguientes cuatro propiedades de los valores Shapley son un intento de la axiomatización de la noción de “equidad”. Axioma de eficiencia: La suma de todas las contribuciones individuales debe ser igual al valor total generado por el conjunto completo de características. X i∈F ϕval(i) = val(F) Axioma del jugador inútil: Si añadir la característica i a cualquier subconjunto de características S no cambia el valor del resultado, entonces la contribución de esa característica según los valores de Shapley debe ser 0. Así, se asegura que el jugador que no aporta no es premiado. CAPÍTULO 2. GRADIENT BOOSTING MACHINE 19 3.3. ESTADÍSTICAS ANUALES Tabla 3.1: Jugadores con mayor número de torneos ganados en un año. jugador Año Aces_por_Partido DoblesFaltas_por_Partido Tasa_de_Break Partidos Victorias Torneos_Ganados Novak Djokovic 2015 5.75 1.67 33.41 69 66 9 Novak Djokovic 2011 4.42 1.72 40.97 60 58 8 Rafael Nadal 2013 2.85 1.45 33.18 53 49 7 Roger Federer 2006 6.58 1.38 33.57 65 61 7 Novak Djokovic 2016 4.00 2.71 33.24 58 52 6 Rafael Nadal 2010 3.60 1.53 30.01 60 54 6 Roger Federer 2004 8.20 2.39 31.81 46 42 6 Roger Federer 2005 7.98 1.98 31.79 54 51 6 Jannik Sinner 2024 7.46 2.04 29.82 56 51 5 Novak Djokovic 2014 6.74 1.58 30.82 57 50 5 Novak Djokovic 2023 7.16 3.11 31.44 44 41 5 Pete Sampras 1994 11.39 3.88 29.98 41 37 5 Rafael Nadal 2005 2.59 1.74 36.39 46 41 5 Rafael Nadal 2008 3.11 1.39 34.55 64 56 5 Roger Federer 2007 8.12 1.30 28.96 60 52 5 Roger Federer 2017 10.25 1.90 25.68 40 38 5 Andre Agassi 1995 4.39 2.22 36.42 51 45 4 Andy Murray 2016 6.83 2.57 33.16 58 50 4 Novak Djokovic 2012 5.60 1.81 35.81 67 58 4 Novak Djokovic 2013 6.36 1.61 33.04 61 52 4 3.3.1. Tendencias del deporte Gracias a que la base de datos construida al comienzo de esta Sección 3.3 contiene datos desde el año 1991, se puede estudiar la evolución de ciertos aspectos del tenis a lo largo del tiempo. Para ello, a partir de la base de estadísticas de los jugadores, se calcula el valor medio de cada una de las variables sobre todos los jugadores que participaron en torneos de Masters 1000 o Grand Slam en cada temporada. Con el afán de visualizar las diferencias entre los jugadores de alto nivel y lo que sería un competidor medio del circuito, se calcula también este resumen estadístico solo teniendo en cuenta registros de jugadores que ganaron al menos un torneo en aquel año. Estos serán los denominados ganadores durante esta sección. Una de las primeras cuestiones que uno se puede plantear es la cuestión del saque. Aunque influye la capacidad de resto que tenga el rival al que se enfrente el jugador, el saque puede ser mejorado con técnicas de entrenamiento. Así, la cuestión de si los mejores jugadores se caracterizan por un gran saque es pertinente. Luego, se puede representar la evolución del promedio de aces realizados por partido a lo largo de los años, tanto para el global de participantes como para los ganadores de torneo. 26 CAPÍTULO 3. CONSTRUCCIÓN DE UNA BASE DE DATOS 3.3. ESTADÍSTICAS ANUALES 6 8 10 1990 2000 2010 2020 Año Aces por Partido Tipo Ganadores Global Figura 3.1: Evolución del número de aces por partido entre los años 1991-2024. En la Figura 3.1 se observa que la variabilidad del promedio de aces por partido a lo largo del tiempo en el conjunto de los ganadores es muy notable, no detectándose ninguna tendencia clara de la serie de datos a simple vista. Tiene sentido, ya que el número de ganadores de torneos en un temporada es muy bajo, a lo sumo serán trece ganadores distintos, comparado con el total de participantes de torneos. Sin embargo, al realizar un ajuste lineal sobre los datos de los ganadores de torneo, no se rechazan las hipótesis de normalidad de los residuos ni la hipótesis de homocedasticidad (con un nivel de significación de 0,05) mediante los tests de normalidad de Shapiro-Wilk y de BreuschPagan, respectivamente. Por tanto, está justificada la inferencia sobre los parámetros desconocidos del modelo lineal. Así, al realizar el contraste de hipótesis H0:β1= 0 se obtiene un p-valor de 0.327, luego con el nivel de significación utilizado anteriormente no se puede rechazar la hipótesis de que el coeficiente asociado sea nulo. Es decir, no hay evidencias suficientes para sostener que el promedio de aces por partido en el conjunto de los ganadores varíe a lo largo de los años. Por otro lado, para el conjunto global de participantes, al realizar el ajuste lineal tampoco se rechazan las hipótesis sobre los residuos. En este caso, se rechaza la hipótesis de que el coeficiente asociado sea nulo, por lo que se puede sostener que sí hay un incremento del número de aces por partido a lo largo de los años en el global de los jugadores. Sin embargo, aunque el número de aces sea una de las estadísticas que reflejan de mejor manera el impacto del saque en el desarrollo del partido, otra estadística que puede proporcionar una visión clarificadora de como los jugadores dominan el partido mediante el saque es el porcentaje de juegos de saque ganados. CAPÍTULO 3. CONSTRUCCIÓN DE UNA BASE DE DATOS 27 3.3. ESTADÍSTICAS ANUALES Se puede estudiar esta tendencia, es decir, si los jugadores tienden a ganar cada vez un mayor número de juegos de servicio, o por el contrario la tasa de break es cada vez mayor en la Figura 3.2. Como anteriormente, se representa la tendencia tanto para el global de participantes como para los ganadores de torneo, con vistas a deducir si hay diferencias significativas entre grupos. En este caso, para ambos grupos no se rechazan las hipótesis de normalidad y homocedasticidad de los residuos al realizar el ajuste lineal. Así, al estudiar el contraste de hipótesis H0:β1= 0 para el coeficiente asociado al año, se rechaza la hipótesis en ambos casos de que este sea nulo. Por tanto, en este caso sí que se puede asegurar para ambos grupos que existe una clara tendencia ascendente del porcentaje de juegos de servicio ganados. Así, este hecho puede ser interpretado como un argumento de que el tenis evoluciona hacia un deporte mucho más igualado en el que la tasa de break tiende a disminuir. También queda claro como existe una diferencia notable sobre ambos grupos que se ha ido manteniendo a lo largo de los años. En el último año del que se tienen registros, el 2023, la media del porcentaje de juegos de servicio ganados entre los ganadores asciende hasta el 87% mientras que para el global de participantes es del 75%. 70 75 80 85 1990 2000 2010 2020 Año Porcentaje de Juegos de Servicio Ganados Tipo Ganadores Global Figura 3.2: Evolución del porcentaje de juegos de servicio ganados entre los años 19912024. 28 CAPÍTULO 3. CONSTRUCCIÓN DE UNA BASE DE DATOS Capítulo 4 Predicción del resultado de partidos El propósito de esta sección consistirá en la implementación de distintos modelos de predicción en R, con el ímpetu de llegar a predecir los resultados de partidos de tenis profesional. A primera vista, el ranking ATP ya explicado en la Sección 3.1.1 parece proporcionar una buena medida a la hora de predecir el ganador. Esto se debe a que, ya que el mismo se encuentra en una continua actualización, proporciona una buena medida del estado de forma del jugador. Luego, cabe esperar que los jugadores con un mejor ranking ganen una mayor proporción de partidos. A priori, la dificultad residirá en la capacidad de predecir las ocasiones en las que gane el jugador de peor ranking. Como ya fue comentado, se cuenta con un conjunto de datos conformado por unos 35000 partidos, el mismo que fue usado en la Sección 3.2. Para cada partido, como fue mencionado en aquella sección, se cuenta con una serie de variables referentes a las características del partido y otras variables descriptivas de cada uno de los jugadores, las cuales son conocidas previamente al partido. Obviamente, no se hará uso de las estadísticas registradas durante el propio partido, ya que no tiene sentido hacer uso de estas en una predicción. Las variables descriptivas, en vez de organizarse por ganador y perdedor, como en aquella sección, se asignarán a: Jugador 1. Jugador, entre ambos, con mejor ranking. Es decir, el jugador con el número de ranking más bajo. Jugador 0. Será el jugador con un peor ranking ATP. Además, con el ánimo de hacer uso de la base de estadísticas anuales por jugador que fue construida previamente, se realizarán dos predicciones del resultado del partido: 1. Una primera predicción en la que solo se hará uso de las variables referentes al partido y de las variables descriptivas de cada jugador, conocidas previamente al partido. Así, las variables recogidas en este caso son: Las referentes al partido: Nivel del Torneo,Ronda ySuperficie. Las propias de las características del jugador, y que se recogen para ambos jugadores: Mano Dominante,Altura,Edad yRanking. 29 4.1. ANÁLISIS DESCRIPTIVO DE LOS DATOS Por último se incluyen una serie de variables que recogen la diferencia de algunas características de ambos deportistas. Las diferencias se calculan como la entrada del Jugador 1 menos la del Jugador 0, para algunos registros: Diferencia Edad, Diferencia Altura,Diferencia Ranking yDiferencia Logaritmo Ranking. El porqué de la inclusión de esta última variable será comentado en páginas posteriores. 2. Otra predicción en la que, además de estas variables ya mencionadas, se hará uso de las estadísticas de la base de datos de la temporada anterior al año de celebración del partido, recogiéndose la diferencia entre los registros promedio de ambos jugadores. Las diferencias se vuelven a calcular como el registro del Jugador 1 menos el registro del Jugador 0. Esto se realiza para todos los registros mencionados en la Sección 3.3. Así, para todos los partidos de Grand Slam y Masters 1000 disputados en una temporada, se realizarán ambas predicciones, pudiendo analizar si la inclusión de las estadísticas promedio de la temporada anterior añaden capacidad de predicción al modelo. Un caso a tener en cuenta es aquel en el que uno de los jugadores no tiene ningún registro en el año anterior. Esto supone que no disputó ningún partido de Masters 1000 o Grand Slam durante la temporada previa. En ese caso, a tenor de la suposición de que un novato o un jugador que provenga de una lesión importante no tenga un gran nivel, se le asignarán lo que se entiende por “malas” estadísticas (por ejemplo, en cuanto a los Aces por Partido se le asinará el menor registro que se tenga en la base de datos del año previo, mientras que para las dobles faltas por partido se le asignará el máximo valor registrado). 4.1. Análisis descriptivo de los datos La predicción de los resultados estará centrada en los partidos disputados durante el año 2024, haciendo uso de las estadísticas por jugador referentes al año 2023. Un primer punto a tener en cuenta es la proporción de veces que resultó ganador el jugador con mejor ranking, para comprobar si es cierta la suposición de que estos ganan en un mayor número de veces. Tabla 4.1: Proporción de victorias por jugador en el año 2024. Jugador Victorias (%) 0 32.06 1 67.94 Así, se observa en la Tabla 4.1 como efectivamente en el 68% de los partidos disputados durante el año 2024, el Jugador 1 resultó ganador. Cabe recordar que este dato hace referencia únicamente a los partidos de Grand Slam y Masters 1000, que son los que están siendo incluidos en el estudio. Luego, uno de los objetivos de la predicción a implementar será superar este porcentaje de acierto que se obtendría si simplemente se asignase como ganador al jugador de mayor ranking. Se puede analizar además como evolucionan estos porcentajes a medida que avanza el nivel de las rondas. 30 CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 4.1. ANÁLISIS DESCRIPTIVO DE LOS DATOS Tabla 4.2: Proporción de victorias según el tipo de jugador en función de la ronda del torneo en el año 2024. Ganador Ronda 0 1 R128 33.09% (137) 66.91% (277) R64 32.55% (125) 67.45% (259) R32 28.85% (60) 71.15% (148) R16 27.88% (29) 72.12% (75) QF 40.38% (21) 59.62% (31) SF 34.62% (9) 65.38% (17) F 30.77% (4) 69.23% (9) Total 32.06 % (385) 67.94% (816) Cabe destacar de la Tabla 4.2 como el porcentaje de victorias del jugador con mejor ranking ATP aumenta a medida que se pasa de ronda, hasta llegar a los cuartos de final. Ahí, el porcentaje de victorias del Jugador 0 aumenta considerablemente hasta el 40%. 4.1.1. Gráficos boxplot En esta sección se representan los gráficos boxplot odiagramas de cajas y bigotes de las variables de estudio, Se tiene como fin visualizar de qué forma se distribuyen los datos usados para la predicción, según la variable categórica Ganador, que marca si ganó el partido el jugador con el mejor ranking ATP o no. Debido al gran número de variables utilizadas, solo se representarán estos gráficos para una colección de estas. En estos diagramas, la caja central representa el rango en el que se sitúan el primer cuartil y el tercero, y la línea central marca la mediana. Los puntos situados fuera de los bigotes son los considerados valores atípicos y son aquellas observaciones que quedan fuera del intervalo (Q1−1.5IQR, Q3+ 1.5IQR), donde IQR =Q3−Q1es el rango intercuartílico o caja y los Qson los cuartiles. Una infografía más detallada sobre las distintas partes de los mismos se puede econtrar en [14]. Se observa en la Figura 4.2 como, en la mayor parte de las variables representadas, en el caso en el cual el ganador resulta el Jugador 1, la diferencia entre los registros es mayor. Por ejemplo, si se fija la atención en la variable Diferencia Victorias, en el caso en el que gana el jugador con peor ranking, la mediana se sitúa en 5, es decir en el caso en el que Jugador 1 ganó 5 partidos más en la temporada anterior que el Jugador 0. Sin embargo, cuando el resultado es favorable para el jugador de mejor ranking, la mediana queda en 11 victorias de diferencia. CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 31 4.1. ANÁLISIS DESCRIPTIVO DE LOS DATOS 0 1 0 1 2 3 4 5 Diferencia_LogRanking Ganador 0 1 −20 0 10 20 30 Diferencia_Altura Ganador 0 1 −10 0 10 20 Diferencia_Edad Ganador 0 1 −15 −5 0 5 10 15 Diferencia_Aces_por_Partido Ganador Figura 4.1: Diagramas de cajas y bigotes para algunas de las variables utilizadas para la predicción. 0 1 −20 0 20 40 Diferencia_Partidos Ganador 0 1 −20 −10 0 10 20 30 Diferencia_Tasa_de_Break Ganador 0 1 −20 0 10 20 30 40 Diferencia_Victorias Ganador 0 1 −10 −5 0 5 10 15 Diferencia_Victorias_RondasFinales Ganador Figura 4.2: Diagramas de cajas y bigotes para algunas de las variables utilizadas para la predicción. El único caso distinto se da cuando se estudia la diferencia de edad entre los contrincantes. Ahora, el rango intercuartílico cuando el ganador es el Jugador 1 está desplazado hacia valores más negativos que lo que se observa para el caso contrario, con una mediana en -0.85. Este valor marca registros en los que el Jugador 1 es más joven que su rival. Si el que resulta ganador es el Jugador 0, la mediana está posicionada esta vez en valores 32 CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 4.1. ANÁLISIS DESCRIPTIVO DE LOS DATOS positivos. Es decir, en ambos casos la mediana se sitúa en posiciones en las que el ganador es más joven que su contrincante. 4.1.2. Matriz de correlaciones A continuación se representa la matriz de correlaciones de la base de datos utilizada para la predicción. Figura 4.3: Matriz de correlación para las variables predictoras. Se observa como las variables referentes a las victorias y las referentes a los partidos están altamente correlacionadas positivamente. Esto tiene sentido ya que jugar un gran número de partidos en estos torneos conlleva pasar de ronda, y por tanto ganar tantos partidos como rondas superadas. CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 33 4.2. MODELOS DE PREDICCIÓN También se encuentra una alta correlación entre las variables referentes al resto, como son las diferencias de break points forzados, puntos ganados por juego de resto o break points ganados, y en menor medida con la tasa de break. 4.2. Modelos de predicción Se comenzará por analizar los resultados obtenidos usando los árboles de clasificación como método predictivo. Aunque los resultados obtenidos mediante estos no son muy satisfactorios, servirán como una aproximación al siguiente modelo planteado, ya que los árboles de clasificación conforman el soporte del modelo GBM. 4.2.1. Árboles de decisión Las funciones implementadas en esta subsección forman parte del paquete rpart y rpart.plot. A la hora de realizar la predicción, se divide aleatoriamente el conjunto de datos en una muestra de aprendizaje y otra muestra test, con una proporción del 70% y del 30% respectivamente. En primer lugar se implementa la predicción sin el uso de estadísticas. Con el árbol se pretende explicar la variable objetivo de la clasificación usando a todas las demás variables como predictoras. El único parámetro modificado de la función de construcción del árbol es minbucket=20 que marca el mínimo número de observaciones en cualquier nodo terminal. Figura 4.4: Árbol de clasificación construido sin el uso de estadísticas anuales. 34 CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 4.2. MODELOS DE PREDICCIÓN En la Figura 4.4 se representa el árbol de clasificación obtenido. Cada uno de los rectángulos que se observan en la misma representa un nodo. Dentro del mismo se encuentran una serie de valores: la clase mayoritaria del nodo, el porcentaje de observaciones de la clase Ganador==1 y la proporción total de los registros que han sido agrupados bajo este nodo. Justo debajo de cada nodo interno se encuentra la regla utilizada para la división del mismo. Así, en el nodo raíz (inicial) se incluyen la totalidad de los datos de entrenamiento, de forma que si se clasifica según la regla “clase más frecuente”, se comete un error del 32% sobre los datos de entrenamiento, clasificasificándose todas las observaciones en “Jugador 1”. La primera división en nodos se produce con respecto a la diferencia del logaritmo del ranking. Luego, sin hacer uso de las estadísticas anuales se comete un error de entrenamiento del 28.33% y el error de tipo test es del 32.41%. Figura 4.5: Árbol de clasificación construido haciendo uso de la base de datos de estadísticas anuales por jugador. Si se incluyen las variables referentes a las diferencias de estadísticas de la temporada previa se obtiene el árbol representado en la Figura 4.5. En este caso la primera división se realiza con respecto a la diferencia de victorias conseguidas por ambos jugadores. Se recuerda que estas diferencias fueron calculados mediante la fórmula Diferencia_Victorias=Victorias1-Victorias0. Por tanto, con esta división se entiende que, sobre los datos de entrenamiento, cuando el jugador de mejor ranking obtuvo por encima de 13 victorias más que rival en la temporada previa, resulta ganador en el 83% de los casos. CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 35 4.2. MODELOS DE PREDICCIÓN Figura 4.8: Tasa de acierto sobre el conjunto test en función del umbral de predicción para el modelo GBM con subsampling. Una vez obtenidas las predicciones tanto haciendo uso de las estadísticas como no, se puede comparar la importancia de las variables predictoras en ambos casos. Ya que en el caso de la predicción con el uso de estadísticas se cuenta con un gran número de variables, se representan únicamente las variables con una importancia relativa mayor que 0.3. Figura 4.9: Importancia de las variables predictoras en el modelo GBM con subsampling haciendo uso de la base de datos de estadísticas anuales por jugador. 42 CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 4.2. MODELOS DE PREDICCIÓN En la Figura 4.9, se observa como la variable con mayor importancia ya no es la diferencia entre los logaritmos neperianos de los rankings, como ocurría en el caso en el que las estadísticas no eran incluidas. La variable que cuenta con una mayor importancia relativa a la hora de construir el algoritmo GBM en este caso es la diferencia entre partidos de rondas finales disputados, tal y como ocurría en la Figura 4.5 al implementar los árboles de clasificación con uso de estadísticas. Cabe recordar que solo se consideraban partidos de cuartos de final en adelante como partidos de rondas finales. Luego es únicamente un grupo selecto de jugadores los que al menos disputaron un partido de estas características en un Grand Slam o Master 1000 en la temporada previa (42 de los 212 jugadores). También destacan en importancia variables referentes a la edad de los jugadores y otras que hacen alusión al rendimiento del jugador en sus juegos de saque, como los de puntos de break salvados por partido, el porcentaje de retención de juegos de servicio o el porcentaje de puntos de segundo saque ganados. Una vez han sido identificadas las variables que adquieren mayor importancia a la hora de la predicción, se puede estudiar la dependencia que tiene la variable respuesta, el ganador del partido, con algunas de estas variables. Esto se puede conseguir a través de los Gráficos de Dependencia Parcial o Partial Dependency Plots (PDPs). 0 1 2 3 4 5 0.625 0.630 0.635 Diferencia_LogRanking mean_response −10 0 10 20 0.628 0.630 0.632 0.634 0.636 Diferencia_Edad mean_response Figura 4.10: Gráficos de dependencia parcial para la diferencia del logaritmo del ranking y la diferencia de edad. Así, se representan en la Figura 4.10 los gráficos de dependencia parcial para algunas variables. En el eje Y se representa la predicción promedio, es decir, la probabilidad promedio de que resulte ganador el jugador de mejor ranking, en función de los valores de la variable representados en el eje X. Como cabía esperar, a medida que aumenta la diferencia de logaritmos de ranking, se asigna una mayor probabilidad de victoria del Jugador 1. En cuanto a la edad, se puede entender que la respuesta otorga mayor probabilidad de victoria a menor edad del jugador (valores negativos de la diferencia de edad indican que el jugador de mejor ranking es más joven que su contrincante). Este hecho concuerda con lo observado en los gráficos de cajas y bigotes en el estudio descriptivo de los datos. También se puede obtener la contribución de las distintas variables en un caso en específico con el SHAP. En este caso en concreto, se trata de la Final de Wimbledon disputada en 2024 entre Carlos Alcaraz y Novak Djokovic, a los que separaba en aquel momento un único puesto en el ranking ATP. El ganador resultó ser Carlos Alcaraz, aunque llegara al partido con un ranking peor que el serbio. Es uno de los casos pertenecientos al conjunto CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 43 4.2. MODELOS DE PREDICCIÓN de datos test, concretamente uno de los pocos en el que el modelo GBM asigna al jugador de peor ranking como el ganador. Esto es debido a que la probabilidad de victoria otorgada a Novak Djokovic es del 55%, por debajo del umbral de discriminación marcado en la Figura 4.8. Si se presta atención a la Figura 4.11, se pueden observar las distintas contribuciones SHAP del modelo construido para esta observación en específico. Ciertas características de esta observación, como que fuera parte de un Grand Slam o el ranking del Jugador 1 fuera el 2, representan contribuciones positivas a la probabilidad de que Djokovic resultara el ganador. Sin embargo, hay otras que contribuyen a dar como ganador del partido a Carlos Alcaraz, restando probabilidad de que el Jugador 1 resultara el vencedor. Entre estas se encuentran: una diferencia nula de partidos de rondas finales disputados por ambos jugadores en la temporada previa, la edad de Carlos Alcaraz y la diferencia notable de edad entre ambos; y una tasa de puntos de segundo servicio ganados menor de Djokovic frente a la tasa de Alcaraz. Se debe de mencionar que en la Figura 4.11 se asigna al Jugador 1 como ganador. Esto es así debido a que el modelo realiza la predicción con el umbral de predicción que maximiza la métrica F1 con respecto a los datos test, mientras que en el presente caso de estudio se ha utilizado un umbral de predicción distinto para la construcción de las matrices de confusión. Diferencia_SegundoServicio_Ganado=−0.6772247 Diferencia_Partidos_RondasFinales=0 Diferencia_LogRanking=0.4054651 Diferencia_BP_Salvados_por_Partido=0.3672727 Diferencia_BP_Enfrentados_por_Partido=0.3063636 Diferencia_Edad=16 Edad0=21.1 Ranking0=3 Diferencia_PrimerServicio_Ganado=4.065738 Ronda=F Altura0=183 Diferencia_DoblesFaltas_por_Partido=0.7136364 Superficie=Grass Diferencia_Porcentaje_Aces=2.715806 Diferencia_PrimerServicio_Dentro=−1.750855 Diferencia_Victorias_Tiera=−1 Diferencia_TasaDeAcierto_BP_EnContra=3.05658 Diferencia_BP_Ganados_por_Partido=0.6890909 Ranking1=2 Nivel_Torneo=G −0.06 −0.04 −0.02 0.00 SHAP Contribution Feature SHAP explanation for "modelo_gbm_estadisticas_balanceado" on row 211 prediction: 1 Figura 4.11: Contribuciones SHAP en la predicción de la final de Wimbledon de 2024. Por último se pueden resumir los resultados obtenidos para las distintas variantes implementadas mediante el Gradient Boosting Machine durante el trabajo. Se recogen en la Tabla 4.10, donde las dos primeras filas de la misma hacen referencia a la tasa de acierto sobre el conjunto con el que se construye el modelo y sobre el conjunto de datos test. En 44 CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 4.2. MODELOS DE PREDICCIÓN la última fila se recoge la tasa de acierto en la clasificación de los partidos que ganó el jugador de peor ranking. Tabla 4.10: Tasa de acierto para los distintos modelos GBM construidos. Modelo inicial Modelo con estadísticas Modelo con estadísticas balanceado Entrenamiento 73.90 79.26 80.77 Test 71.01 69.38 71.34 Gana Jugador 0 15.12 17.44 20.93 4.2.3. Conclusiones A lo largo de este trabajo se ha explorado la viabilidad del uso de distintas técnicas de aprendizaje estadístico en la predicción de resultados deportivos. Concretamente, el análisis se ha centrado en el Gradient Boosting Machine. En primer lugar se comprobó como, implementando el modelo sin el uso de estadísticas, la predicción de resultados de la clase minoritaria no es tan satisfactoria, resultando complicado predecir las ocasiones en las que el ganador era el jugador de peor ranking. Por otro lado, se ha demostrado que la inclusión de las estadísticas de la temporada previa, mejora la capacidad de clasificación del modelo siempre y cuando se implementen junto a medidas de regularización. Así, mediante el empleo del subsampling se ha conseguido mejorar la tasa de acierto de clasificación, tanto en términos globales como para la clase minoritaria, demostrando la capacidad de esta técnica de mejorar los resultados en problemas de clasificación desbalanceados. Además, mediante técnicas de interpretación de modelos de aprendizaje estadístico, se ha conseguido extraer información sobre las variables más relevantes en la construcción del algoritmo, el efecto marginal de algunas variables predictoras en la respuesta y mediante el método SHAP se ha podido interpretar la predicción realizada para un partido en específico. Algunas posibles líneas futuras de trabajo podrían estar centradas en la mejora de la base de datos utilizada, permitiendo por ejemplo comparar diferencias de estadísticas durante disitintos periodos de tiempo, como podrían ser los diez últimos partidos disputados; incluir estadísticas sobre el historial del enfrentamiento cara a cara de los jugadores o implementar métricas distintas al ranking ATP que midan el rendimiento del jugador como podría ser el ELO usado en el ajedrez. CAPÍTULO 4. PREDICCIÓN DEL RESULTADO DE PARTIDOS 45 Apéndice A Apéndice: Código R implementado A.1. Construcción de una base de datos Librerías utilizadas. library(dplyr) library(readr) library(tidyr) library(ggplot2) library(reshape2) library(lmtest) Se importan los datos desde los archivos originales, creando un identificador para reconocer el año en el que se disputó el partido. Se seleccionan únicamente partidos de Grand Slam o Masters 1000. # Directorio donde están los archivos CSV directorio <- "D:/tennis_atp-master/atp_matches" # Años de los que se tienen datos años <- 1991:2024 # Se crea un data frame para almacenar los datos combinados datos_completos <- data.frame() # Bucle para leer los archivos de cada año y combinar los datos for (año in años) { # Se genera el nombre del archivo CSV para cada año archivo <- paste0(directorio, "/atp_matches_", año, ".csv") # Leer el archivo CSV datos <- read_csv(archivo) # Se añade una columna para identificar el año datos$año <- año # Se combinan los datos con el data frame completo 47 A.1. CONSTRUCCIÓN DE UNA BASE DE DATOS datos_completos <- bind_rows(datos_completos, datos) } # Solo partidos torneos de gran nivel (Masters 1000 o Grand Slam) datos_completos=datos_completos[datos_completos$tourney_level=="G" |datos_completos$tourney_level=="M", ] Se guarda por separado un conjunto de datos para los ganadores y los perdedores, con el objetivo de unirlos de nuevo por filas y así, para cada partido, tener las estadísticas organizadas por ganador y perdedor. jugadores=unique(union(datos_completos$winner_name, datos_completos$loser_name)) # Se crea un data frame para los ganadores y otro para los perdedores: # Para el ganador: ganadores <- datos_completos %> % select(jugador = winner_name, superficie=surface , nivel_torneo=tourney_level,mano_dominante=winner_hand, altura=winner_ht,edad=winner_age, mejor_de=best_of,ronda=round, minutos=minutes,aces = w_ace, dobles_faltas=w_df,primero_dentro=w_1stIn, primero_ganado=w_1stWon, segundo_ganado=w_2ndWon, saques = w_svpt, juegos_de_servicio=w_SvGms, juegos_de_resto=l_SvGms,saques_rival=l_svpt, primero_ganado_rival=l_1stWon, segundo_ganado_rival=l_2ndWon, bp_salvados=w_bpSaved, bp_enfrentados=w_bpFaced, bp_forzados=l_bpFaced, bp_noganados=l_bpSaved, rank=winner_rank,Año=año) %> % # Se crea una variable tipo que recoja si el jugador ganó el partido mutate(Tipo = "Ganador") # Para el perdedor: perdedores <- datos_completos %> % select(jugador = loser_name, superficie=surface , nivel_torneo=tourney_level, mano_dominante=loser_hand, altura=loser_ht,edad=loser_age, mejor_de=best_of,ronda=round, minutos=minutes,aces = l_ace, dobles_faltas=l_df, primero_dentro=l_1stIn, primero_ganado=l_1stWon, segundo_ganado=l_2ndWon, saques = l_svpt, juegos_de_servicio=l_SvGms, juegos_de_resto=w_SvGms, saques_rival=w_svpt, primero_ganado_rival=w_1stWon, segundo_ganado_rival=w_2ndWon, bp_salvados=l_bpSaved, bp_enfrentados=l_bpFaced, bp_forzados=w_bpFaced, bp_noganados=w_bpSaved, rank=loser_rank,Año=año) %> % mutate(Tipo = "Perdedor") 48 APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO A.1. CONSTRUCCIÓN DE UNA BASE DE DATOS # Se unen ambos data frames de ganadores y perdedores datos_jugadores <- bind_rows(ganadores, perdedores) Una vez se cuenta con el conjunto de datos ya organizado, para no omitir los partidos de los que se desconoce la duración, se sustituye esa cifra por la duración media de un partido. En el caso de que fuese un dato de otra de la variables el que faltara, se omite esa observación. Se crean un par de variables no recogidas en la base de datos importada. datos_jugadores <- datos_jugadores %> % # Hay muchos partidos sin datos de minutos mutate(minutos = if_else(is.na(minutos), mean(minutos,na.rm = TRUE), minutos)) %> % drop_na() %> % # Afecta solo al 2 % de los datos mutate(resto_ganados=saques_rival-primero_ganado_rivalsegundo_ganado_rival, bp_ganados=bp_forzados-bp_noganados) A continuación se pasa a determinar la estadísticas por temporada de cada uno de los jugadores que han participado en estos torneos. estadisticas_jugador <- datos_jugadores %> % group_by(jugador,Año) %> % # Se obtiene así una entrada por jugador reframe(# y temporada Aces_por_Partido=mean(aces), DoblesFaltas_por_Partido=mean(dobles_faltas), Porcentaje_Aces=Aces_por_Partido/mean(saques)*100, Porcentaje_DoblesFaltas=DoblesFaltas_por_Partido/mean(saques)*100, Ace_por_DobleFalta = if_else(DoblesFaltas_por_Partido==0, Aces_por_Partido,Aces_por_Partido/DoblesFaltas_por_Partido), PrimerServicio_Dentro=mean(primero_dentro)/mean(saques)*100, PrimerServicio_Ganado=mean(primero_ganado)/mean(primero_dentro)*100, SegundoServicio_Ganado=mean(segundo_ganado) /mean(saques-primero_dentro-dobles_faltas)*100, Porcentaje_Punto_de_ServicioGanado= mean(primero_ganado+segundo_ganado)/mean(saques)*100, PuntosPerdidos_por_Juego_de_Servicio=mean(saques-(primero_ganado+segundo_ganado))/mean(juegos_de_servicio), Porcentaje_de_Juegos_de_Servicio_Ganados=mean(juegos_de_serviciobp_enfrentados+bp_salvados)/mean(juegos_de_servicio)*100, Porcentaje_Punto_de_RestoGanado=mean(resto_ganados)/ mean(saques_rival)*100, PuntosGanados_por_Juego_de_Resto=mean(resto_ganados)/ mean(juegos_de_resto), Tasa_de_Break=mean(bp_ganados)/mean(juegos_de_resto)*100, BP_Enfrentados_por_Partido=mean(bp_enfrentados), BP_Enfrentados_por_Juego_de_Servicio=mean(bp_enfrentados) /mean(juegos_de_servicio), BP_Salvados_por_Partido=mean(bp_salvados), APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO 49 A.1. CONSTRUCCIÓN DE UNA BASE DE DATOS TasaDeAcierto_BP_EnContra=BP_Salvados_por_Partido/ BP_Enfrentados_por_Partido*100, BP_Forzados_por_Partido=mean(bp_forzados), BP_Forzados_por_Juego_De_Resto=mean(bp_forzados)/ mean(juegos_de_resto), BP_Ganados_por_Partido=mean(bp_ganados), TasaDeAcierto_BP_AFavor=BP_Ganados_por_Partido/ BP_Forzados_por_Partido*100, Partidos=n(), Victorias=sum(Tipo == "Ganador"), Porcentaje_Victorias = Victorias/Partidos *100, Partidos_PistaDura=sum(superficie=="Hard"), Victorias_PistaDura=sum(Tipo == "Ganador" &superficie=="Hard"), Porcentaje_Victorias_PistaDura = Victorias_PistaDura / Partidos_PistaDura *100, Partidos_Tierra=sum(superficie=="Clay"), Victorias_Tiera=sum(Tipo == "Ganador" &superficie=="Clay"), Porcentaje_Victorias_Tierra = Victorias_Tiera /Partidos_Tierra *100, Partidos_Hierba=sum(superficie=="Grass"), Victorias_Hierba=sum(Tipo == "Ganador" &superficie=="Grass"), Porcentaje_Victorias_Hierba = Victorias_Hierba / Partidos_Hierba *100, Partidos_RondasFinales=sum(ronda %in % c("QF","SF","F")), Victorias_RondasFinales=sum(Tipo == "Ganador" &ronda %in % c("QF","SF","F")), Porcentaje_Victorias_RondasFinales= Victorias_RondasFinales / Partidos_RondasFinales *100, Torneos_Ganados=sum(Tipo=="Ganador" &ronda=="F"), Año=Año )%> % distinct() %> % replace_na(list(Porcentaje_Victorias_PistaDura= 0, Porcentaje_Victorias_Tierra= 0, Porcentaje_Victorias_Hierba=0, Porcentaje_Victorias_RondasFinales=0, TasaDeAcierto_BP_AFavor=0)) %> % drop_na() #Solo afecta a 3 observaciones de 7076 Se presenta la tabla resumen de los jugadores con un mayor número de torneos ganados en una temporada. tabla <-estadisticas_jugador %> % arrange(desc(Torneos_Ganados)) %> % mutate_at(vars(-1), round, 2) knitr::kable(tabla[1:20,c(1:4,16,25,26,40)], format = "latex", caption = "Jugadores con mayor número de torneos ganados en un año.", booktabs = T) %> % kable_styling(latex_options = c("hold_position")) %> % 50 APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO A.1. CONSTRUCCIÓN DE UNA BASE DE DATOS kable_styling(position = "center")%> % kable_styling(latex_options = c("striped","scale_down")) %> % kable_styling(font_size = 8) Se realiza el resumen por año de las estadísticas, tanto para el global de participantes como para los ganadores de algún torneo. Se representa la evolución a lo largo del tiempo junto con un ajuste lineal para varias variables. resumen_global <- estadisticas_jugador %> % group_by(Año) %> % # Calcular la media de las columnas numéricas summarise(across(where(is.numeric), \(x) mean(x, na.rm = TRUE))) %> % mutate(Tipo="Global") resumen_global_ganadores <- estadisticas_jugador %> % filter(Torneos_Ganados>0)%> % # Que hayan ganado algún torneo group_by(Año) %> % # Calcular la media de las columnas numéricas summarise(across(where(is.numeric), \(x) mean(x, na.rm = TRUE))) %> % mutate(Tipo="Ganadores") resumen<-rbind(resumen_global,resumen_global_ganadores) ggplot(data = resumen, aes(x = Año, y = Porcentaje_Aces, group = Tipo, colour=Tipo)) + geom_point()+ geom_smooth(method = "lm")+ labs(x = "Año",y = "Aces por Partido")+ theme_bw() (reg1_global = lm( Aces_por_Partido~Año,data=resumen_global)) summary(reg1_global) shapiro.test(reg1_global$residuals) #No rechazo normalidad de residuos bptest(reg1_global) #No rechazo homocedasticidad (reg1_ganadores =lm(Aces_por_Partido~Año,data=resumen_global_ganadores)) summary(reg1_ganadores) shapiro.test(reg1_ganadores$residuals) #No rechazo normalidad de residuos bptest(reg1_ganadores) #No rechazo homocedasticidad ggplot(data = resumen, aes(x = Año, y = Porcentaje_de_Juegos_de_ Servicio_Ganados, group = Tipo, colour=Tipo)) + geom_point()+ geom_smooth(method = "lm")+ labs(x = "Año",y = "Porcentaje de Juegos de Servicio Ganados")+ theme_bw() APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO 51 A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS is.na(BP_Forzados_por_Juego_De_Resto0), min(BP_Forzados_por_Juego_De_Resto0, na.rm = TRUE)), BP_Ganados_por_Partido1=replace(BP_Ganados_por_Partido1, is.na(BP_Ganados_por_Partido1), min(BP_Ganados_por_Partido1, na.rm = TRUE)), BP_Ganados_por_Partido0=replace(BP_Ganados_por_Partido0, is.na(BP_Ganados_por_Partido0), min(BP_Ganados_por_Partido0, na.rm = TRUE)), TasaDeAcierto_BP_AFavor1=replace(TasaDeAcierto_BP_AFavor1, is.na(TasaDeAcierto_BP_AFavor1), min(TasaDeAcierto_BP_AFavor1, na.rm = TRUE)), TasaDeAcierto_BP_AFavor0=replace(TasaDeAcierto_BP_AFavor0, is.na(TasaDeAcierto_BP_AFavor0), min(TasaDeAcierto_BP_AFavor0, na.rm = TRUE)), Partidos1=replace(Partidos1, is.na(Partidos1), 0), Partidos0=replace(Partidos0, is.na(Partidos0), 0), Victorias1=replace(Victorias1, is.na(Victorias1), 0), Victorias0=replace(Victorias0, is.na(Victorias0), 0), Porcentaje_Victorias1=replace(Porcentaje_Victorias1, is.na(Porcentaje_Victorias1), 0), Porcentaje_Victorias0=replace(Porcentaje_Victorias0, is.na(Porcentaje_Victorias0), 0), Partidos_PistaDura1=replace(Partidos_PistaDura1, is.na(Partidos_PistaDura1),0), Partidos_PistaDura0=replace(Partidos_PistaDura0, is.na(Partidos_PistaDura0), 0), Victorias_PistaDura1=replace(Victorias_PistaDura1, is.na(Victorias_PistaDura1), 0), Victorias_PistaDura0=replace(Victorias_PistaDura0, is.na(Victorias_PistaDura0), 0), Porcentaje_Victorias_PistaDura1= replace(Porcentaje_Victorias_PistaDura1, is.na(Porcentaje_Victorias_PistaDura1), 0), Porcentaje_Victorias_PistaDura0= replace(Porcentaje_Victorias_PistaDura0, is.na(Porcentaje_Victorias_PistaDura0), 0), Partidos_Tierra1=replace(Partidos_Tierra1, is.na(Partidos_Tierra1), 0), Partidos_Tierra0=replace(Partidos_Tierra0, is.na(Partidos_Tierra0), 0), Victorias_Tiera1=replace(Victorias_Tiera1, is.na(Victorias_Tiera1), 0), Victorias_Tiera0=replace(Victorias_Tiera0, is.na(Victorias_Tiera0), 0), Porcentaje_Victorias_Tierra1=replace(Porcentaje_Victorias_Tierra1, is.na(Porcentaje_Victorias_Tierra1), 0), Porcentaje_Victorias_Tierra0=replace(Porcentaje_Victorias_Tierra0, is.na(Porcentaje_Victorias_Tierra0), 0), 58 APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS Partidos_Hierba1=replace(Partidos_Hierba1, is.na(Partidos_Hierba1),0), Partidos_Hierba0=replace(Partidos_Hierba0, is.na(Partidos_Hierba0),0), Victorias_Hierba1=replace(Victorias_Hierba1, is.na(Victorias_Hierba1),0), Victorias_Hierba0=replace(Victorias_Hierba0, is.na(Victorias_Hierba0),0), Porcentaje_Victorias_Hierba1=replace(Porcentaje_Victorias_Hierba1, is.na(Porcentaje_Victorias_Hierba1),0), Porcentaje_Victorias_Hierba0=replace(Porcentaje_Victorias_Hierba0, is.na(Porcentaje_Victorias_Hierba0),0), Partidos_RondasFinales1=replace(Partidos_RondasFinales1, is.na(Partidos_RondasFinales1),0), Partidos_RondasFinales0=replace(Partidos_RondasFinales0, is.na(Partidos_RondasFinales0),0), Victorias_RondasFinales1=replace(Victorias_RondasFinales1, is.na(Victorias_RondasFinales1),0), Victorias_RondasFinales0=replace(Victorias_RondasFinales0, is.na(Victorias_RondasFinales0),0), Porcentaje_Victorias_RondasFinales1= replace(Porcentaje_Victorias_RondasFinales1, is.na(Porcentaje_Victorias_RondasFinales1),0), Porcentaje_Victorias_RondasFinales0= replace(Porcentaje_Victorias_RondasFinales0, is.na(Porcentaje_Victorias_RondasFinales0),0), Torneos_Ganados1=replace(Torneos_Ganados1, is.na(Torneos_Ganados1), 0), Torneos_Ganados0=replace(Torneos_Ganados0, is.na(Torneos_Ganados0), 0) ) Se crean las diferencias de estadísticas entre los jugadores que se enfrentan. partidos_prediccion_estadisticas <- partidos_prediccion_estadisticas %> % select(-Jugador1) %> % select(-Jugador0) partidos_prediccion <- partidos_prediccion %> % select(-Jugador1) %> % select(-Jugador0) # Creo las diferencias de las estadísticas partidos_prediccion_estadisticas <- partidos_prediccion_estadisticas %> % mutate(Diferencia_Aces_por_Partido=Aces_por_Partido1-Aces_por_Partido0, Diferencia_DoblesFaltas_por_Partido=DoblesFaltas_por_Partido1DoblesFaltas_por_Partido0, Diferencia_Porcentaje_Aces=Porcentaje_Aces1-Porcentaje_Aces0, Diferencia_Porcentaje_DoblesFaltas=Porcentaje_DoblesFaltas1Porcentaje_DoblesFaltas0, Diferencia_Ace_por_DobleFalta=Ace_por_DobleFalta1-Ace_por_DobleFalta0, APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO 59 A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS Diferencia_PrimerServicio_Dentro=PrimerServicio_Dentro1PrimerServicio_Dentro0, Diferencia_PrimerServicio_Ganado=PrimerServicio_Ganado1PrimerServicio_Ganado0, Diferencia_SegundoServicio_Ganado=SegundoServicio_Ganado1SegundoServicio_Ganado0, Diferencia_Porcentaje_Punto_de_ServicioGanado= Porcentaje_Punto_de_ServicioGanado1Porcentaje_Punto_de_ServicioGanado0, Diferencia_PuntosPerdidos_por_Juego_de_Servicio= PuntosPerdidos_por_Juego_de_Servicio1PuntosPerdidos_por_Juego_de_Servicio0, Diferencia_Porcentaje_de_Juegos_de_Servicio_Ganados= Porcentaje_de_Juegos_de_Servicio_Ganados1Porcentaje_de_Juegos_de_Servicio_Ganados0, Diferencia_Porcentaje_Punto_de_RestoGanado= Porcentaje_Punto_de_RestoGanado1Porcentaje_Punto_de_RestoGanado0, Diferencia_PuntosGanados_por_Juego_de_Resto= PuntosGanados_por_Juego_de_Resto1PuntosGanados_por_Juego_de_Resto0, Diferencia_Tasa_de_Break=Tasa_de_Break1-Tasa_de_Break0, Diferencia_BP_Enfrentados_por_Partido=BP_Enfrentados_por_Partido1BP_Enfrentados_por_Partido2, Diferencia_BP_Enfrentados_por_Juego_de_Servicio= BP_Enfrentados_por_Juego_de_Servicio1BP_Enfrentados_por_Juego_de_Servicio0, Diferencia_BP_Salvados_por_Partido=BP_Salvados_por_Partido1BP_Salvados_por_Partido0, Diferencia_TasaDeAcierto_BP_EnContra=TasaDeAcierto_BP_EnContra1TasaDeAcierto_BP_EnContra0, Diferencia_BP_Forzados_por_Partido=BP_Forzados_por_Partido1BP_Forzados_por_Partido0, Diferencia_BP_Forzados_por_Juego_De_Resto= BP_Forzados_por_Juego_De_Resto1-BP_Forzados_por_Juego_De_Resto0, Diferencia_BP_Ganados_por_Partido=BP_Ganados_por_Partido1BP_Ganados_por_Partido0, Diferencia_TasaDeAcierto_BP_AFavor=TasaDeAcierto_BP_AFavor1TasaDeAcierto_BP_AFavor0, Diferencia_Partidos=Partidos1-Partidos0, Diferencia_Victorias=Victorias1-Victorias0, Diferencia_Porcentaje_Victorias=Porcentaje_Victorias1Porcentaje_Victorias0, Diferencia_Partidos_PistaDura=Partidos_PistaDura1-Partidos_PistaDura0, Diferencia_Victorias_PistaDura=Victorias_PistaDura1Victorias_PistaDura0, Diferencia_Partidos_Tierra=Partidos_Tierra1-Partidos_Tierra0, Diferencia_Victorias_Tiera=Victorias_Tiera1-Victorias_Tiera0, 60 APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS Diferencia_Partidos_Hierba=Partidos_Hierba1-Partidos_Hierba0, Diferencia_Victorias_Hierba=Victorias_Hierba1-Victorias_Hierba0, Diferencia_Partidos_RondasFinales=Partidos_RondasFinales1Partidos_RondasFinales0, Diferencia_Victorias_RondasFinales=Victorias_RondasFinales1Victorias_RondasFinales0, Diferencia_Porcentaje_Victorias_RondasFinales= Porcentaje_Victorias_RondasFinales1Porcentaje_Victorias_RondasFinales0, Diferencia_Torneos_Ganados=Torneos_Ganados1-Torneos_Ganados0 )%> % select(1:16,93:127)# Selecciono diferencias de estadísticas A.2.1. Análisis descriptivo de los datos En primer lugar se representan las tablas de proporción de victorias por tipo de jugador y según la ronda disputada en el 2024. tabla_proporcion<-prop.table(table(partidos_prediccion$Ganador)) %> % round(digits = 4)*100 tabla_proporcion <- as.data.frame(tabla_proporcion) colnames(tabla_proporcion) <- c("Jugador","Victorias ( %)") knitr::kable(tabla_proporcion,booktabs = TRUE,, align = "c" ,caption = "Proporción de victorias por jugador en el año 2024.") partidos_prediccion_estadisticas$Ronda <- factor( partidos_prediccion_estadisticas$Ronda, levels = c("R128","R64","R32","R16","QF","SF","F") ) tabla_ronda=partidos_prediccion_estadisticas %> % tabyl(Ronda,Ganador) %> % adorn_totals("row")%> % adorn_percentages("row")%> % adorn_pct_formatting(digits = 2)%> % adorn_ns() %> % adorn_title() knitr::kable(tabla_ronda,booktabs = TRUE,align = "c" ,caption = "Proporción de victorias según el tipo de jugador en función de la ronda del torneo en el año 2024.") Se representan los gráficos boxplot. APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO 61 A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS attach(partidos_prediccion_estadisticas) par(mfrow=c(2,2)) boxplot(Diferencia_LogRanking~Ganador,horizontal = TRUE,col="salmon") boxplot(Diferencia_Altura~Ganador,horizontal = TRUE,col="salmon") boxplot(Diferencia_Edad~Ganador,horizontal = TRUE,col="salmon") boxplot(Diferencia_Aces_por_Partido~ Ganador,horizontal = TRUE,col="salmon") par(mfrow=c(2,2)) boxplot(Diferencia_Partidos~Ganador,horizontal = TRUE,col="salmon") boxplot(Diferencia_Tasa_de_Break~Ganador,horizontal = TRUE,col="salmon") boxplot(Diferencia_Victorias~Ganador,horizontal = TRUE,col="salmon") boxplot(Diferencia_Victorias_RondasFinales~ Ganador,horizontal = TRUE,col="salmon") Y la matriz de correlaciones. par(mfrow=c(1,1)) detach(partidos_prediccion_estadisticas) corrplot(cor(partidos_prediccion_estadisticas[, sapply(partidos_prediccion_estadisticas, is.numeric)]),type = "upper",method="ellipse",tl.cex = 0.6) A.2.2. Modelos de predicción En primer lugar se construyen los árboles de clasificación tanto haciendo uso de las estadísticas como no. ### Árbol de clasificación sin uso de estadísticas set.seed(123)# Se fija la semilla utilizada indices1 <- sample(c(1:nrow(partidos_prediccion)), floor(0.70 *nrow(partidos_prediccion))) # Se dividen los datos en entrenamiento y test entrenamiento1 <- partidos_prediccion[indices1,] test1 <- partidos_prediccion[-indices1,] # Se fija el número de observaciones en nodo final controles<-rpart.control(minbucket = 20) datos.rpart <- rpart(Ganador ~., data=entrenamiento1, method="class",control=controles) # Se representa el árbol rpart.plot(datos.rpart,cex = 0.8) # Cálculo de las tasas de acierto 62 APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS tasa_acierto_ent1=100*mean(entrenamiento1$Ganador== predict(datos.rpart,newdata=entrenamiento1,type="class")) tasa_acierto_test1=100*mean(test1$Ganador== predict(datos.rpart,newdata=test1,type="class")) ### Árbol de clasificación con uso de estadísticas indices2 <- sample(c(1:nrow(partidos_prediccion_estadisticas)), floor(0.70 *nrow(partidos_prediccion_estadisticas))) # Se dividen los datos en entrenamiento y test entrenamiento2 <- partidos_prediccion_estadisticas[indices2,] test2 <- partidos_prediccion_estadisticas[-indices2,] datos.rpart_estadisticas <- rpart(Ganador ~., data=entrenamiento2, method="class",control=controles) # Se representa el árbol rpart.plot(datos.rpart_estadisticas,cex = 0.8) # Cálculo de las tasas de acierto tasa_acierto_ent2=100*mean(entrenamiento2$Ganador== predict(datos.rpart_estadisticas,newdata=entrenamiento2,type="class")) tasa_acierto_test2=100*mean(test2$Ganador== predict(datos.rpart_estadisticas,newdata=test2,type="class")) Por otro lado se realiza una predicción haciendo uso del algoritmo Gradient Boosting Machine. Es necesario, de forma previa, adaptar el conjunto de datos a la librería utilizada. # Se crea un cluster local con todos los cores disponibles. h2o.init( ip = "localhost", # -1 indica que se empleen todos los cores disponibles. nthreads = -1, # Máxima memoria disponible para el cluster. max_mem_size = "6g" ) datos_h2o <- as.h2o(x = partidos_prediccion, destination_frame = "datos_h2o") datos_h2o_estadisticas <- as.h2o(x = partidos_prediccion_estadisticas, destination_frame = "datos_h2o_estadisticas") particiones <- h2o.splitFrame(data = datos_h2o, ratios = c(0.6,0.15), seed = 123) particiones_estadisticas <- h2o.splitFrame(data = datos_h2o_estadisticas, ratios = c(0.6,0.15),seed = 123) # Se crea partición de entrenamiento, validación y test datos_train_h2o <- h2o.assign(data = particiones[[1]], APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO 63 A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS key = "datos_train_H2O") datos_val_h2o <- h2o.assign(data = particiones[[2]], key = "datos_val_H2O") datos_test_h2o <- h2o.assign(data = particiones[[3]], key = "datos_test_H2O") datos_train_h2o_estadisticas <- h2o.assign(data = particiones_estadisticas[[1]], key = "datos_train_H2O_estadisticas") datos_val_h2o_estadisticas <- h2o.assign(data = particiones_estadisticas[[2]], key = "datos_val_H2O_estadisticas") datos_test_h2o_estadisticas <- h2o.assign(data = particiones_estadisticas[[3]], key = "datos_test_H2O_estadisticas") # Se define la variable respuesta y los predictores. var_respuesta <- "Ganador" # Para este modelo se emplean todos los predictores disponibles. predictores <- setdiff(h2o.colnames(datos_h2o), var_respuesta) predictores_estadisticas <- setdiff(h2o.colnames (datos_h2o_estadisticas),var_respuesta) Se comienza por realizar la búsqueda en cuadrícula de los hiperparámetros óptimos para el modelo. hiperparametros <- list( learn_rate = c(0.01,0.1,0.5), max_depth = c(4,10,15) ) grid_gbm <- h2o.grid( # Algoritmo algorithm = "gbm", distribution = "bernoulli", # Variable respuesta y predictores y = var_respuesta, x = predictores, # Datos de entrenamiento training_frame = datos_train_h2o, # Datos de validación validation_frame = datos_val_h2o, # Detención temprana score_tree_interval = 5, stopping_rounds = 5, stopping_metric = "AUC", stopping_tolerance = 0.001, # Hiperparámetros fijados ntrees = 500, min_rows = 5, # Hiperparámetros optimizados 64 APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS hyper_params = hiperparametros, # Tipo de búsqueda search_criteria = list(strategy = "Cartesian"), seed = 123, grid_id = "grid_gbm" ) # Se ordenan los modelos construidos según el AUC resultados_grid <- h2o.getGrid( grid_id = "grid_gbm", sort_by = "AUC", decreasing = TRUE ) knitr::kable(data.frame(resultados_grid@summary_table) %> % select(-model_ids),booktabs = TRUE,align = "c",caption = " Grid search para la selección de hiperparámetros según AUC.") Se construye el modelo GBM sin uso de estadísticas y se construyen las matrices de confusión. modelo_gbm <- h2o.gbm( # Tipo de distribución (clasificación binaria) distribution = "bernoulli", # Variable respuesta y predictores y = var_respuesta, x = predictores, # Datos de entrenamiento training_frame = datos_train_h2o, # Datos de validación para estimar el error validation_frame = datos_val_h2o, # Número de árboles ntrees = 500, # Complejidad de los árboles max_depth = 4, min_rows = 5, # Aprendizaje learn_rate = 0.01, # Detención temprana score_tree_interval = 5, stopping_rounds = 3, stopping_metric = "misclassification", stopping_tolerance = 0.001, model_id = "modelo_gbm", seed = 124 ) APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO 65 A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS ### Obtención matriz confusión entrenamiento performance1_ent <- h2o.performance(model = modelo_gbm, newdata = NULL)# NULL usa training data # Se obtiene la tabla de métricas por threshold metrics_table1_ent <- h2o.metric(performance1_ent) # Se determina el umbral que maximiza accuracy threshold_max_accuracy1_ent <-metrics_table1_ent$threshold[ which.max(metrics_table1_ent$accuracy)] # Se obtiene la matriz de confusión para este umbral cm1_ent <- h2o.confusionMatrix(performance1_ent, thresholds = threshold_max_accuracy1_ent) # Análogo sobre datos de validación performance1_val <- h2o.performance(model = modelo_gbm, newdata = NULL,val=TRUE) metrics_table1_val <- h2o.metric(performance1_val) threshold_max_accuracy1_val <- metrics_table1_val$threshold[ which.max(metrics_table1_val$accuracy)] ### Obtención matriz confusión test predicciones1=h2o.predict(object = modelo_gbm, newdata = datos_test_h2o) performance1=h2o.performance(model = modelo_gbm, newdata = datos_test_h2o) metrics_table1 <- h2o.metric(performance1) threshold_max_accuracy1 <- metrics_table1$threshold[ which.max(metrics_table1$accuracy)] # El umbral utilizado es el obtenido mediante el conjunto de validación cm1 <- h2o.confusionMatrix(performance1, thresholds = threshold_max_accuracy1_val) # Matrices de confusión knitr:: kable(cm1_ent[,-4], caption = "Matriz de confusión del GBM con datos de entrenamiento.")%> % add_header_above(c(" ","Clasificación" =3)) %> % pack_rows(index = c("Clase real" =3)) knitr:: kable(cm1[,-4], caption = "Matriz de confusión del GBM con datos test.")%> % add_header_above(c(" ","Clasificación" =3)) %> % pack_rows(index = c("Clase real" =3)) Se representa el error de entrenamiento del modelo según el número de iteraciones. errores<-modelo_gbm@model[["scoring_history"]] [["training_classification_error"]] 66 APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO A.2. PREDICCIÓN DEL RESULTADO DE PARTIDOS iteraciones <- modelo_gbm@model[["scoring_history"]] [["number_of_trees"]] plot(iteraciones, errores, type = "b",pch = 19,col = "blue", xlab = "Número de árboles",ylab = "Error de Clasificación") Se presenta un gráfico de barras ordenado de la importancia de las variables en el modelo. p0 =ggplot(modelo_gbm@model[["variable_importances"]], aes(x=reorder(variable,scaled_importance), y=scaled_importance)) + geom_col(fill="blue")+ labs(y="Importancia relativa",x="Variables de predicción")+ scale_y_continuous(labels = scales::comma) + theme(axis.text.y = element_text(angle = 0,hjust = 1)) + coord_flip() p0 Se evalúa el modelo GBM ahora haciendo uso de la base de estadísticas anual. modelo_gbm_estadisticas <- h2o.gbm( # Tipo de distribución (clasificación binaria) distribution = "bernoulli", # Variable respuesta y predictores y = var_respuesta, x = predictores_estadisticas, # Datos de entrenamiento training_frame = datos_train_h2o_estadisticas, # Datos de validación para estimar el error validation_frame = datos_val_h2o_estadisticas, # Número de árboles ntrees = 500, # Complejidad de los árboles max_depth = 4, min_rows = 5, # Aprendizaje learn_rate = 0.01, # Detención temprana score_tree_interval = 5, stopping_rounds = 3, stopping_metric = "misclassification", stopping_tolerance = 0.001, model_id = "modelo_gbm_estadisticas", seed = 124 ) El proceso de obtención de las matrices de confusión es análogo al caso anterior. APÉNDICE A. APÉNDICE: CÓDIGO R IMPLEMENTADO 67 Bibliografía [14] Maura,Francisco J. Jácome (2025). Apuntes de Prácticas. Modelos Lineales y Diseño de Experimentos. [15] Mosca,Edoardo;Szigeti,Ferenc;Tragianni,Stella;Gallagher,Daniel yGroh,Georg (2022). «SHAP-Based Explanation Methods: A Review for NLP Interpretability». En: Proceedings of the 29th International Conference on Computational Linguistics, pp. 4593–4603. International Committee on Computational Linguistics, Gyeongju, Republic of Korea. [16] Natekin,Alexey yKnoll,Alois (2013). «Gradient boosting machines, a tutorial». Frontiers in Neurorobotics,Volume 7 - 2013. [17] Sackmann,Jeff (s).f.. «Tennis Data Repository». https://github.com/ JeffSackmann Recuperado el 28 de enero de 2025. [18] Shapley,L. S. (1953). 17. A Value for n-Person Games, pp. 307–318. Princeton University Press. [19] Shi,Wentao yJiang,Zhaoye (2024). «Enhancing Predictive Analytics with Gradient Boosting Machine: Insights from Tennis Match Prediction», pp. 647–651. [20] Strumbelj,Erik yKononenko,Igor (2010). «An Efficient Explanation of Individual Classifications using Game Theory». J. Mach. Learn. Res.,11, p. 1–18. 74