UD05 · EX2 — Previsión del valor de mercado de jugadores¶
Como hemos visto en teoría, los sistemas mixtos de conocimiento humano/ml son muy poderosos. En este caso, veremos cómo prever el valor de mercado de los jugadores emergentes utilizando reglas definidas por nosotros y luego usar un modelo ML para predecir el valor de mercado de los jugadores. Esta combinación nos permitirá validar nuestras predicciones y ver si el modelo ML puede mejorar nuestro análisis.
Crearemos un modelo que predecirá el valor de mercado de los jugadores emergentes. Es por eso que usaremos los datos de los jugadores del Fifa 22 del fichero EX2.-players_22.csv.
1. Preparación del entorno (Solo en Google Colab)¶
En la parte izquierda de la pantalla tienes un apartado ficheros que puedes usar para subir el fichero EX2.-players_22.csv y luego poder referenciarlo como si se tratase de un fichero local.
2. Libreria Human Learn¶
También necesitaremos instalar la libreria de Human Learn para más adelante
# Instalamos la librería
%pip install git+https://github.com/koaning/human-learn.git
Collecting git+https://github.com/koaning/human-learn.git Cloning https://github.com/koaning/human-learn.git to /tmp/pip-req-build-dkpfcr9d Running command git clone --filter=blob:none --quiet https://github.com/koaning/human-learn.git /tmp/pip-req-build-dkpfcr9d Resolved https://github.com/koaning/human-learn.git to commit ab961c200829a3270084fb1345eeea60623fa89d Preparing metadata (setup.py) ... done Requirement already satisfied: scikit-learn>=0.23.2 in /usr/local/lib/python3.10/dist-packages (from human-learn==0.3.5) (1.5.2) Requirement already satisfied: pandas>=0.23.4 in /usr/local/lib/python3.10/dist-packages (from human-learn==0.3.5) (2.2.2) Collecting clumper<0.3.0,>=0.2.5 (from human-learn==0.3.5) Downloading clumper-0.2.15-py2.py3-none-any.whl.metadata (1.2 kB) Requirement already satisfied: Shapely>=1.7.1 in /usr/local/lib/python3.10/dist-packages (from human-learn==0.3.5) (2.0.6) Collecting bokeh<3.0.0,>=2.2.1 (from human-learn==0.3.5) Downloading bokeh-2.4.3-py3-none-any.whl.metadata (14 kB) Requirement already satisfied: Jinja2>=2.9 in /usr/local/lib/python3.10/dist-packages (from bokeh<3.0.0,>=2.2.1->human-learn==0.3.5) (3.1.4) Requirement already satisfied: numpy>=1.11.3 in /usr/local/lib/python3.10/dist-packages (from bokeh<3.0.0,>=2.2.1->human-learn==0.3.5) (1.26.4) Requirement already satisfied: packaging>=16.8 in /usr/local/lib/python3.10/dist-packages (from bokeh<3.0.0,>=2.2.1->human-learn==0.3.5) (24.2) Requirement already satisfied: pillow>=7.1.0 in /usr/local/lib/python3.10/dist-packages (from bokeh<3.0.0,>=2.2.1->human-learn==0.3.5) (11.0.0) Requirement already satisfied: PyYAML>=3.10 in /usr/local/lib/python3.10/dist-packages (from bokeh<3.0.0,>=2.2.1->human-learn==0.3.5) (6.0.2) Requirement already satisfied: tornado>=5.1 in /usr/local/lib/python3.10/dist-packages (from bokeh<3.0.0,>=2.2.1->human-learn==0.3.5) (6.3.3) Requirement already satisfied: typing-extensions>=3.10.0 in /usr/local/lib/python3.10/dist-packages (from bokeh<3.0.0,>=2.2.1->human-learn==0.3.5) (4.12.2) Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.23.4->human-learn==0.3.5) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.23.4->human-learn==0.3.5) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.23.4->human-learn==0.3.5) (2024.2) Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.23.2->human-learn==0.3.5) (1.13.1) Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.23.2->human-learn==0.3.5) (1.4.2) Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.23.2->human-learn==0.3.5) (3.5.0) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from Jinja2>=2.9->bokeh<3.0.0,>=2.2.1->human-learn==0.3.5) (3.0.2) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas>=0.23.4->human-learn==0.3.5) (1.16.0) Downloading bokeh-2.4.3-py3-none-any.whl (18.5 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18.5/18.5 MB 55.6 MB/s eta 0:00:00 Downloading clumper-0.2.15-py2.py3-none-any.whl (18 kB) Building wheels for collected packages: human-learn Building wheel for human-learn (setup.py) ... done Created wheel for human-learn: filename=human_learn-0.3.5-py3-none-any.whl size=116455 sha256=75eb8ef0f1a6a183576e85b8512dcc0fa4410368df6f73cf4baf24db3c31a851 Stored in directory: /tmp/pip-ephem-wheel-cache-_817jwon/wheels/84/81/6b/a9c7f40f0c7d485c35c319703ee16c9a3b0ae88f5bd49d8248 Successfully built human-learn Installing collected packages: clumper, bokeh, human-learn Attempting uninstall: bokeh Found existing installation: bokeh 3.6.2 Uninstalling bokeh-3.6.2: Successfully uninstalled bokeh-3.6.2 ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. holoviews 1.20.0 requires bokeh>=3.1, but you have bokeh 2.4.3 which is incompatible. panel 1.5.4 requires bokeh<3.7.0,>=3.5.0, but you have bokeh 2.4.3 which is incompatible. Successfully installed bokeh-2.4.3 clumper-0.2.15 human-learn-0.3.5
3. Preparación de los datos¶
Cargaremos los datos de los jugadores del FIFA 22 y los metemos en un DataFrame de datos de Pandas.
import pandas as pd
df = pd.read_csv('EX2.-players_22.csv')
df
<ipython-input-7-c51e318d3d01>:3: DtypeWarning: Columns (25,108) have mixed types. Specify dtype option on import or set low_memory=False.
df = pd.read_csv('EX2.-players_22.csv')
| sofifa_id | player_url | short_name | long_name | player_positions | overall | potential | value_eur | wage_eur | age | ... | lcb | cb | rcb | rb | gk | player_face_url | club_logo_url | club_flag_url | nation_logo_url | nation_flag_url | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 158023 | https://sofifa.com/player/158023/lionel-messi/... | L. Messi | Lionel Andrés Messi Cuccittini | RW, ST, CF | 93 | 93 | 78000000.0 | 320000.0 | 34 | ... | 50+3 | 50+3 | 50+3 | 61+3 | 19+3 | https://cdn.sofifa.net/players/158/023/22_120.png | https://cdn.sofifa.net/teams/73/60.png | https://cdn.sofifa.net/flags/fr.png | https://cdn.sofifa.net/teams/1369/60.png | https://cdn.sofifa.net/flags/ar.png |
| 1 | 188545 | https://sofifa.com/player/188545/robert-lewand... | R. Lewandowski | Robert Lewandowski | ST | 92 | 92 | 119500000.0 | 270000.0 | 32 | ... | 60+3 | 60+3 | 60+3 | 61+3 | 19+3 | https://cdn.sofifa.net/players/188/545/22_120.png | https://cdn.sofifa.net/teams/21/60.png | https://cdn.sofifa.net/flags/de.png | https://cdn.sofifa.net/teams/1353/60.png | https://cdn.sofifa.net/flags/pl.png |
| 2 | 20801 | https://sofifa.com/player/20801/c-ronaldo-dos-... | Cristiano Ronaldo | Cristiano Ronaldo dos Santos Aveiro | ST, LW | 91 | 91 | 45000000.0 | 270000.0 | 36 | ... | 53+3 | 53+3 | 53+3 | 60+3 | 20+3 | https://cdn.sofifa.net/players/020/801/22_120.png | https://cdn.sofifa.net/teams/11/60.png | https://cdn.sofifa.net/flags/gb-eng.png | https://cdn.sofifa.net/teams/1354/60.png | https://cdn.sofifa.net/flags/pt.png |
| 3 | 190871 | https://sofifa.com/player/190871/neymar-da-sil... | Neymar Jr | Neymar da Silva Santos Júnior | LW, CAM | 91 | 91 | 129000000.0 | 270000.0 | 29 | ... | 50+3 | 50+3 | 50+3 | 62+3 | 20+3 | https://cdn.sofifa.net/players/190/871/22_120.png | https://cdn.sofifa.net/teams/73/60.png | https://cdn.sofifa.net/flags/fr.png | NaN | https://cdn.sofifa.net/flags/br.png |
| 4 | 192985 | https://sofifa.com/player/192985/kevin-de-bruy... | K. De Bruyne | Kevin De Bruyne | CM, CAM | 91 | 91 | 125500000.0 | 350000.0 | 30 | ... | 69+3 | 69+3 | 69+3 | 75+3 | 21+3 | https://cdn.sofifa.net/players/192/985/22_120.png | https://cdn.sofifa.net/teams/10/60.png | https://cdn.sofifa.net/flags/gb-eng.png | https://cdn.sofifa.net/teams/1325/60.png | https://cdn.sofifa.net/flags/be.png |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 19234 | 261962 | https://sofifa.com/player/261962/defu-song/220002 | Song Defu | 宋德福 | CDM | 47 | 52 | 70000.0 | 1000.0 | 22 | ... | 46+2 | 46+2 | 46+2 | 48+2 | 15+2 | https://cdn.sofifa.net/players/261/962/22_120.png | https://cdn.sofifa.net/teams/112541/60.png | https://cdn.sofifa.net/flags/cn.png | NaN | https://cdn.sofifa.net/flags/cn.png |
| 19235 | 262040 | https://sofifa.com/player/262040/caoimhin-port... | C. Porter | Caoimhin Porter | CM | 47 | 59 | 110000.0 | 500.0 | 19 | ... | 44+2 | 44+2 | 44+2 | 48+2 | 14+2 | https://cdn.sofifa.net/players/262/040/22_120.png | https://cdn.sofifa.net/teams/445/60.png | https://cdn.sofifa.net/flags/ie.png | NaN | https://cdn.sofifa.net/flags/ie.png |
| 19236 | 262760 | https://sofifa.com/player/262760/nathan-logue/... | N. Logue | Nathan Logue-Cunningham | CM | 47 | 55 | 100000.0 | 500.0 | 21 | ... | 45+2 | 45+2 | 45+2 | 47+2 | 12+2 | https://cdn.sofifa.net/players/262/760/22_120.png | https://cdn.sofifa.net/teams/111131/60.png | https://cdn.sofifa.net/flags/ie.png | NaN | https://cdn.sofifa.net/flags/ie.png |
| 19237 | 262820 | https://sofifa.com/player/262820/luke-rudden/2... | L. Rudden | Luke Rudden | ST | 47 | 60 | 110000.0 | 500.0 | 19 | ... | 26+2 | 26+2 | 26+2 | 32+2 | 15+2 | https://cdn.sofifa.net/players/262/820/22_120.png | https://cdn.sofifa.net/teams/111131/60.png | https://cdn.sofifa.net/flags/ie.png | NaN | https://cdn.sofifa.net/flags/ie.png |
| 19238 | 264540 | https://sofifa.com/player/264540/emanuel-lalch... | E. Lalchhanchhuaha | Emanuel Lalchhanchhuaha | CAM | 47 | 60 | 110000.0 | 500.0 | 19 | ... | 41+2 | 41+2 | 41+2 | 45+2 | 16+2 | https://cdn.sofifa.net/players/264/540/22_120.png | https://cdn.sofifa.net/teams/113040/60.png | https://cdn.sofifa.net/flags/in.png | NaN | https://cdn.sofifa.net/flags/in.png |
19239 rows × 110 columns
Queremos clasificar a los jugadores en 4 categorías:
- Estrella (3): Valor de mercado superior a 50 m €.
- Promesa (2): Valor de mercado entre 10M€ y 50M€
- Jugador de rotación (1): Valor de mercado entre 1M€ y 10M€
- Jugador de cantera (0): Valor de mercado inferior a 1M€
Primero debemos preparar los datos, aprovechando la columna value_eur para crear la columna categoría que nos permitirá clasificar a los jugadores.
def categorize(row):
if row['value_eur'] >= 50000000:
return 3
elif row['value_eur'] >= 10000000:
return 2
elif row['value_eur'] >= 1000000:
return 1
else:
return 0
df['category'] = df.apply(categorize, axis=1)
df
| sofifa_id | player_url | short_name | long_name | player_positions | overall | potential | value_eur | wage_eur | age | ... | cb | rcb | rb | gk | player_face_url | club_logo_url | club_flag_url | nation_logo_url | nation_flag_url | category | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 158023 | https://sofifa.com/player/158023/lionel-messi/... | L. Messi | Lionel Andrés Messi Cuccittini | RW, ST, CF | 93 | 93 | 78000000.0 | 320000.0 | 34 | ... | 50+3 | 50+3 | 61+3 | 19+3 | https://cdn.sofifa.net/players/158/023/22_120.png | https://cdn.sofifa.net/teams/73/60.png | https://cdn.sofifa.net/flags/fr.png | https://cdn.sofifa.net/teams/1369/60.png | https://cdn.sofifa.net/flags/ar.png | 3 |
| 1 | 188545 | https://sofifa.com/player/188545/robert-lewand... | R. Lewandowski | Robert Lewandowski | ST | 92 | 92 | 119500000.0 | 270000.0 | 32 | ... | 60+3 | 60+3 | 61+3 | 19+3 | https://cdn.sofifa.net/players/188/545/22_120.png | https://cdn.sofifa.net/teams/21/60.png | https://cdn.sofifa.net/flags/de.png | https://cdn.sofifa.net/teams/1353/60.png | https://cdn.sofifa.net/flags/pl.png | 3 |
| 2 | 20801 | https://sofifa.com/player/20801/c-ronaldo-dos-... | Cristiano Ronaldo | Cristiano Ronaldo dos Santos Aveiro | ST, LW | 91 | 91 | 45000000.0 | 270000.0 | 36 | ... | 53+3 | 53+3 | 60+3 | 20+3 | https://cdn.sofifa.net/players/020/801/22_120.png | https://cdn.sofifa.net/teams/11/60.png | https://cdn.sofifa.net/flags/gb-eng.png | https://cdn.sofifa.net/teams/1354/60.png | https://cdn.sofifa.net/flags/pt.png | 2 |
| 3 | 190871 | https://sofifa.com/player/190871/neymar-da-sil... | Neymar Jr | Neymar da Silva Santos Júnior | LW, CAM | 91 | 91 | 129000000.0 | 270000.0 | 29 | ... | 50+3 | 50+3 | 62+3 | 20+3 | https://cdn.sofifa.net/players/190/871/22_120.png | https://cdn.sofifa.net/teams/73/60.png | https://cdn.sofifa.net/flags/fr.png | NaN | https://cdn.sofifa.net/flags/br.png | 3 |
| 4 | 192985 | https://sofifa.com/player/192985/kevin-de-bruy... | K. De Bruyne | Kevin De Bruyne | CM, CAM | 91 | 91 | 125500000.0 | 350000.0 | 30 | ... | 69+3 | 69+3 | 75+3 | 21+3 | https://cdn.sofifa.net/players/192/985/22_120.png | https://cdn.sofifa.net/teams/10/60.png | https://cdn.sofifa.net/flags/gb-eng.png | https://cdn.sofifa.net/teams/1325/60.png | https://cdn.sofifa.net/flags/be.png | 3 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 19234 | 261962 | https://sofifa.com/player/261962/defu-song/220002 | Song Defu | 宋德福 | CDM | 47 | 52 | 70000.0 | 1000.0 | 22 | ... | 46+2 | 46+2 | 48+2 | 15+2 | https://cdn.sofifa.net/players/261/962/22_120.png | https://cdn.sofifa.net/teams/112541/60.png | https://cdn.sofifa.net/flags/cn.png | NaN | https://cdn.sofifa.net/flags/cn.png | 0 |
| 19235 | 262040 | https://sofifa.com/player/262040/caoimhin-port... | C. Porter | Caoimhin Porter | CM | 47 | 59 | 110000.0 | 500.0 | 19 | ... | 44+2 | 44+2 | 48+2 | 14+2 | https://cdn.sofifa.net/players/262/040/22_120.png | https://cdn.sofifa.net/teams/445/60.png | https://cdn.sofifa.net/flags/ie.png | NaN | https://cdn.sofifa.net/flags/ie.png | 0 |
| 19236 | 262760 | https://sofifa.com/player/262760/nathan-logue/... | N. Logue | Nathan Logue-Cunningham | CM | 47 | 55 | 100000.0 | 500.0 | 21 | ... | 45+2 | 45+2 | 47+2 | 12+2 | https://cdn.sofifa.net/players/262/760/22_120.png | https://cdn.sofifa.net/teams/111131/60.png | https://cdn.sofifa.net/flags/ie.png | NaN | https://cdn.sofifa.net/flags/ie.png | 0 |
| 19237 | 262820 | https://sofifa.com/player/262820/luke-rudden/2... | L. Rudden | Luke Rudden | ST | 47 | 60 | 110000.0 | 500.0 | 19 | ... | 26+2 | 26+2 | 32+2 | 15+2 | https://cdn.sofifa.net/players/262/820/22_120.png | https://cdn.sofifa.net/teams/111131/60.png | https://cdn.sofifa.net/flags/ie.png | NaN | https://cdn.sofifa.net/flags/ie.png | 0 |
| 19238 | 264540 | https://sofifa.com/player/264540/emanuel-lalch... | E. Lalchhanchhuaha | Emanuel Lalchhanchhuaha | CAM | 47 | 60 | 110000.0 | 500.0 | 19 | ... | 41+2 | 41+2 | 45+2 | 16+2 | https://cdn.sofifa.net/players/264/540/22_120.png | https://cdn.sofifa.net/teams/113040/60.png | https://cdn.sofifa.net/flags/in.png | NaN | https://cdn.sofifa.net/flags/in.png | 0 |
19239 rows × 111 columns
Finalmente, antes de entrenar los modelos, debemos separar los datos en un conjunto de entrenamiento y un conjunto de pruebas y pasarlos al formato X e Y.
from sklearn.model_selection import train_test_split
# pandas 3 ya no admite rellenar con 0 una columna de texto: rellenamos solo
# las numericas (las de texto se descartan justo despues, en `to_drop`).
numericas = df.select_dtypes(include='number').columns
df[numericas] = df[numericas].fillna(0)
to_drop = ['category', 'value_eur',
'sofifa_id', 'player_url', 'short_name', 'long_name', 'player_positions', 'dob',
'club_name', 'club_loaned_from', 'league_name', 'club_position', 'nation_position', 'club_joined', 'nationality_name', 'preferred_foot', 'work_rate',
'body_type', 'real_face', 'player_tags', 'player_traits',
'nation_logo_url', 'nation_flag_url', 'ls', 'st', 'rs', 'lw', 'lf', 'cf',
'rf', 'rw', 'lam', 'cam', 'ram', 'lm', 'lcm', 'cm', 'rcm', 'rm', 'lwb', 'ldm',
'cdm', 'rdm', 'rwb', 'lb', 'lcb', 'cb', 'rcb', 'rb', 'gk',
'player_face_url', 'club_logo_url', 'club_flag_url', 'nation_logo_url', 'nation_flag_url']
X = df.drop(to_drop, axis=1)
y = df['category']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Human Learn (HL)¶
Usaremos Human Learn para estimar el valor de mercado de los jugadores. Crearemos una FunctionClassifier para hacer una primera estimación del valor de mercado de los jugadores.
Classificador simple¶
Para eso tienes que crear una función simple utilizando un parámetro que nos permita clasificar a los jugadores en estas categorías y pasarlo al FunctionClassifier. Una vez que se crea el clasificador, entrenarlo con los datos de entrenamiento (Fit) y muestra su precisión con los datos de prueba (`score``).
import numpy as np
from hulearn.classification import FunctionClassifier
# Completa la celda
array([0, 0, 0, ..., 0, 0, 0])
# Completa la celda
0.7305093555093555
Intenta obtener una precisión de más de 0.8. Puedes aprovechar GridSearchCV para encontrar los mejores parámetros para la función de clasificación.
Clasificador con más parámetros¶
Los clasificadores de un solo parámetro son muy simples y no nos permiten aprovechar todo el potencial del aprendizaje humano. Por esta razón, haz una exploración interactiva de los datos para encontrar los parámetros que nos permiten clasificar mejor a los jugadores. Puedes usar Parallel_Coordinates para hacer esta exploración.
FIGS¶
Como hemos visto en el ejemplo del Titanic, FIGS genera reglas fáciles de interpretar para clasificar los datos. Pero FIGS no permite una clasificación múltiple directamente, por lo que simplificaremos el problema y solo clasificaremos a los jugadores en dos categorías: Estrella (3) y No estrella (0, 1, 2).
Primero, crearemos un DataFrame de datos adaptado, donde los jugadores con la Categoría 3 tendrán la Categoría 1 y los jugadores con la Categoría 0, 1 o 2 tendrán la Categoría 0.
df_skope = df.copy()
# Completa la celda
| sofifa_id | player_url | short_name | long_name | player_positions | overall | potential | value_eur | wage_eur | age | ... | cb | rcb | rb | gk | player_face_url | club_logo_url | club_flag_url | nation_logo_url | nation_flag_url | category | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 158023 | https://sofifa.com/player/158023/lionel-messi/... | L. Messi | Lionel Andrés Messi Cuccittini | RW, ST, CF | 93 | 93 | 78000000.0 | 320000.0 | 34 | ... | 50+3 | 50+3 | 61+3 | 19+3 | https://cdn.sofifa.net/players/158/023/22_120.png | https://cdn.sofifa.net/teams/73/60.png | https://cdn.sofifa.net/flags/fr.png | https://cdn.sofifa.net/teams/1369/60.png | https://cdn.sofifa.net/flags/ar.png | 1 |
| 1 | 188545 | https://sofifa.com/player/188545/robert-lewand... | R. Lewandowski | Robert Lewandowski | ST | 92 | 92 | 119500000.0 | 270000.0 | 32 | ... | 60+3 | 60+3 | 61+3 | 19+3 | https://cdn.sofifa.net/players/188/545/22_120.png | https://cdn.sofifa.net/teams/21/60.png | https://cdn.sofifa.net/flags/de.png | https://cdn.sofifa.net/teams/1353/60.png | https://cdn.sofifa.net/flags/pl.png | 1 |
| 2 | 20801 | https://sofifa.com/player/20801/c-ronaldo-dos-... | Cristiano Ronaldo | Cristiano Ronaldo dos Santos Aveiro | ST, LW | 91 | 91 | 45000000.0 | 270000.0 | 36 | ... | 53+3 | 53+3 | 60+3 | 20+3 | https://cdn.sofifa.net/players/020/801/22_120.png | https://cdn.sofifa.net/teams/11/60.png | https://cdn.sofifa.net/flags/gb-eng.png | https://cdn.sofifa.net/teams/1354/60.png | https://cdn.sofifa.net/flags/pt.png | 0 |
| 3 | 190871 | https://sofifa.com/player/190871/neymar-da-sil... | Neymar Jr | Neymar da Silva Santos Júnior | LW, CAM | 91 | 91 | 129000000.0 | 270000.0 | 29 | ... | 50+3 | 50+3 | 62+3 | 20+3 | https://cdn.sofifa.net/players/190/871/22_120.png | https://cdn.sofifa.net/teams/73/60.png | https://cdn.sofifa.net/flags/fr.png | 0 | https://cdn.sofifa.net/flags/br.png | 1 |
| 4 | 192985 | https://sofifa.com/player/192985/kevin-de-bruy... | K. De Bruyne | Kevin De Bruyne | CM, CAM | 91 | 91 | 125500000.0 | 350000.0 | 30 | ... | 69+3 | 69+3 | 75+3 | 21+3 | https://cdn.sofifa.net/players/192/985/22_120.png | https://cdn.sofifa.net/teams/10/60.png | https://cdn.sofifa.net/flags/gb-eng.png | https://cdn.sofifa.net/teams/1325/60.png | https://cdn.sofifa.net/flags/be.png | 1 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 19234 | 261962 | https://sofifa.com/player/261962/defu-song/220002 | Song Defu | 宋德福 | CDM | 47 | 52 | 70000.0 | 1000.0 | 22 | ... | 46+2 | 46+2 | 48+2 | 15+2 | https://cdn.sofifa.net/players/261/962/22_120.png | https://cdn.sofifa.net/teams/112541/60.png | https://cdn.sofifa.net/flags/cn.png | 0 | https://cdn.sofifa.net/flags/cn.png | 0 |
| 19235 | 262040 | https://sofifa.com/player/262040/caoimhin-port... | C. Porter | Caoimhin Porter | CM | 47 | 59 | 110000.0 | 500.0 | 19 | ... | 44+2 | 44+2 | 48+2 | 14+2 | https://cdn.sofifa.net/players/262/040/22_120.png | https://cdn.sofifa.net/teams/445/60.png | https://cdn.sofifa.net/flags/ie.png | 0 | https://cdn.sofifa.net/flags/ie.png | 0 |
| 19236 | 262760 | https://sofifa.com/player/262760/nathan-logue/... | N. Logue | Nathan Logue-Cunningham | CM | 47 | 55 | 100000.0 | 500.0 | 21 | ... | 45+2 | 45+2 | 47+2 | 12+2 | https://cdn.sofifa.net/players/262/760/22_120.png | https://cdn.sofifa.net/teams/111131/60.png | https://cdn.sofifa.net/flags/ie.png | 0 | https://cdn.sofifa.net/flags/ie.png | 0 |
| 19237 | 262820 | https://sofifa.com/player/262820/luke-rudden/2... | L. Rudden | Luke Rudden | ST | 47 | 60 | 110000.0 | 500.0 | 19 | ... | 26+2 | 26+2 | 32+2 | 15+2 | https://cdn.sofifa.net/players/262/820/22_120.png | https://cdn.sofifa.net/teams/111131/60.png | https://cdn.sofifa.net/flags/ie.png | 0 | https://cdn.sofifa.net/flags/ie.png | 0 |
| 19238 | 264540 | https://sofifa.com/player/264540/emanuel-lalch... | E. Lalchhanchhuaha | Emanuel Lalchhanchhuaha | CAM | 47 | 60 | 110000.0 | 500.0 | 19 | ... | 41+2 | 41+2 | 45+2 | 16+2 | https://cdn.sofifa.net/players/264/540/22_120.png | https://cdn.sofifa.net/teams/113040/60.png | https://cdn.sofifa.net/flags/in.png | 0 | https://cdn.sofifa.net/flags/in.png | 0 |
19239 rows × 111 columns
Para entrenar el clasificador, primero debemos separar los datos en un conjunto de entrenamiento y un conjunto de pruebas y pasarlos al formato X e Y.
X = df_skope.drop(to_drop, axis=1)
y = df_skope['category']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# instal·lem la llibreria
%pip install imodels
Collecting imodels Downloading imodels-2.0.0-py3-none-any.whl.metadata (30 kB) Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from imodels) (3.8.0) Requirement already satisfied: mlxtend>=0.18.0 in /usr/local/lib/python3.10/dist-packages (from imodels) (0.23.3) Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from imodels) (1.26.4) Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from imodels) (2.2.2) Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from imodels) (2.32.3) Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from imodels) (1.13.1) Requirement already satisfied: scikit-learn>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from imodels) (1.5.2) Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from imodels) (4.66.6) Requirement already satisfied: joblib>=0.13.2 in /usr/local/lib/python3.10/dist-packages (from mlxtend>=0.18.0->imodels) (1.4.2) Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->imodels) (1.3.1) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->imodels) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->imodels) (4.55.1) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->imodels) (1.4.7) Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->imodels) (24.2) Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->imodels) (11.0.0) Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->imodels) (3.2.0) Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib->imodels) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->imodels) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->imodels) (2024.2) Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.2.0->imodels) (3.5.0) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->imodels) (3.4.0) Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->imodels) (3.10) Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->imodels) (2.2.3) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->imodels) (2024.8.30) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib->imodels) (1.16.0) Downloading imodels-2.0.0-py3-none-any.whl (243 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 243.1/243.1 kB 11.4 MB/s eta 0:00:00 Installing collected packages: imodels Successfully installed imodels-2.0.0
# Carreguem la llibreria
from imodels import FIGSClassifier
Cree un clasificador de imodels y entrenalo solo con los datos de entrenamiento (Fit). Luego muestra la precisión del clasificador con los datos de prueba (score).
# Completa la celda creando un clasificador con FIGS
/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above. and should_run_async(code)
# Completa la celda entrenando el modelo
# completa la celda realizando la predicción con el modelo recien entrenado
/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above. and should_run_async(code)
array([0, 0, 0, ..., 0, 0, 0])
# completa la celda calculando el `score` obtenido por el modelo
/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above. and should_run_async(code)
0.998960498960499
Podemos ver que el clasificador ha logrado una precisión muy alta. Esto se debe al hecho de que hay datos que son muy esclarecedores, como la clausula de rescisión, el valor general, el potencial, el salario o el valor de mercado. Es por eso que debemos tener en cuenta que estos datos no estarán disponibles para los jugadores emergentes y, por lo tanto, nuestro clasificador no será tan preciso.
Eliminaremos todos estos datos y entrenaremos nuevamente el clasificador.
# completa la celda, modificando el dataframe, separando los datos en train y test, y genera un nuevo clasificador y entrenalo
# completa la celda realizando la predicción con el modelo recien entrenado y calculando el `score` obtenido por el modelo
/usr/local/lib/python3.10/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above. and should_run_async(code)
0.9968814968814969
Entrega¶
Una vez completado el Notebook y ejecutado completamente (comprueba que funcionan todas las celdas). Envialo a la tarea correspondiente de AULES.