Imagen por Freepik
Python es uno de los lenguajes de programación más versátiles que existen. A lo largo de los años, la programación Python ha crecido hasta convertirse en el lenguaje de programación más popular para crear diversas aplicaciones de aprendizaje automático.
Un elemento clave de este tipo de aplicaciones suele ser la realización de algún tipo de predicción basada en los datos disponibles para su procesamiento. Las predicciones tienen la faceta de la incertidumbre que se aborda muy fácilmente utilizando la programación de Python.
Aquí, en este artículo, intentaremos abordar uno de esos problemas. Con la ayuda de la programación Python, intentaremos predecir los resultados de un partido de fútbol.
Dado que este problema implica un cierto nivel de incertidumbre, la programación en Python podría ser la mejor opción para estudiarlo y resolverlo. Y eso es exactamente lo que intentaremos lograr aquí.
El fútbol es un deporte que, como cualquier otro deporte, involucra múltiples elementos que son verdaderamente impredecibles por naturaleza.
Es bien sabido que los partidos de fútbol a menudo resultan ser diferentes de lo que uno hubiera esperado.
En tal escenario, predecir los ganadores de los partidos de fútbol se presenta como un desafío. Sin embargo, incluso si no podemos conocer los eventos de un partido en particular de antemano, podemos conocer los eventos que ocurrieron en los partidos anteriores.
Estos datos se convierten en el elemento clave para llevar a cabo una predicción exitosa cuando sea necesario. Esta es la base de un problema de ciencia de datos, estudiando las estadísticas de datos del pasado para predecir un futuro probable.
Por lo tanto, en este problema, basaremos nuestros resultados en los datos derivados de los partidos anteriores. Llevaremos a cabo un estudio estadístico sobre la base de los datos anteriores y predeciremos el ganador más probable en un partido de fútbol.
Para hacerlo, usaremos el aprendizaje automático supervisado para construir un algoritmo para la detección usando la programación de Python.
Este artículo tiene como objetivo realizar:
- Web-scraping para recopilar datos de partidos de fútbol pasados
- Aprendizaje automático supervisado utilizando modelos de detección para predecir los resultados de un partido de fútbol en función de los datos recopilados
- Evaluación de los modelos de detección
1. Raspado web
Web-scraping es el método para extraer datos relevantes de grandes cantidades de datos disponibles en diferentes sitios web en Internet.
La mayoría de los datos que se van a extraer no están estructurados y están en formato HTML. Estos datos se extraen de una manera que los convierte en estructurados y en forma de una lista de fácil acceso para procesar aplicaciones más adelante.
Para que el web-scraping se lleve a cabo con éxito, debemos limitar nuestra búsqueda a un sitio web que contenga datos sobre los partidos de fútbol en particular.
Una vez que se solucione, usaremos la URL del sitio web para obtener acceso al script HTML de la página principalmente.
Usando este código HTML, el raspador lo convertirá al formato de salida requerido según sea necesario (puede ser una hoja de cálculo, una lista o un archivo CSV/JSON, etc.).
Por el bien de este problema, llevaremos a cabo web-scraping de los datos disponibles en el sitio web: FBref.com
Los pasos a seguir pueden ser:
- Vaya a la sección “Concursos” del sitio web mencionado anteriormente.
- Seleccione cualquier competencia mencionada (como la Premier League 2022-23) cuyos resultados desea extraer para hacer predicciones.
- Vaya a la sección “Puntuaciones y partidos” en la sección de competición seleccionada.
Los puntajes se usarían para hacer predicciones, por lo que necesitaríamos raspar esa información. Por lo tanto, copie la URL de la página.
Para este caso (digamos, Premier League), el enlace sería: https://fbref.com/en/comps/9/schedule/Premier-League-Scores-and-Fixtures#sched_2022-2023_9_1
También puede obtener el enlace a alguna otra competencia según sea necesario.
- Sin embargo, cabe señalar que también podríamos usar cualquier otro sitio web para llevar a cabo la detección.
Por ejemplo, podríamos raspar los resultados de una coincidencia de la propia Wikipedia simplemente proporcionando el enlace a los puntajes de la coincidencia, como, https://en.wikipedia.org/wiki/2022_FIFA_World_Cup
- Para realizar el web-scraping real, la URL copiada debería proporcionarse al script o código de web-scraping para extraer los datos de coincidencia relevantes.
- El script se usaría para combinar todos los juegos de una temporada en una lista o un archivo .csv.
- La URL copiada de arriba se daría como entrada, junto con la identificación de las tablas que contienen información sobre el campeonato.
- La lista compilada que comprende todas las coincidencias se recibiría como salida.
- Se omite la información que no es necesaria, como los datos estadísticos del jugador.
- La información está restringida para contener solo datos del partido asignados a los datos del equipo para que se puedan hacer predicciones sobre qué equipo ganará.
- El resultado se adjunta para contener los datos sobre partidos y equipos (omitiendo la información específica del jugador) con la ayuda de un marco de datos.
Esta es principalmente la forma en que se realiza el web-scraping y los datos extraídos son los datos pasados sobre la base de los cuales se harán predicciones sobre los futuros ganadores.
Entendamos esto con la ayuda de los siguientes fragmentos de código:
Primero, importaremos las bibliotecas necesarias.
import pandas as pd
from bs4 import BeautifulSoup
import requests
A continuación, usaremos Beautiful Soup para crear una sopa para extraer el código HTML del sitio web.
url="https://en.wikipedia.org/wiki/2022_FIFA_World_Cup"
res = requests.get(url)
content = res.text
soup = BeautifulSoup(content, 'lxml')
Luego, extraeremos información de los partidos en base a la cual predeciríamos, por ejemplo, los datos de los partidos de la Copa Mundial de la FIFA.
match_data = soup.find_all('div', class_='footballbox')
A continuación, extraeremos los datos/puntuaciones de los equipos local y visitante.
for match in match_data:
home_team.append(match.find('th', class_='fhome').get_text())
score.append(match.find('th', class_='fscore').get_text())
away_team.append(match.find('th', class_='faway').get_text())
Finalmente, almacenaremos los datos en un DataFrame para exportarlos a un archivo .csv.
dict_football = {'home_team': home_team, 'score': score, 'away_team': away_team}
df_football = pd.DataFrame(dict_football)
df_football.to_csv("fifa_worldcup_data.csv", index=False)
2. Preprocesamiento de datos
Se vuelve crucial procesar los datos antes de ejecutar modelos de detección reales en ellos. Por lo tanto, haremos lo mismo en este escenario también.
Los pasos incluyen la creación de una variable para almacenar el valor medio de los puntajes ganados en partidos anteriores.
Esto se debe a que la detección solo se puede realizar en los datos que ya están disponibles para nosotros, ya que no tenemos acceso a ningún dato futuro.
Calcularemos la media de las diferentes variables almacenando información sobre los partidos de la temporada.
Junto con esto, también almacenaremos promedios móviles para varias otras variables.
Los puntajes de un equipo se sumaron con cada victoria cuantificada como 3, un punto de empate como 2 y una derrota como 1. Estos valores se usaron para sumar todos los puntajes de un equipo en los últimos partidos.
A continuación, para asegurarnos de que se hace la distinción entre el equipo local y el equipo visitante, podemos hacer los cálculos apropiados.
Sin embargo, para este caso, podemos suponer que los resultados deben obtenerse para la Copa Mundial de la FIFA.
Dado que el torneo comprende partidos en campo neutral, podemos ignorar el concepto de equipo local y equipo visitante en este caso particular.
Si es necesario considerarlos, debemos tener en cuenta restar los resultados del equipo local de los del equipo visitante para verificar si el equipo local es superior o no al equipo visitante.
3. Implementación de modelos de predicción
Para llevar a cabo la detección real, podemos utilizar diferentes tipos de modelos de predicción. En este caso, consideraremos 3-4 modelos para implementar la predicción real. Los modelos que se consideran aquí para la predicción son los siguientes:
Distribución de veneno
La distribución de Poisson es un algoritmo de predicción que se utiliza para detectar qué tan probable es un evento definiendo la probabilidad dentro de un intervalo fijo y teniendo una tasa media constante.
Una distribución de Poisson predice cuántas veces puede ocurrir un evento en un intervalo particular. Esto significa que ayuda a proporcionar una medida de la probabilidad de un evento, en lugar de un simple resultado probable o no probable.
Esta es la razón por la que es adecuado para problemas de clasificación múltiple en general, pero también funciona para problemas binarios (considerando las dos clases como las clases múltiples en el conjunto de datos).
Los fragmentos de código utilizados para la implementación son los siguientes:
Definición de una función “predecir” para calcular puntos para el equipo local y el equipo visitante.
def predict(home_team, away_team):
# Calculate the value of lambda (λ) for both Home Team and Away Team.
if home_team in df_football.index and away_team in df_football.index:
lambda_home_team = df_football.at[home_team,'GoalsScored'] * df_football.at[away_team,'GoalsConceded']
lambda_away_team = df_football.at[away_team,'GoalsScored'] * df_football.at[home_team,'GoalsConceded']
Luego, use la fórmula para la distribución de Poisson para calcular el valor de “p” como se puede ver a continuación.
Este valor se utiliza luego para calcular las probabilidades respectivas de empate (pr_draw), equipo local como ganador (pr_home) y equipo visitante como ganador (pr_away).
p = poisson.pmf(x, lambda_home_team) * poisson.pmf(y, lambda_away_team)
if x == y:
pr_draw += p
elif x > y:
pr_home += p
else:
pr_away += p
Los puntos tanto para el equipo local como para el equipo visitante se calculan por separado y luego se usan para hacer la predicción final.
points_home_team = 3 * pr_home + pr_draw
points_away_team = 3 * pr_away + pr_draw
Así es como podemos hacer una predicción básica para el ganador de un partido de fútbol con la ayuda de un modelo de aprendizaje automático (en este caso, la distribución de Poisson).
Este enfoque particular también se puede extender a otros modelos simplemente cambiando la fórmula del modelo predictivo en consideración.
Luego, el resultado final se evaluaría para diferentes modelos en forma de un estudio comparativo para garantizar que obtengamos los mejores resultados utilizando el modelo más apropiado disponible.
Echemos un breve vistazo a los otros modelos que también podemos usar para hacer una predicción similar.
Máquinas de vectores soporte
SVM o Support Vector Machine es un algoritmo basado en el aprendizaje automático supervisado.
Se utiliza principalmente para problemas de clasificación. Clasifica creando un límite entre los distintos tipos de datos.
Dado que funciona como una separación entre dos entidades de datos, se puede considerar principalmente como una solución de clasificación binaria.
Pero también se puede modificar o extender a clasificaciones de clases múltiples.
Para realizar una predicción SVM usando programación Python, podemos usar lo siguiente:
svc_predict = svm.SVC()
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.30)
svc_predict.fit(x_train, y_train)
Aquí, svc_predict es el cálculo de SVM para los datos de entrenamiento indicados como x_train e y_train aquí. X_train e y_train comprenden los datos con los que se entrena el modelo, mientras que x_test e y_test denotan los datos con los que se prueba el modelo.
KNN
K-Nearest Neighbors o KNN es un algoritmo que también se basa en el aprendizaje automático supervisado.
Realiza la clasificación de datos con la ayuda de etiquetas de clase. Básicamente, las clases están etiquetadas para crear una separación.
Cada entidad de datos perteneciente al mismo tipo tiene la misma etiqueta de clase.
Para los casos de regresión, la predicción se realiza tomando el promedio de los vecinos más cercanos “K”.
La distancia entre vecinos suele ser la distancia euclidiana entre ellos.
Sin embargo, cualquier otra métrica de distancia también podría usarse para lo mismo.
knn_predict = KNeighborsClassifier()
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.30)
knn_predict.fit(x_train, y_train)
Regresión logística
La regresión logística es un modelo lineal para problemas de clasificación binaria.
Se puede usar para hacer predicciones sobre la probabilidad de un evento y es por eso que lo usamos para el caso.
En el caso de una regresión logística, la variable dependiente está acotada en el rango entre 0 y 1.
Esta es la razón por la que funciona bien para problemas de clasificación binaria, como un escenario de ganar o perder en un partido de fútbol.
logistic_predict = LogisticRegression()
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.30)
logistic_predict.fit(x_train, y_train)
4. Evaluación de resultados usando métricas
Para evaluar los resultados obtenidos mediante el uso de diferentes modelos, podemos usar métricas para mapear qué modelo funcionó mejor que el resto.
Aquí, podríamos calcular la precisión para determinar la calidad del rendimiento de los modelos. La fórmula para el mismo podría establecerse de la siguiente manera:
Precisión = (Verdaderos positivos + Verdaderos negativos) /
(Verdaderos positivos + Falsos negativos + Verdaderos negativos + Falsos positivos)
Un verdadero positivo es un resultado positivo predicho correctamente. De manera similar, un verdadero negativo es un resultado negativo predicho correctamente.
Un falso negativo es un resultado negativo mal predicho. Del mismo modo, un falso positivo es un resultado positivo mal previsto.
Para verificar la precisión, necesitamos comparar los resultados previstos con los resultados reales. Así es como podemos verificar qué modelo hace una predicción que es la más cercana al resultado real.
El problema en particular era complejo y aun así pudimos lograr el resultado fácilmente con la ayuda de la programación Python.
Aunque los resultados no son absolutamente precisos, el algoritmo aún muestra cómo la programación de Python está cambiando el mundo todos los días.
El algoritmo puede predecir los resultados lógicamente con facilidad, una tarea que, quizás, los humanos no pueden lograr sin información previa sobre los juegos.
Usando tales modelos de predicción, podemos ajustarlos y lograr resultados aún mejores en el futuro.
Espero que haya entendido cómo predecir los datos mediante Python y el aprendizaje automático. Puede obtener más información sobre python en recursos gratuitos como KDnuggets, Escaladoro freecodecamp.
¡Feliz aprendizaje!
Vaishnavi Amira Yada es un escritor de contenido técnico. Tiene conocimiento de Python, Java, DSA, C, etc. Se encontró escribiendo y le encantó.