Desequilibri de classes
El problema
El desequilibri de classes (class imbalance, CI) és un repte habitual en els datasets d'aprenentatge automàtic: una classe hi és significativament més present que les altres. Abordar-lo ajuda a mitigar el biaix, millora el rendiment del model i promou un ús ètic i responsable de la Intel·ligència Artificial.
Per sort, existeixen diverses tècniques per abordar el desequilibri de classes, aplicables a diferents tipus de dades: numèriques, textuals i d'imatge.
Bones pràctiques generals
Amb independència del tipus de dataset, assegurar que les dades estiguin equilibrades és un pas crucial per construir models robustos i precisos:
- Detecta el desequilibri abans d'entrenar. Calcula la distribució de classes (
value_counts()en pandas) com a primer pas de qualsevol projecte de classificació. - No corregeixis automàticament sense entendre la causa. Un desequilibri pot reflectir la realitat (el frau és, per sort, poc freqüent) o un problema de recollida de dades (un grup demogràfic infrarepresentat per limitacions de mostreig). La tècnica correcta depèn de quin sigui el cas.
- Tria la mètrica d'avaluació correcta. Amb classes desequilibrades, l'exactitud (accuracy) és enganyosa: un model que sempre prediu la classe majoritària pot tenir un 95% d'exactitud i ser inútil. Cal fer servir precisió, exhaustivitat (recall), F1-score o AUC-ROC per classe.
- Aplica les tècniques de correcció només sobre el conjunt d'entrenament, mai sobre el conjunt de validació o de test, perquè aquests han de reflectir la distribució real que el model trobarà en producció.
import pandas as pd
df = pd.read_csv("sol_licituds_prestec.csv")
# Pas 1: detectar el desequilibri
print(df["resultat"].value_counts(normalize=True) * 100)
# concedit 88.3
# denegat 11.7
Tècniques de validació i correcció de dades
Tècnica 1 — Remostreig (Resampling)
Si les dades afavoreixen una classe per sobre d'una altra, es pot sobremostrejar (oversample) o submostrejar (undersample) per modificar la distribució de classes:
- Oversampling: augmenta les mostres de la classe minoritària, replicant-les o generant-ne de sintètiques.
- Undersampling: redueix les mostres de la classe majoritària, eliminant-ne algunes.
L'objectiu és produir una distribució de classes més equilibrada perquè el model no sobreajusti (overfit) a la classe majoritària.
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
X = df.drop(columns=["resultat"])
y = df["resultat"]
# Oversampling aleatori de la classe minoritària
ros = RandomOverSampler(random_state=42)
X_over, y_over = ros.fit_resample(X, y)
# Undersampling aleatori de la classe majoritària
rus = RandomUnderSampler(random_state=42)
X_under, y_under = rus.fit_resample(X, y)
print(f"Original: {len(y)} files, distribució {y.value_counts(normalize=True).to_dict()}")
print(f"Oversampled: {len(y_over)} files")
print(f"Undersampled: {len(y_under)} files")
Undersampling i pèrdua d'informació
Eliminar registres reals de la classe majoritària pot descartar informació valuosa (per exemple, dades de clients legítims). Avalua sempre l'impacte sobre el rendiment global del model, no només sobre la classe minoritària.
Tècnica 2 — Generació de dades sintètiques (SMOTE)
La generació de dades sintètiques crea punts de dades artificials nous de forma algorísmica, en lloc de recollir-ne de nous del món real. Generant dades addicionals per a les classes infrarepresentades, aquesta tècnica permet abordar el desequilibri en datasets on certes classes tenen molts més exemples que d'altres. Això permet entrenar el model amb un dataset més equilibrat, amb una distribució més uniforme de cada classe, reduint el biaix cap a les classes majoritàries.
La tècnica de generació sintètica més habitual és la SMOTE (Synthetic Minority Oversampling TEchnique). SMOTE funciona interpolant entre exemples propers de la classe minoritària: en lloc de duplicar registres existents (com fa l'oversampling aleatori), crea punts nous "entre" exemples reals semblants, fet que permet sobremostrejar la classe minoritària sense generar duplicats exactes.
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42, k_neighbors=5)
X_smote, y_smote = smote.fit_resample(X, y)
print(f"Distribució després de SMOTE: {y_smote.value_counts(normalize=True).to_dict()}")
SMOTE només funciona amb variables numèriques
SMOTE interpola numèricament entre veïns, per la qual cosa requereix que totes les variables siguin numèriques (cal codificar les variables categòriques abans, per exemple amb one-hot encoding). Per a dades amb variables categòriques i numèriques barrejades, imbalanced-learn ofereix la variant SMOTENC.
Tècnica 3 — Augmentació de dades (Data Augmentation)
L'augmentació de dades consisteix a crear noves dades d'entrenament a partir de les dades existents, per exemple rotant, escalant, retallant, invertint o afegint soroll a un dataset. Mentre que la generació de dades sintètiques crea dades completament noves des de zero, l'augmentació de dades amplia un dataset aplicant transformacions a les dades ja existents.
L'augmentació es pot complementar amb xarxes generatives adversàries (Generative Adversarial Networks, GANs). Una GAN consta de dues xarxes neuronals: un generador i un discriminador. El generador crea dades sintètiques a partir de soroll aleatori, intentant produir dades que s'assemblin a les dades d'entrenament reals. El discriminador examina les dades per determinar si són reals o sintètiques. Aquesta competició adversària empeny el generador a crear dades sintètiques cada cop més realistes, a mesura que el discriminador li proporciona retroalimentació sobre com millorar. Entrenant el generador perquè produeixi dades de la classe minoritària, es poden crear exemples nous i diversos per augmentar i equilibrar el dataset.
També es poden fer servir models de difusió (diffusion models) per augmentar un dataset, amb un enfocament diferent però un objectiu similar al de les GAN.
Estratègies segons el tipus de dades
Dades numèriques
Exemple: el frau amb targetes de crèdit és un problema freqüent que provoca pèrdues econòmiques importants tant per als titulars de targeta com per a les entitats financeres. Detectar transaccions fraudulentes en temps real és crucial per mitigar pèrdues, però és difícil per a un model detectar-les si el dataset té una majoria aclaparadora de transaccions legítimes (sovint per sota de l'1% de casos de frau).
Estratègies:
- Remostreig: sobremostreja les transaccions fraudulentes (la classe minoritària). Una tècnica de sobremostreig amb SMOTE pot ajudar a equilibrar el dataset. Alternativament, es pot submostrejar eliminant aleatòriament exemples de la classe majoritària, tot tenint en compte que descartar dades reals pot comportar pèrdua d'informació sobre el comportament legítim dels clients.
Dades textuals
Exemple: amb l'ús generalitzat del correu electrònic, els missatges de spam s'han convertit en un problema important, que satura les safates d'entrada i pot suposar riscos de seguretat per als usuaris. Detectar correus de spam pot ser difícil per a un model d'aprenentatge automàtic si el dataset està compost majoritàriament per correus legítims.
Estratègies:
- Remostreig: sobremostreja les dades de correu brossa (classe minoritària), o submostreja els correus legítims (classe majoritària).
- Generació de dades sintètiques: complementa el dataset amb instàncies addicionals de text sintètic que imitin la classe minoritària de correu brossa (per exemple, amb tècniques de paràfrasi automàtica o models de llenguatge generatius).
Dades d'imatge
Exemple: les ressonàncies magnètiques o les radiografies per a determinades malalties o condicions rares tenen exemples molt limitats en comparació amb condicions més comunes. Aquest desequilibri d'imatges pot dificultar que els models d'aprenentatge automàtic detectin i diagnostiquin amb precisió condicions rares.
Estratègies:
- GANs: utilitza aquest tipus d'augmentació de dades per produir imatges realistes de la classe minoritària, equilibrant el dataset d'imatges mèdiques i millorant la precisió de les prediccions de diagnòstic.
Consideracions ètiques en dades sanitàries i sensibles
Generar dades sintètiques o augmentades en dominis sensibles (salut, justícia, crèdit) requereix una validació addicional per part d'experts del domini. Una imatge mèdica sintètica poc realista, o un text de spam sintètic massa allunyat dels patrons reals, pot introduir un biaix nou en lloc de corregir-ne un d'existent. La generació sintètica no substitueix mai la recollida de dades reals i representatives quan és possible.
Posa't a prova
Cas: una empresa de decoració de la llar construeix un model d'aprenentatge automàtic per classificar ressenyes de productes en positives, negatives o neutres. El seu dataset té 100.000 ressenyes: 60.000 positives, 35.000 negatives i 5.000 neutres.
Quina estratègia de validació és la més efectiva per ajudar l'empresa a abordar el desequilibri de classes d'aquest dataset textual?
A. Augmentació de dades textuals B. SMOTE C. Sobremostrejar les ressenyes positives D. Submostrejar les ressenyes neutres
Mostra la resposta raonada
La resposta correcta és A. La classe minoritària (neutra, 5.000 ressenyes) necessita més exemples, no menys: l'opció D (submostrejar neutres) eliminaria encara més dades de la classe ja minoritària, agreujant el problema. L'opció C (sobremostrejar positives, la classe majoritària) també és incorrecta, perquè augmenta encara més el desequilibri. SMOTE (opció B) està dissenyat per a dades numèriques i no s'aplica directament sobre text en brut. L'augmentació de dades textuals (paràfrasi, traducció inversa, substitució de sinònims) és la tècnica adequada per generar exemples addicionals i realistes de la classe neutra sense duplicar-los exactament.
AC5074/08/03 — Pràctica relacionada
Consulta la Pràctica PR507408 per posar en pràctica les tècniques d'aquesta pàgina sobre un dataset real.
Bloc 8 | Mòdul M5074 Sistemes de Big Data | Institut Sa Palomera (Blanes) | Curs CEIABD 2026-2027