Salta el contingut
 

Conjunts de dades

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Conjunts de dades

L'objectiu dels models d'aprenentatge automàtic es trobar patrons en les dades de manera automàtica per tal de fer prediccions o prendre decisions.

Per aconseguir aquest objectiu, és necessari disposar de dades per entrenar els models, que cal dividir en diferents conjunts: train (entrenament), validation (validació) i test (prova). Cada conjunt té una finalitat específica durant el procés de creació i avaluació del model.

La mida de cada conjunt depèn de diversos factors, com ara la quantitat de dades disponibles, la complexitat del model, etc. No obstant això, una divisió comuna és:

  • Conjunt d'entrenament: 70-80% de les dades.
  • Conjunt de validació: 10-15% de les dades.
  • Conjunt de prova: 10-15% de les dades.

Conjunt d'entrenament

El conjunt d'entrenament (training set) és el conjunt de dades que s'utilitza per entrenar el model i ajustar els seus paràmetres.

L'objectiu d'aquest conjunt és construir un model que siga capaç de realitzar prediccions correctes sobre dades que no ha vist abans.

Conjunt de validació

El conjunt de validació (validation set) és el conjunt de dades que s'utilitza per avaluar el model durant el procés d'entrenament.

L'objectiu d'aquest conjunt és valorar el rendiment del model en el procés d'entrenament.

Aquest conjunt permet ajustar els hiperparàmetres del model (com ara la taxa d'aprenentatge, nombre de capes de la xarxa neuronal, etc.) per tal de millorar el seu rendiment. També ajuda a detectar problemes com l'sobreajustament (overfitting).

Sobreajustament i infraajustament

Autor desconegut

Figura 1. Comparació entre el sobreajustament i l'infraajustament.

Conjunt de prova

El conjunt de prova (test set) és el conjunt de dades que s'utilitza per avaluar el model després d'haver finalitzat el procés d'entrenament.

Important

Aquest conjunt de dades no s'utilitza mai durant el procés d'entrenament del model.

L'objectiu d'aquest conjunt és avaluar el rendiment del model amb dades que no ha vist abans i comprovar si és capaç de generalitzar correctament el problema.

Importància dels conjunts de dades

Els conjunts de dades són una part fonamental en el procés d'aprenentatge automàtic per diversos motius, entre els quals podem destacar els següents.

Prevenció de l'sobreajustament

El sobreajustament (overfitting) ocorre quan un model aprén excessivament les característiques particulars de les dades d'entrenament i no és capaç de generalitzar correctament a noves dades.

Per evitar l'sobreajustament, s'utilitza el conjunt de validació per ajustar el model i detectar el problema abans de provar-ho amb el conjunt de prova.

Evolució de l'error en els conjunts de dades

Autor desconegut

Figura 2. Evolució de l'error en els conjunts de dades durant el procés d'entrenament.

Evitar el biaix en l'avaluació del model

Si s'utilitza el mateix conjunt de dades per entrenar i avaluar el model, aquest pot donar la falsa impressió que el model és millor del que realment és, ja que el model ja coneix les dades amb les qual s'ha d'avaluar.

Divisió de les dades en conjunts

La divisió de les dades en conjunts es pot realitzar amb diverses llibreries de Python, com ara scikit-learn o pandas.

Una consideració important és assegurar la reproductibilitat de la divisió de les dades, per la qual cosa és recomanable fixar la llavor (seed) del generador de nombres aleatoris.

import pandas as pd

from sklearn.model_selection import train_test_split

sk_train_df, val_test_df = train_test_split(df, test_size=0.3, random_state=42)
sk_validation_df, sk_test_df = train_test_split(val_test_df, test_size=0.5, random_state=42)

print("Scikit-learn")
print(f'Train set: {sk_train_df.shape}')
print(f'Validation set: {sk_validation_df.shape}')
print(f'Test set: {sk_test_df.shape}')
import pandas as pd

df_shuffled = df.sample(frac=1, random_state=42).reset_index(drop=True)

train_size = 0.7
validation_size = 0.15
test_size = 0.15

train_end = int(len(df_shuffled) * train_size)
validation_end = train_end + int(len(df_shuffled) * validation_size)

p_train_df = df_shuffled.iloc[:train_end]
p_validation_df = df_shuffled.iloc[train_end:validation_end]
p_test_df = df_shuffled.iloc[validation_end:]

print(f'Train set: {p_train_df.shape}')
print(f'Validation set: {p_validation_df.shape}')
print(f'Test set: {p_test_df.shape}')
print()

Codi font

conjunt_dades.py
# --8<-- [start:import_pandas]
import pandas as pd
# --8<-- [end:import_pandas]

# --8<-- [start:import_sklearn]
from sklearn.model_selection import train_test_split
# --8<-- [end:import_sklearn]


df = pd.read_csv('../../files/ud3/adult.data.csv')
# --8<-- [end:dades]

# --8<-- [start:pandas]
df_shuffled = df.sample(frac=1, random_state=42).reset_index(drop=True)

train_size = 0.7
validation_size = 0.15
test_size = 0.15

train_end = int(len(df_shuffled) * train_size)
validation_end = train_end + int(len(df_shuffled) * validation_size)

p_train_df = df_shuffled.iloc[:train_end]
p_validation_df = df_shuffled.iloc[train_end:validation_end]
p_test_df = df_shuffled.iloc[validation_end:]

print(f'Train set: {p_train_df.shape}')
print(f'Validation set: {p_validation_df.shape}')
print(f'Test set: {p_test_df.shape}')
print()
# --8<-- [end:pandas]


# --8<-- [start:sklearn]
sk_train_df, val_test_df = train_test_split(df, test_size=0.3, random_state=42)
sk_validation_df, sk_test_df = train_test_split(val_test_df, test_size=0.5, random_state=42)

print("Scikit-learn")
print(f'Train set: {sk_train_df.shape}')
print(f'Validation set: {sk_validation_df.shape}')
print(f'Test set: {sk_test_df.shape}')
# --8<-- [end:sklearn]

Bibliografia

Comentaris