Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Mètriques d’avaluació

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-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=1mi=1(yiˆyi)2mi=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=1mmi=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=1mmi=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=1mmi=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ètricaUnitatsSensibilitat a outliersInterpretacióQuan usar-la
Sense unitats (0-1)Mitjana% de variabilitat explicadaComparar models, veure quant explica el model
MSEUnitats²Molt altaError quadràtic mitjàOptimització matemàtica, funcions de cost
RMSEUnitats originalsAltaError típicQuan vols saber l’error típic en unitats originals
MAEUnitats originalsBaixaError mitjà absolutQuan 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:

  1. → Visió general: Quin % de variabilitat explica el model?
  2. RMSE → Error típic en unitats originals: De mitjana, quant m’equivoco?
  3. 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 → (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:

  1. Calcula totes les mètriques (R², RMSE, MAE, MSE)
  2. Usa R² per avaluar si el model té sentit (> 0.7 és generalment bo)
  3. Usa RMSE/MAE per quantificar l’error en termes del negoci
  4. 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ó: PositiuPredicció: Negatiu
Real: PositiuTP (True Positive)FN (False Negative)
Real: NegatiuFP (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=1mmi=1[yilog(ˆyi)+(1yi)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?”

00.20.40.60.8100.20.40.60.81
ROC curve (AUC = 0.93)Random (AUC = 0.50)Receiver Operating Characteristic (ROC) CurveFalse Positive Rate (FPR)True Positive Rate (TPR)

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:

  1. Independent del llindar: Avalua el model a través de tots els llindars possibles
  2. Fàcil de comparar models: Un sol número (AUC) per comparar
  3. Visualització intuïtiva: La corba mostra clarament el trade-off entre TPR i FPR
  4. Permet ajustar el llindar: Pots escollir el llindar òptim segons el context
  5. Considera ambdues classes: Té en compte tant verdaders positius com verdaders negatius

Limitacions del ROC-AUC

  1. 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

  2. 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)

  3. Només per a classificació binària (o per parelles de classes en multiclasse)

  4. No distingeix entre tipus d’errors: Un FP i un FN compten igual, però sovint tenen costos diferents

  5. 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+FP

    Mesura: “De tots els que hem classificat com a positius, quin % ho són realment?”

  • Eix X (Recall - Exhaustivitat o Sensibilitat)
    Recall=TPTP+FN

    Mesura: “De tots els positius reals, quin % hem detectat?”

00.20.40.60.8100.20.40.60.81
PR curve (AP = 0.93)Baseline (random)Precision–Recall (PR) CurveRecallPrecision

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:

  1. Focus en la classe positiva: Només considera TP, FP i FN. Ignora els TN, que sovint són la majoria
  2. Millor per classes desbalancejades: No es veu “inflada” per un gran nombre de verdaders negatius
  3. Més sensible a canvis: Reflecteix millor millores en la detecció de positius
  4. Rellevant per molts casos reals: En frau, diagnòstic, etc., ens importa més detectar positius que evitar falses alarmes
  5. Independent del llindar: Com ROC, avalua tots els llindars possibles

Limitacions de Precision-Recall:

  1. Més difícil d’interpretar: Menys intuïtiva que ROC per a principiants
  2. No hi ha baseline universal clar: La línia de referència depèn de la proporció de positius al dataset
  3. Varia més entre datasets: Més sensible a la distribució de classes que ROC-AUC
  4. Només per a classificació binària (o per parelles de classes en multiclasse)
  5. 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 classesMè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:

AspecteROC-AUCPrecision-Recall
FocusAmbdues classes (positius i negatius)Només classe positiva
Millor perClasses balancejadesClasses desbalancejades
Sensibilitat a TNSí (pot inflar-se)No (ignora TN)
InterpretacióMés intuïtivaMenys intuïtiva
Baseline0.5 (línia diagonal)Proporció de positius
Optimisme en desbalanceigSí, pot ser optimistaNo, 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?

  1. 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)
  2. El model tendeix a ignorar la classe minoritària: Aprèn que “sempre dir negatiu” minimitza l’error global

  3. 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:

  1. 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
  2. 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
  3. 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'
  4. 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ètricaQuè mesuraQuan usar-laSensible a desbalanceig
Accuracy% d’encerts totalsClasses balancejades, tots els errors igual d’importants❌ Sí, molt
PrecisionQualitat dels positius preditsFalsos positius costosos (spam, recomanacions)✅ No
Recall% de positius detectatsFalsos negatius perillosos (malalties, frau)✅ No
F1-ScoreEquilibri Precision-RecallCompromís entre ambdós errors✅ No
Log LossQualitat de les probabilitatsNecessites bones probabilitats, no només classes✅ No
ROC-AUCDiscriminació global entre classesClasses balancejades, comparació de models⚠️ Parcialment
PR-AUC (AP)Discriminació centrada en positiusClasses desbalancejades, focus en classe positiva✅ No

Conclusions Finals

Punts clau a recordar:

  1. El llindar de decisió és fonamental: Canviar-lo afecta tot el rendiment del model

  2. ROC-AUC per visió global: Millor quan les classes estan balancejades i t’interessen ambdues classes

  3. Precision-Recall per focus en positius: Imprescindible quan les classes estan desbalancejades

  4. Accuracy pot enganyar: Mai la usis sola, especialment amb desbalanceig

  5. Calcula ambdues corbes en cas de dubte: Ofereixen perspectives complementàries

Workflow recomanat:

  1. Analitza la proporció de classes al teu dataset
  2. Si desbalanceig > 80%-20% → Prioritza Precision-Recall
  3. Si balancejat → Usa ROC-AUC com a principal
  4. Sempre calcula ambdues corbes per tenir visió completa
  5. Analitza llindars per trobar el punt òptim segons el teu context
  6. 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:

  1. Sempre revisa la matriu de confusió → Identifica quines classes es confonen entre elles
  2. Usa classification_report → Mostra precision/recall/F1 per cada classe individualment
  3. 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:

  1. Comença amb la matriu de confusió → Entén quins errors fa el model (FP vs FN)
  2. Identifica quin error és més costós → Això determina la teva mètrica prioritària
  3. Avalua amb múltiples mètriques → Cap mètrica única explica tot el comportament

Quina mètrica prioritzar segons el cost dels errors?

ContextError més perillósMètrica clauExemple
Falsos positius costososFPPrecisionSpam (no perdre emails importants)
Falsos negatius perillososFNRecallMalalties greus (no deixar casos sense diagnosticar)
Ambdós errors importantsFP i FNF1-ScoreFrau (equilibri entre detectar fraus i evitar falses alarmes)
Necessites probabilitatsLog LossRecomanacions (ordenar per confiança)
Comparar modelsROC-AUCAvaluació 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