Mètriques d’avaluació
- Mètriques per a regressió
- Mètriques per a classificació
- Taxa d’encerts (Accuracy)
- Matriu de Confusió
- Precision (Precisió)
- Recall (Sensibilitat o Exhaustivitat)
- Trade-off entre Precision i Recall
- F1-Score
- Log Loss (Entropia creuada)
- El Llindar de Decisió
- Corba ROC-AUC
- Interpretació de la corba ROC
- Corba Precision-Recall
- ROC-AUC vs Precision-Recall: Quan usar cada una
- Classes Desbalancejades
- Exemple Complet: Detecció de Frau
- Implementació amb Python
- Taula Resum de Totes les Mètriques
- Conclusions Finals
- Extensió a classificació multiclasse
- Recomanacions pràctiques
Mètriques per a regressió
Un cop hem entrenat el nostre model de regressió, necessitem avaluar com de bé funciona. La funció de cost J(w, b) ens serveix per entrenar el model, però per avaluar-ne la qualitat utilitzem mètriques més interpretables.
R² (coeficient de determinació)
El R² (R-squared o coeficient de determinació) és la mètrica més popular per avaluar models de regressió. Ens diu quina proporció de la variabilitat de les dades és explicada pel model.
R2=1−∑mi=1(yi−ˆyi)2∑mi=1(yi−ˉy)2
On:
- ŷᵢ: Predicció del model per a l’exemple i
- ȳ: Mitjana de tots els valors reals
- Numerador: Suma dels errors quadrats del model
- Denominador: Variància total de les dades
Interpretació:
R² = 1 - (variància no explicada pel model / variància total de les dades)
= (variància explicada pel model / variància total de les dades)
- R² = 1: El model explica perfectament totes les dades (prediccions perfectes)
- R² = 0.8: El model explica el 80% de la variabilitat (molt bo)
- R² = 0.5: El model explica el 50% de la variabilitat (acceptable)
- R² = 0: El model no explica res millor que predir sempre la mitjana
- R² < 0: El model és pitjor que predir simplement la mitjana (molt dolent)
Avantatges:
- Fàcil d’interpretar (típicament entre 0 i 1)
- Independent de l’escala de les dades
- Molt utilitzat en la pràctica
Limitacions:
- Sempre millora (o es manté igual) quan afegim més variables, fins i tot si no són útils
- Pot ser enganyós amb models molt complexos
MSE (error quadràtic mitjà)
El MSE (Mean Squared Error) mesura la mitjana dels errors al quadrat entre les prediccions i els valors reals.
MSE=1mm∑i=1(yi−ˆyi)2
Nota: És molt similar a la funció de cost J(w, b), però sense el factor 1/2.
Interpretació:
- MSE baix: Prediccions properes als valors reals (bon model)
- MSE alt: Prediccions llunyanes dels valors reals (mal model)
- Les unitats són el quadrat de les unitats originals (ex: si y és en euros, MSE és en euros²)
Avantatges:
- Matemàticament convenient (diferenciable)
- Penalitza fortament els errors grans (per l’elevació al quadrat)
Limitacions:
- Difícil d’interpretar per les unitats al quadrat
- Molt sensible a outliers (valors extrems)
Exemple: Si predim preus de cases i MSE = 10000 euros², això vol dir que l’error típic elevat al quadrat és 10000.
RMSE (arrel de l’error quadràtic mitjà)
El RMSE (Root Mean Squared Error) és simplement l’arrel quadrada del MSE, la qual cosa el fa més fàcil d’interpretar.
RMSE=√MSE=√1mm∑i=1(yi−ˆyi)2
Interpretació:
- Representa l’error típic en les mateixes unitats que la variable objectiu
- RMSE = 5000 euros significa que, de mitjana, les prediccions s’equivoquen en uns 5000 euros
Avantatges:
- Mateixes unitats que la variable original (molt més interpretable que MSE)
- Encara penalitza els errors grans
- Mètrica molt utilitzada en competicions i en la pràctica
Limitacions:
- Com MSE, és sensible a outliers
- No té una interpretació percentual com R²
Quan usar-lo: RMSE és excel·lent quan vols saber “de mitjana, quant m’equivoco?” en les unitats originals del problema.
MAE (error absolut mitjà)
El MAE (Mean Absolute Error) mesura la mitjana dels errors absoluts (sense elevar al quadrat).
MAE=1mm∑i=1|yi−ˆyi|
Interpretació:
- Representa l’error mitjà absolut en les mateixes unitats que la variable objectiu
- MAE = 3000 euros significa que, de mitjana, les prediccions s’equivoquen en 3000 euros (en valor absolut)
Avantatges:
- Molt intuïtiu: “error mitjà absolut”
- Mateixes unitats que la variable original
- Menys sensible a outliers que MSE/RMSE (no eleva al quadrat)
- Tracta tots els errors per igual
Limitacions:
- No penalitza tant els errors grans com MSE/RMSE
- Menys convenient matemàticament (no és diferenciable a zero)
Diferència clau amb RMSE:
- RMSE castiga més els errors grans (per l’elevació al quadrat)
- MAE tracta tots els errors de forma més uniforme
Taula comparativa de mètriques
| Mètrica | Unitats | Sensibilitat a outliers | Interpretació | Quan usar-la |
|---|---|---|---|---|
| R² | Sense unitats (0-1) | Mitjana | % de variabilitat explicada | Comparar models, veure quant explica el model |
| MSE | Unitats² | Molt alta | Error quadràtic mitjà | Optimització matemàtica, funcions de cost |
| RMSE | Unitats originals | Alta | Error típic | Quan vols saber l’error típic en unitats originals |
| MAE | Unitats originals | Baixa | Error mitjà absolut | Quan hi ha outliers o vols tractar errors uniformement |
Exemple pràctic
Imaginem que predim preus de cases amb tres models diferents:
Model A: R² = 0.85, RMSE = 25000€, MAE = 18000€
Model B: R² = 0.82, RMSE = 30000€, MAE = 15000€
Model C: R² = 0.90, RMSE = 20000€, MAE = 16000€
Interpretació:
- Model C: Millor R² (explica el 90% de la variabilitat) i millor RMSE
- Model B: Pitjor RMSE però millor MAE, suggereix que potser té alguns errors grans però menys errors petits
- Model A: Equilibrat, però no el millor en cap mètrica
Conclusió: Model C sembla el millor en general. Si hi ha molts outliers problemàtics, podríem considerar Model B.
Com Calcular-les amb Python
import numpy as np
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
# Valors reals i prediccions
y_true = np.array([100, 150, 200, 250, 300])
y_pred = np.array([110, 145, 195, 260, 290])
# Calcular mètriques
r2 = r2_score(y_true, y_pred)
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse) # o mean_squared_error(y_true, y_pred, squared=False)
mae = mean_absolute_error(y_true, y_pred)
print(f"R² = {r2:.4f}")
print(f"MSE = {mse:.2f}")
print(f"RMSE = {rmse:.2f}")
print(f"MAE = {mae:.2f}")
Recomanacions pràctiques
Sempre avalua amb múltiples mètriques per obtenir una visió completa del rendiment del model:
- R² → Visió general: Quin % de variabilitat explica el model?
- RMSE → Error típic en unitats originals: De mitjana, quant m’equivoco?
- MAE → Error absolut mitjà: Tracta tots els errors per igual
Regla d’or: Compara RMSE vs MAE per detectar problemes:
- Si RMSE >> MAE: Tens outliers que distorsionen les prediccions
- Si RMSE ≈ MAE: Els errors són uniformes i el model és estable
Quina mètrica prioritzar segons el context?
- Presentar resultats a clients/stakeholders → R² (fàcil d’interpretar: “explico el 85% de la variabilitat”)
- Entendre l’error típic del negoci → RMSE (“m’equivoco una mitjana de 5.000€”)
- Dades amb valors extrems (outliers) → MAE (menys sensible a extrems)
- Entrenar/optimitzar el model → MSE (matemàticament convenient)
Workflow recomanat:
- Calcula totes les mètriques (R², RMSE, MAE, MSE)
- Usa R² per avaluar si el model té sentit (> 0.7 és generalment bo)
- Usa RMSE/MAE per quantificar l’error en termes del negoci
- Compara RMSE/MAE per identificar si els outliers són un problema
Mètriques per a classificació
Quan entrenem un model de classificació, necessitem mètriques que ens diguin com de bé funciona. A diferència de la regressió, aquí no predim números sinó categories, per tant necessitem mètriques diferents.
Taxa d’encerts (Accuracy)
La taxa d’encerts (accuracy) és la mesura més senzilla i intuïtiva.
Accuracy=Nombre de prediccions correctesNombre total de prediccions
En altres paraules, indica el percentatge de casos en què el model encerta la classe respecte al total de mostres.
Per exemple, si tenim 100 exemples i el model classifica correctament 90 d’ells, l’accuracy és:
90100=0.9(90%)
Limitacions de l’Accuracy:
L’accuracy pot ser molt enganyosa en situacions comunes:
Exemple pràctic: Imagina que vols detectar una malaltia rara que només afecta l’1% de la població. Si el teu model sempre prediu “no malalt”, tindrà un 99% d’accuracy! Però el model és completament inútil perquè no detecta cap cas real de la malaltia.
Per això necessitem mètriques més sofisticades que distingeixin entre tipus d’errors.
Matriu de Confusió
La matriu de confusió és la base per entendre totes les altres mètriques de classificació. Mostra els quatre tipus possibles de resultats:
| Predicció: Positiu | Predicció: Negatiu | |
|---|---|---|
| Real: Positiu | TP (True Positive) | FN (False Negative) |
| Real: Negatiu | FP (False Positive) | TN (True Negative) |
Definicions:
- TP (Veritables Positius): Casos positius que hem identificat correctament
- TN (Veritables Negatius): Casos negatius que hem identificat correctament
- FP (Falsos Positius): Casos negatius que hem classificat erròniament com a positius (Error Tipus I)
- FN (Falsos Negatius): Casos positius que hem classificat erròniament com a negatius (Error Tipus II)
Exemple mèdic: En una prova de càncer:
- TP: Detectem càncer i realment el té
- TN: Diem que no té càncer i realment no en té
- FP: Diem que té càncer però no en té (falsa alarma, ansietat innecessària)
- FN: Diem que no té càncer però sí que en té (molt perillós! tractament tardà)
Accuracy=TP+TNTP+TN+FP+FN
Precision (Precisió)
La precision respon a la pregunta: “Dels casos que he predit com a positius, quants ho són realment?”
Precision=TPTP+FP
Interpretació:
- Precision alta: Quan dic que és positiu, gairebé sempre encerto
- Precision baixa: Faig moltes falses alarmes (falsos positius)
Quan és important? Quan els falsos positius són costosos.
Exemples:
- Sistema de spam: Si la precision és baixa, molts correus importants aniran a spam (molt molest!)
- Sistema de recomanació de productes: Si la precision és baixa, recomanem productes que no interessen (mala experiència d’usuari)
Recall (Sensibilitat o Exhaustivitat)
El recall respon a la pregunta: “De tots els casos que són realment positius, quants n’he detectat?”
Recall=TPTP+FN
Interpretació:
- Recall alt: Detecto quasi tots els casos positius reals
- Recall baix: Em deixo molts casos positius sense detectar (falsos negatius)
Quan és important? Quan els falsos negatius són costosos o perillosos.
Exemples:
- Diagnòstic de malalties greus: Recall baix significa que no detectem malalts reals (molt perillós!)
- Detecció de frau: Recall baix significa que deixem passar fraus reals (pèrdues econòmiques)
- Sistemes de seguretat: Recall baix significa que no detectem amenaces reals
Trade-off entre Precision i Recall
Hi ha un compromís inevitable entre precision i recall:
-
Model molt estricte (prediu positiu només si està MOLT segur):
- Precision alta (poques falses alarmes)
- Recall baix (es deixa casos positius)
-
Model molt permissiu (prediu positiu amb poca evidència):
- Recall alt (detecta gairebé tots els positius)
- Precision baixa (moltes falses alarmes)
Analogia: És com un detector de metalls a l’aeroport:
- Molt sensible: Detectarà tot (recall alt) però sonarà constantment amb petits objectes (precision baixa)
- Poc sensible: Només sonarà amb objectes grans (precision alta) però es pot deixar coses perilloses (recall baix)
F1-Score
El F1-Score és la mitjana harmònica de precision i recall, combinant ambdues mètriques en un sol número.
F1=2×Precision×RecallPrecision+Recall=2×TP2×TP+FP+FN
Per què mitjana harmònica? Penalitza desequilibris. Si una mètrica és molt baixa, el F1 també serà baix, encara que l’altra sigui alta.
Nota: L’F1 score és equivalent a la mitjana harmònica de precisió i recall.
Exemple:
- Precision = 0.9, Recall = 0.9 → F1 = 0.90 (excel·lent i equilibrat)
- Precision = 1.0, Recall = 0.1 → F1 = 0.18 (desequilibrat, F1 baix)
- Precision = 0.5, Recall = 0.5 → F1 = 0.50 (equilibrat però mediocre)
Quan usar F1?
- Quan vols un equilibri entre precision i recall
- Quan ambdós tipus d’error són igualment importants
- Com a mètrica única per comparar models
Variants: F2-Score (dóna més pes al recall), F0.5-Score (dóna més pes a la precision)
Log Loss (Entropia creuada)
El Log Loss és l’equivalent a MSE per a classificació. Mesura com de bones són les probabilitats que prediu el model, no només si encerta la classe.
Log Loss=−1mm∑i=1[yilog(ˆyi)+(1−yi)log(1−ˆyi)]
On:
- ŷᵢ: Probabilitat predita que l’exemple i sigui de la classe 1
- yᵢ: Classe real (0 o 1)
Nota: Aquesta fórmula és per a classificació binària. Per a multiclasse, s’utilitza la generalització categorical cross-entropy.
Interpretació:
- Log Loss baix: El model dóna probabilitats precises
- Log Loss alt: El model dóna probabilitats errònies o és molt insegur
Diferència amb Accuracy:
- Dos models poden tenir la mateixa accuracy però Log Loss diferent
- Un model que prediu probabilitats de 0.51 vs 0.99 per a la classe correcta tindrà accuracy igual però Log Loss molt diferent
Exemple:
- Model A: Prediu 0.99 de probabilitat i és correcte → Log Loss molt baix
- Model B: Prediu 0.51 de probabilitat i és correcte → Log Loss més alt
- Ambdós encerten (accuracy igual) però Model A és més “segur” i millor
Per què és important? Moltes aplicacions necessiten probabilitats bones, no només prediccions:
- Recomanació de productes (ordenar per probabilitat)
- Diagnòstic mèdic (necessites saber quant de segur està el model)
- Sistemes de presa de decisions
El Llindar de Decisió
Abans d’entendre les corbes ROC i Precision-Recall, cal comprendre un concepte clau: el llindar de decisió.
Què és el llindar de decisió? Quan un model de classificació binària fa una predicció, normalment retorna una probabilitat entre 0 i 1. Per convertir aquesta probabilitat en una predicció de classe, utilitzem un llindar (threshold):
- Si
probabilitat >= llindar→ Predim classe Positiva (1) - Si
probabilitat < llindar→ Predim classe Negativa (0)
El llindar més comú és 0.5, però no sempre és òptim per a tots els problemes.
Per què importa el llindar?
Canviar el llindar afecta directament al trade-off entre Precision i Recall, i per tant al rendiment global del model.
Exemple pràctic:
# Probabilitats predites pel model
probabilitats = [0.9, 0.7, 0.45, 0.3, 0.1]
# Amb llindar = 0.5 (estàndard)
prediccions_05 = [1, 1, 0, 0, 0] # Només els 2 primers són positius
# Amb llindar = 0.4 (més permissiu)
prediccions_04 = [1, 1, 1, 0, 0] # Ara també el tercer és positiu
# Amb llindar = 0.8 (més estricte)
prediccions_08 = [1, 0, 0, 0, 0] # Només el primer és positiu
Tant la corba ROC com la corba Precision-Recall avaluen el model a través de tots els possibles llindars, oferint una visió completa del seu rendiment.
Corba ROC-AUC
La corba ROC (Receiver Operating Characteristic) i l’AUC (Area Under the Curve) mesuren la capacitat del model per discriminar entre classes a través de tots els possibles llindars de decisió.
Com funciona la corba ROC
La corba ROC visualitza el rendiment del model representant:
-
Eix Y (TPR - True Positive Rate): També conegut com Recall o Sensibilitat TPR=TPTP+FN=Recall
Mesura: “De tots els positius reals, quin % detectem?” -
Eix X (FPR - False Positive Rate): Taxa de falsos positius FPR=FPFP+TN
Mesura: “De tots els negatius reals, quin % classifiquem erròniament com a positius?”
Interpretació de la corba ROC
Punts clau:
- Línia diagonal (AUC=0.5): Model aleatori, equivalent a llançar una moneda
- Corba cap amunt esquerra (AUC>0.5): Millor que l’atzar
- Línia superior esquerra (AUC=1.0): Model perfecte (TPR=1, FPR=0)
Què és l’AUC?
L’AUC (Area Under the Curve) és l’àrea sota la corba ROC, un valor entre 0 i 1 que resumeix el rendiment global del model.
Interpretació intuïtiva: L’AUC representa la probabilitat que el model assigni una probabilitat més alta a un exemple positiu aleatori que a un exemple negatiu aleatori.
Per exemple, AUC = 0.85 significa que, si agafes un cas positiu i un negatiu a l’atzar, el model assignarà correctament una probabilitat més alta al positiu en el 85% dels casos.
Avantatges del ROC-AUC:
- Independent del llindar: Avalua el model a través de tots els llindars possibles
- Fàcil de comparar models: Un sol número (AUC) per comparar
- Visualització intuïtiva: La corba mostra clarament el trade-off entre TPR i FPR
- Permet ajustar el llindar: Pots escollir el llindar òptim segons el context
- Considera ambdues classes: Té en compte tant verdaders positius com verdaders negatius
Limitacions del ROC-AUC
-
Pot ser optimista amb classes molt desbalancejades: Si tens 99% de negatius i 1% de positius, ROC-AUC pot donar una falsa sensació de bon rendiment perquè el FPR es calcula sobre molts negatius
-
No indica el millor llindar: Només mostra el rendiment a tots els llindars, però no diu quin usar. Cal decidir el llindar segons el cost dels errors (FP vs FN)
-
Només per a classificació binària (o per parelles de classes en multiclasse)
-
No distingeix entre tipus d’errors: Un FP i un FN compten igual, però sovint tenen costos diferents
-
Pot amagar problemes amb dades desbalancejades: El gran nombre de TN pot “inflar” artificialment la mètrica
Usar ROC-AUC quan:
- Vols comparar diferents models de forma global
- No estàs segur de quin llindar utilitzar
- Les classes estan relativament balancejades (ex: 30%-70% o millor)
- T’interessa el rendiment global sobre ambdues classes
- Vols una mètrica robusta i independent del llindar
NO usar ROC-AUC quan:
- Classes extremadament desbalancejades (ex: 1%-99%) → usar Precision-Recall
- Necessites saber el rendiment a un llindar específic → usar Precision/Recall/F1
- Els costos de FP i FN són molt diferents → usar mètriques de cost
- El focus està només en la classe positiva → usar Precision-Recall
Corba Precision-Recall
La corba Precision-Recall mostra el rendiment d’un model binari a través de tots els possibles llindars, centrant-se només en la classe positiva. És especialment útil quan les dades estan desequilibrades (pocs positius).
La corba Precision-Recall visualitza el rendiment del model representant:
-
Eix Y (Precision - Precisió)
Precision=TPTP+FPMesura: “De tots els que hem classificat com a positius, quin % ho són realment?” -
Eix X (Recall - Exhaustivitat o Sensibilitat)
Recall=TPTP+FNMesura: “De tots els positius reals, quin % hem detectat?”
Interpretació de la corba Precision-Recall:
- Corba alta cap amunt dreta → millor rendiment (alta precisió i alt recall)
- Corba baixa o plana → el model genera molts falsos positius o no detecta prou positius
- El punt (Recall=1, Precision=proporció de positius) → línia de base d’un model aleatori
Què és l’AP (Average Precision)?
L’Average Precision (AP) és l’àrea sota la corba Precision-Recall, anàloga a l’AUC de la corba ROC. És un valor entre 0 i 1 que resumeix el rendiment global del model.
Interpretació intuïtiva: La corba PR mostra com de bé el model identifica positius sense “embrutar-se” amb massa falsos positius:
- Si la precisió cau ràpidament quan augmenta el recall, el model confon molts negatius amb positius
- Si la corba es manté alta, el model detecta positius amb confiança
Avantatges de Precision-Recall:
- Focus en la classe positiva: Només considera TP, FP i FN. Ignora els TN, que sovint són la majoria
- Millor per classes desbalancejades: No es veu “inflada” per un gran nombre de verdaders negatius
- Més sensible a canvis: Reflecteix millor millores en la detecció de positius
- Rellevant per molts casos reals: En frau, diagnòstic, etc., ens importa més detectar positius que evitar falses alarmes
- Independent del llindar: Com ROC, avalua tots els llindars possibles
Limitacions de Precision-Recall:
- Més difícil d’interpretar: Menys intuïtiva que ROC per a principiants
- No hi ha baseline universal clar: La línia de referència depèn de la proporció de positius al dataset
- Varia més entre datasets: Més sensible a la distribució de classes que ROC-AUC
- Només per a classificació binària (o per parelles de classes en multiclasse)
- Ignora els verdaders negatius: No té en compte com de bé classifiquem els negatius
Usar Precision-Recall quan:
- Les classes estan molt desbalancejades (ex: 1%-99%, 5%-95%)
- T’importa principalment la classe positiva minoritària
- Els falsos positius i falsos negatius tenen costos similars
- Vols una visió clara de com detectes la classe d’interès
- Treballes amb problemes com: frau, malalties rares, detecció d’anomalies
NO usar Precision-Recall quan:
- Les classes estan balancejades → usar ROC-AUC
- T’interessa el rendiment sobre ambdues classes per igual
- Necessites una mètrica més estandarditzada per comparar amb literatura
ROC-AUC vs Precision-Recall: Quan usar cada una
Regla pràctica ràpida:
Proporció de classes → Mètrica recomanada
- Balancejades (40-60%) → ROC-AUC
- Lleument desbalancejades (20-80%) → ROC-AUC o ambdues
- Moderadament desbalancejades (10-90%) → Precision-Recall (prioritària)
- Molt desbalancejades (<5% positius) → Precision-Recall (obligatòria)
Taula comparativa:
| Aspecte | ROC-AUC | Precision-Recall |
|---|---|---|
| Focus | Ambdues classes (positius i negatius) | Només classe positiva |
| Millor per | Classes balancejades | Classes desbalancejades |
| Sensibilitat a TN | Sí (pot inflar-se) | No (ignora TN) |
| Interpretació | Més intuïtiva | Menys intuïtiva |
| Baseline | 0.5 (línia diagonal) | Proporció de positius |
| Optimisme en desbalanceig | Sí, pot ser optimista | No, més realista |
Casos d’ús específics:
Usar ROC-AUC:
- Diagnòstic mèdic amb prevalença normal (~20-50%)
- Classificació de sentiment (positiu/negatiu)
- Detecció de spam en entorns equilibrats
- A/B testing amb conversions normals
Usar Precision-Recall:
- Detecció de frau (0.1%-2% de casos)
- Malalties rares (<1% de prevalença)
- Detecció d’anomalies en sistemes
- Clics en publicitat (CTR baix)
- Recuperació d’informació (pocs documents rellevants)
Consell: En casos dubtosos, calcula i visualitza ambdues corbes. Ofereixen perspectives complementàries.
Classes Desbalancejades
Quan treballem en aplicacions de machine learning on la proporció d’exemples positius i negatius és molt desigual (per exemple, molt lluny d’un repartiment 50-50), les mètriques habituals com la taxa d’encerts (accuracy) no són adequades.
La taxa d’encerts es defineix com el nombre de prediccions correctes respecte del total. Per exemple: imaginem que entrenem un classificador binari per detectar una malaltia rara a partir de proves mèdiques.
- Definim y=1 si el pacient té la malaltia (cas rar), i y=0 altrament.
- Suposem que obtenim un 1% d’error al conjunt de test, és a dir, una taxa d’encerts del 99%.
Sembla un gran resultat, però si només 0,5% dels pacients tenen realment la malaltia, un programa trivial que sempre prediu y=0 ja aconseguiria una taxa d’encerts del 99,5%. Aquesta estratègia, tot i ser inútil en la pràctica, superaria el nostre model.
Això mostra que l’accuracy no és fiable en situacions amb dades desbalancejades.
Per què és problemàtic?
-
L’accuracy és enganyosa: Un model que sempre prediu la classe majoritària té alta accuracy però és inútil
Exemple: Si sempre prediuem “no frau” en un dataset amb 99% de transaccions legítimes:
- Accuracy = 99% ✓ (sembla excel·lent!)
- Recall = 0% ✗ (no detecta cap frau!)
- F1 = 0 ✗ (el model és inútil)
-
El model tendeix a ignorar la classe minoritària: Aprèn que “sempre dir negatiu” minimitza l’error global
-
ROC-AUC pot ser massa optimista: El gran nombre de TN pot amagar problemes en la detecció de positius
Impacte en ROC vs Precision-Recall
ROC-AUC amb classes desbalancejades:
- El FPR es calcula sobre molts negatius: FPR = FP / (FP + TN)
- Fins i tot molts FP poden resultar en un FPR baix
- Pot donar ROC-AUC = 0.85 quan el model és poc útil en la pràctica
Precision-Recall amb classes desbalancejades:
- La Precision només considera positius: Precision = TP / (TP + FP)
- No es veu afectada pel gran nombre de TN
- Reflecteix millor si el model és útil per detectar la classe positiva
Solucions pràctiques:
-
Usar mètriques adequades:
- No usar accuracy
- Usar Precision-Recall i Average Precision
- Usar F1-Score (equilibra Precision i Recall)
- Usar ROC-AUC amb precaució, complementant amb PR
-
Balancejar les dades:
- Oversampling: Duplicar exemples de la classe minoritària
- Undersampling: Reduir exemples de la classe majoritària
- SMOTE: Generar exemples sintètics de la classe minoritària
-
Ajustar pesos de classe:
- Donar més pes a la classe minoritària en la funció de cost
- Exemple en scikit-learn:
class_weight='balanced'
-
Ajustar el llindar de decisió:
- En lloc de 0.5, usar un llindar més baix (ex: 0.3) per detectar més positius
- Analitzar la corba PR per trobar el llindar òptim segons el context
Exemple Complet: Detecció de Frau
Imaginem un model per detectar transaccions fraudulentes on només l’1% són fraus reals.
Context del problema:
- Dataset: 10,000 transaccions
- Positius (fraus): 100 transaccions (1%)
- Negatius (legítimes): 9,900 transaccions (99%)
Compararem dos models, el naïf i l’entrenat adequadament.
Model A: Predictor naïf (sempre prediu “no frau”)
Prediccions: Totes = 0 (negatiu)
Matriu de confusió:
Predició
Neg Pos
Real Neg [9900 0]
Pos [ 100 0]
TP=0, TN=9900, FP=0, FN=100
Mètriques:
- Accuracy: 9900/10000 = 99% ✓ (sembla excel·lent!)
- Precision: 0/0 = undefined (no prediu cap frau)
- Recall: 0/100 = 0% ✗ (no detecta cap frau)
- F1-Score: 0 ✗
- ROC-AUC: 0.50 (aleatori, perquè no discrimina res)
Conclusió: Accuracy diu que és excel·lent, però el model és completament inútil. No detecta cap frau!
Model B: Model entrenat adequadament
Matriu de confusió (llindar = 0.5):
Predició
Neg Pos
Real Neg [9700 200]
Pos [ 40 60]
TP=60, TN=9700, FP=200, FN=40
Mètriques:
- Accuracy: 9760/10000 = 97.6% (sembla pitjor que Model A?)
- Precision: 60/260 = 23% (de 260 alertes, 60 són fraus reals)
- Recall: 60/100 = 60% (detecta 60 dels 100 fraus)
- F1-Score: 0.33
- ROC-AUC: 0.92 (excel·lent discriminació)
- Average Precision: 0.65 (bon rendiment en classe positiva)
Conclusió: Accuracy més baixa, però el model és infinitament més útil. Detecta 60% dels fraus amb poques falses alarmes.
Per què ROC-AUC pot enganyar aquí?
Model B té ROC-AUC = 0.92, que sembla excel·lent. Però:
- FPR = 200/(200+9700) = 2% (molt baix perquè hi ha molts negatius)
- TPR = 60/100 = 60%
El gran nombre de TN (9700) fa que el FPR sigui baixíssim fins i tot amb 200 FP, resultant en una ROC-AUC alta que pot ser massa optimista.
Per què Precision-Recall és millor aquí?
La corba PR mostra la realitat:
- Precision = 23% (només 1 de cada 4 alertes és frau real)
- Recall = 60%
- Average Precision = 0.65
Aquesta mètrica és més honesta sobre el rendiment real: el model és útil però no perfecte, i genera moltes falses alarmes relatives als fraus detectats.
En problemes amb classes molt desbalancejades, mai confiïs només en Accuracy o ROC-AUC. Usa sempre Precision-Recall per tenir una visió realista del rendiment.
Implementació amb Python
Aquí tens un exemple complet que mostra com calcular i visualitzar ambdues corbes:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import (
accuracy_score, precision_score, recall_score, f1_score,
confusion_matrix, log_loss, roc_auc_score, classification_report,
roc_curve, precision_recall_curve, average_precision_score
)
# Dades d'exemple
y_true = np.array([0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0])
y_pred = np.array([0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0])
y_prob = np.array([0.15, 0.82, 0.68, 0.75, 0.58, 0.22, 0.91, 0.34, 0.88, 0.45,
0.62, 0.12, 0.71, 0.48, 0.79, 0.08, 0.53, 0.85, 0.29, 0.19])
# ============================================
# 2. CORBA ROC-AUC
# ============================================
fpr, tpr, thresholds_roc = roc_curve(y_true, y_prob)
roc_auc = roc_auc_score(y_true, y_prob)
plt.figure(figsize=(16, 6))
# Subplot 1: ROC Curve
plt.subplot(1, 2, 1)
plt.plot(fpr, tpr, color='darkorange', lw=3,
label=f'Model (AUC = {roc_auc:.3f})', marker='o', markersize=6)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--',
label='Classificador aleatori (AUC = 0.50)')
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('Taxa de Falsos Positius (FPR)\n← Menys falses alarmes Més falses alarmes →',
fontsize=11)
plt.ylabel('Taxa de Vertaders Positius (TPR / Recall)\n← Menys fraus detectats Més fraus detectats →',
fontsize=11)
plt.title('Corba ROC - Detecció de Frau', fontsize=14, fontweight='bold')
plt.legend(loc="lower right", fontsize=10)
plt.grid(True, alpha=0.3)
# ============================================
# 3. CORBA PRECISION-RECALL
# ============================================
precision, recall, thresholds_pr = precision_recall_curve(y_true, y_prob)
avg_precision = average_precision_score(y_true, y_prob)
# Subplot 2: Precision-Recall Curve
plt.subplot(1, 2, 2)
plt.plot(recall, precision, color='purple', lw=3,
label=f'Model (AP = {avg_precision:.3f})', marker='o', markersize=6)
# Línia baseline (proporció de positius)
baseline = np.sum(y_true) / len(y_true)
plt.plot([0, 1], [baseline, baseline], color='navy', lw=2, linestyle='--',
label=f'Baseline (proporció positius = {baseline:.2f})')
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('Recall (Exhaustivitat)\n← Detectem menys positius Detectem més positius →',
fontsize=11)
plt.ylabel('Precision (Precisió)\n← Més falses alarmes Menys falses alarmes →',
fontsize=11)
plt.title('Corba Precision-Recall - Detecció de Frau', fontsize=14, fontweight='bold')
plt.legend(loc="lower left", fontsize=10)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Taula Resum de Totes les Mètriques
| Mètrica | Què mesura | Quan usar-la | Sensible a desbalanceig |
|---|---|---|---|
| Accuracy | % d’encerts totals | Classes balancejades, tots els errors igual d’importants | ❌ Sí, molt |
| Precision | Qualitat dels positius predits | Falsos positius costosos (spam, recomanacions) | ✅ No |
| Recall | % de positius detectats | Falsos negatius perillosos (malalties, frau) | ✅ No |
| F1-Score | Equilibri Precision-Recall | Compromís entre ambdós errors | ✅ No |
| Log Loss | Qualitat de les probabilitats | Necessites bones probabilitats, no només classes | ✅ No |
| ROC-AUC | Discriminació global entre classes | Classes balancejades, comparació de models | ⚠️ Parcialment |
| PR-AUC (AP) | Discriminació centrada en positius | Classes desbalancejades, focus en classe positiva | ✅ No |
Conclusions Finals
Punts clau a recordar:
-
El llindar de decisió és fonamental: Canviar-lo afecta tot el rendiment del model
-
ROC-AUC per visió global: Millor quan les classes estan balancejades i t’interessen ambdues classes
-
Precision-Recall per focus en positius: Imprescindible quan les classes estan desbalancejades
-
Accuracy pot enganyar: Mai la usis sola, especialment amb desbalanceig
-
Calcula ambdues corbes en cas de dubte: Ofereixen perspectives complementàries
Workflow recomanat:
- Analitza la proporció de classes al teu dataset
- Si desbalanceig > 80%-20% → Prioritza Precision-Recall
- Si balancejat → Usa ROC-AUC com a principal
- Sempre calcula ambdues corbes per tenir visió completa
- Analitza llindars per trobar el punt òptim segons el teu context
- Decideix el llindar segons el cost dels errors (FP vs FN)
La millor mètrica és la que reflecteix millor els objectius del teu problema real.
Extensió a classificació multiclasse
Totes les mètriques descrites anteriorment per a classificació binària també s’apliquen a classificació multiclasse (més de 2 classes), però amb algunes adaptacions importants.
Mètriques que funcionen igual:
- Accuracy: Es calcula exactament igual →
prediccions_correctes / total_prediccions - Log Loss: S’estén a categorical cross-entropy per múltiples classes
- Matriu de confusió: Passa a ser una matriu N×N (on N és el nombre de classes)
Mètriques que requereixen estratègies d’agregació:
Per a mètriques com Precision, Recall i F1-Score, hem de calcular-les per cada classe individualment i després agregar-les. Existeixen tres estratègies principals:
1. Macro-average (mitjana macro):
- Calcula la mètrica per cada classe i després fa la mitjana
- Tracta totes les classes amb la mateixa importància (independentment del nombre d’exemples)
- Quan usar-la: Quan totes les classes són igualment importants
- Fórmula:
(metric_class1 + metric_class2 + ... + metric_classN) / N
2. Weighted-average (mitjana ponderada):
- Calcula la mètrica per cada classe i fa una mitjana ponderada pel nombre d’exemples de cada classe
- Dóna més importància a les classes amb més exemples
- Quan usar-la: Quan vols reflectir la distribució real de les classes
- Fórmula:
Σ(metric_classi × n_classi) / n_total
3. Micro-average (mitjana micro):
- Agrega primer tots els TP, FP, FN de totes les classes i després calcula la mètrica global
- Dóna més pes a les classes majoritàries
- Quan usar-la: Quan vols optimitzar per al rendiment global
- Per a accuracy: micro = macro = accuracy (són equivalents)
Exemple pràctic:
from sklearn.metrics import classification_report, precision_score, recall_score, f1_score
# Classes: 0=Rosa, 1=Tulipa, 2=Marguerida
y_true = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2]
y_pred = [0, 0, 1, 1, 1, 0, 1, 2, 2, 0]
# Mètriques amb diferents estratègies
print(f"Precision (macro): {precision_score(y_true, y_pred, average='macro'):.4f}")
print(f"Precision (weighted): {precision_score(y_true, y_pred, average='weighted'):.4f}")
print(f"Precision (micro): {precision_score(y_true, y_pred, average='micro'):.4f}")
print(f"\nRecall (macro): {recall_score(y_true, y_pred, average='macro'):.4f}")
print(f"Recall (weighted): {recall_score(y_true, y_pred, average='weighted'):.4f}")
print(f"Recall (micro): {recall_score(y_true, y_pred, average='micro'):.4f}")
print(f"\nF1 (macro): {f1_score(y_true, y_pred, average='macro'):.4f}")
print(f"F1 (weighted): {f1_score(y_true, y_pred, average='weighted'):.4f}")
print(f"F1 (micro): {f1_score(y_true, y_pred, average='micro'):.4f}")
# Informe complet per classe
print("\nInforme detallat per classe:")
print(classification_report(y_true, y_pred, target_names=['Rosa', 'Tulipa', 'Marguerida']))
Matriu de confusió multiclasse:
Predicció
Rosa Tulipa Marguerida
Real Rosa 2 1 0
Tulipa 1 3 0
Marguerida 1 0 2
Cada fila representa els valors reals, cada columna les prediccions. Els elements de la diagonal són els encerts.
Consells per multiclasse:
- Sempre revisa la matriu de confusió → Identifica quines classes es confonen entre elles
- Usa
classification_report→ Mostra precision/recall/F1 per cada classe individualment - Escull l’estratègia d’agregació adequada:
- Classes balancejades i igual importància → macro
- Classes desbalancejades però totes importants → macro
- Vols reflectir distribució real → weighted
- Optimització global → micro
Recomanacions pràctiques
⚠️ Regla d’or: MAI confiïs només en accuracy, especialment amb classes desbalancejades. Un model que sempre prediu la classe majoritària pot tenir 95% accuracy i ser completament inútil.
Workflow recomanat:
- Comença amb la matriu de confusió → Entén quins errors fa el model (FP vs FN)
- Identifica quin error és més costós → Això determina la teva mètrica prioritària
- Avalua amb múltiples mètriques → Cap mètrica única explica tot el comportament
Quina mètrica prioritzar segons el cost dels errors?
| Context | Error més perillós | Mètrica clau | Exemple |
|---|---|---|---|
| Falsos positius costosos | FP | Precision | Spam (no perdre emails importants) |
| Falsos negatius perillosos | FN | Recall | Malalties greus (no deixar casos sense diagnosticar) |
| Ambdós errors importants | FP i FN | F1-Score | Frau (equilibri entre detectar fraus i evitar falses alarmes) |
| Necessites probabilitats | — | Log Loss | Recomanacions (ordenar per confiança) |
| Comparar models | — | ROC-AUC | Avaluació independent del llindar |
Casos especials:
-
Classes desbalancejades (ex: 1% positius)?
- No usar: Accuracy
- Usar: F1-Score, Precision/Recall, ROC-AUC
- Considera: Ajustar pesos, balancejar dades, canviar el llindar
-
Incertesa en els costos dels errors?
- Usa F1-Score com a compromís raonable
- Analitza la corba Precision-Recall per veure el trade-off
- Consulta amb els stakeholders per entendre el negoci
-
Model per a producció amb llindar ajustable?
- Usa ROC-AUC per avaluar capacitat de discriminació
- Ajusta el llindar segons les necessitats del negoci
- Monitoritza Precision i Recall al llindar escollit