Ejercicio: Creación de un modelo de Machine Learning basado en los datos del jugador

Completado

Nuestro objetivo consiste en usar los datos que tenemos sobre cada jugador del equipo de los Looney para tomar decisiones rápidas durante un partido. Sabemos que queremos usar el valor de PER porque es una medida por minuto de la productividad del jugador en la cancha. Aunque en el baloncesto profesional el valor de PER se calcula para los jugadores en función de su rendimiento durante toda la temporada, podemos usar el PER como una representación laxa del rendimiento del jugador en un solo partido. Para usarlo de esta manera, necesitaremos las siguientes estadísticas para cada jugador:

  • TS%: porcentaje de tiros del jugador, que tiene en cuenta los tiros libres y los triples
  • AST: porcentaje de las posesiones de un jugador que acaban en una asistencia
  • TO: porcentaje de las posesiones de un jugador que acaban en una pérdida de balón
  • USG: número de posesiones que un jugador usa en 40 minutos
  • ORR: tasa de rebotes en ataque de un jugador
  • DRR: tasa de rebotes en defensa de un jugador
  • REBR: porcentaje de tiros fallados que un jugador rebota

Nota

Técnicamente, el valor de PER también usa las estadísticas de partidos jugados y de minutos por partido de un jugador. Dado que esas estadísticas abarcan varios partidos, las dejaremos fuera.

No disponemos de un partido real para seguir, ya que la película no se estrenará hasta el verano de 2021. Aun así, podemos simular un partido si usamos operaciones matemáticas.

Emplearemos la desviación estándar de las estadísticas de los jugadores para simular cómo sería su rendimiento en un partido. Dado que no disponemos de datos de varios partidos para los jugadores, tomaremos la desviación estándar de cada estadística para los jugadores que tenemos.

Lógicamente, este enfoque no nos proporcionará una idea precisa de cuál sería el rendimiento previsible de los jugadores en un partido real, pero podemos usar estos datos para cumplir nuestro objetivo principal: aprender cómo podemos usar la ciencia de datos en un escenario real.

Cuando finalice este módulo, podrá usar estadísticas reales del jugador y del partido para probar si este enfoque es efectivo en el mundo real.

Para facilitar este proceso, vamos a crear una serie de pandas de búsqueda para las desviaciones estándar de cada estadística. Una serie es básicamente un DataFrame de una sola columna. Establezca los nombres de las estadísticas como el índice de la serie para facilitar su búsqueda más adelante.

# Create a list of only the column names we are interested in.
game_stat_cols = list(ts_df.iloc[:, 7:-1])
game_stat_stdevs = []

# Create a list of standard deviations for each stat.
for stat in game_stat_cols:
    game_stat_stdevs.append(ts_df[stat].std())

# Create a Series of the standard deviations, with the stat names as the index.
stdev_s = pd.Series(game_stat_stdevs, index=game_stat_cols)
stdev_s
TS%     0.008805
AST     2.122891
TO      0.898795
USG     1.832257
ORR     1.100833
DRR     2.947654
REBR    1.906786
dtype: float64

Con esta serie, podemos ejecutar una simulación de los datos del jugador. Queremos comprobar si, según nuestras suposiciones generales, el valor de PER de un jugador puede ayudarnos a tomar decisiones sobre este. ¿Debemos concederle un descanso para beber? ¿Debemos mantenerlo en el partido?

Entrenamiento de un modelo de Machine Learning basado en los datos del jugador

Para entrenar un modelo de Machine Learning con el fin de predecir el valor de PER de un jugador por medio de estadísticas específicas del jugador para un partido simulado, usaremos todos los datos que descargamos inicialmente, incluidos los datos del jugador humano. Para ello, es necesario dividir los datos en dos partes:

  • X: datos de entrada que usamos para predecir y.
  • y: valor de salida que quiere que el modelo de Machine Learning prediga.

Los datos de entrada (X) son todos los datos que quiere que el modelo de Machine Learning use para predecir la salida (y). En este caso, queremos que X represente las siete columnas en las que estamos especialmente interesados. Los datos de salida (y) son el número que queremos predecir cuando se tienen en cuenta todas las columnas de X. En nuestro caso, y será PER. Para crear estas dos variables, solo necesitamos tomar las últimas ocho columnas, menos la última columna, y usarlas para X. Tomaremos solo la última columna para usarla para y.

# Import the models and libraries we need.
from sklearn.linear_model import LinearRegression
from numpy.random import randn

# Get the dependent and independent variables for modeling the PER.
X = player_df_final.iloc[:, 7:-1].to_numpy()
y = player_df_final.iloc[:, -1]

Después, debemos entrenar (o ajustar) el modelo de Machine Learning. Estamos usando la biblioteca LinearRegression de scikit-learn, que es un modelo de Machine Learning de regresión lineal prediseñado que aprenderá automáticamente a predecir y en función de X. Para obtener más información sobre cómo funciona este entrenamiento, puede consultar la serie de vídeos de introducción para desarrolladores a la de ciencia de datos y otros módulos de Microsoft Learn sobre la ciencia de datos.

# Define and fit the model.
lin_reg = LinearRegression()
lin_reg.fit(X, y)

Este código nos proporciona un modelo de Machine Learning (lin_reg) que se puede usar para predecir el valor de PER en función de un conjunto con las siete estadísticas de entrada que usamos para entrenar el modelo (TS%, AST, TO, USG, ORR, DRR y REBR).

Prueba de un modelo de Machine Learning con números aleatorios en función de la desviación estándar

Después de ajustar el modelo, podemos usarlo para predecir el valor de PER de un jugador en función de los nuevos datos de las siete columnas. Vamos a explorar cómo funciona este modelo. Podemos usar el modelo para predecir el valor de PER de los datos aleatorios de los jugadores en más de diez iteraciones.

Para cada iteración, debe llevar a cabo los pasos siguientes:

  1. Cree un DataFrame vacío que contenga solo los nombres de los jugadores.
  2. Para cada estadística de un jugador, genere un número aleatorio dentro de la desviación estándar de ese jugador para esa estadística.
  3. Guarde el número generado de forma aleatoria en el DataFrame.
  4. Prediga el valor de PER de cada jugador en función del nuevo DataFrame de los números generados de forma aleatoria.
  5. Imprima cada iteración, con el jugador con el PER más bajo y el jugador con el PER más alto.
# Print the player with the highest and lower PER for each iteration.
print('Iteration # \thigh PER \tlow PER')

# Run the simulation 10 times.
for i in range(10):

    # Define an empty temporary DataFrame for each iteration.
    # The columns of this DataFrame are the player stats and the index is the players' names.
    game_df = pd.DataFrame(columns=game_stat_cols, index=list(ts_df['player_name']))
    
    # Loop through each stat.
    for stat in game_stat_cols:
        
        # Each player's stats are used to generate a random value for each iteration.
        game_df[stat] = list(ts_df[stat] + randn(len(ts_df)) * stdev_s[stat])
    
    # Use the fitted model to predict players' PERs based on the randomized data.
    game_df['PER'] = lin_reg.predict(game_df)

    # Print the player with the highest and lower PER for each iteration.
    print('Iteration {}'.format(i+1) + ' \t' + game_df['PER'].idxmax() + ' \t' + game_df['PER'].idxmin())

Este es el resultado:

N.º de iteración PER alto PER bajo
Iteración 1 Piolín Correcaminos
Iteración 2 Piolín Marvin
Iteración 3 Lola Bunny Marvin
Iteración 4 Piolín Penélope
Iteración 5 Lola Bunny El Demonio de Tasmania
Iteración 6 Lola Bunny Correcaminos
Iteración 7 Lola Bunny Penélope
Iteración 8 Lola Bunny Penélope
Iteración 9 Piolín Penélope
Iteración 10 Elmer Gruñón Penélope

Nota

Los datos serán diferentes de los que se muestran aquí, porque cada vez que se ejecuta este código, se genera un número aleatorio dentro de la desviación estándar para cada columna de estadísticas pertinente. Si es idéntico, es por pura suerte.

Nuestra metodología proporciona una variedad de resultados que están en línea con lo que se puede esperar en función de las estadísticas: Lola es probablemente uno de los mejores jugadores, según el valor de PER.

Por lo tanto, si tuviéramos datos del partido, en lugar de valores aleatorios basados en la desviación estándar, sería factible introducir los datos en este modelo de Machine Learning y determinar qué jugador debe tomarse un descanso para beber (el jugador con el PER más bajo) y cuál debe continuar en el partido (el jugador con el PER más alto).

A medida que el partido continúe, las estadísticas de cada jugador cambiarán. Si vemos que el valor de PER de un jugador con el PER alto empieza a bajar, podríamos considerar la posibilidad de darle un descanso para beber. Un menor valor de PER probablemente significa que el jugador está cansado.

© 2021 Warner Bros. Ent. Todos los derechos reservados