Svelando il potere dell’aggiustamento del bias migliorare la precisione predittiva nei dataset sbilanciati

Svelando il potere dell'aggiustamento del bias per migliorare la precisione predittiva nei dataset sbilanciati

Risolvere lo squilibrio di classe è cruciale per previsioni accurate nella scienza dei dati. Questo articolo introduce l’Adeguamento del Bias per migliorare l’accuratezza del modello in presenza di uno squilibrio di classe. Esplora come l’Adeguamento del Bias ottimizza le previsioni e supera questa sfida.

Introduzione

Nel campo della scienza dei dati, gestire efficacemente i dataset sbilanciati è fondamentale per previsioni precise. I dataset sbilanciati, caratterizzati da significative disparità di classe, possono portare a modelli distorti a favore della classe maggioritaria e a prestazioni inferiori per la classe minoritaria, soprattutto in contesti critici come la rilevazione delle frodi e la diagnosi di malattie.

Questo articolo introduce un rimedio pragmatico noto come Adeguamento del Bias. Regolando il termine di bias all’interno del modello, contrasta lo squilibrio di classe, rafforzando l’abilità del modello di effettuare previsioni accurate sia per la classe maggioritaria che per quella minoritaria. L’articolo illustra algoritmi adatti alla classificazione binaria e multi-classe, seguiti da un’analisi dei principi sottostanti. In particolare, la sezione “Spiegazione dell’Algoritmo e Principi Sottostanti” stabilisce in modo rigoroso un collegamento teorico tra il mio algoritmo, il sovracampionamento e l’aggiustamento dei pesi delle classi, migliorando la comprensione del lettore.

Per sostenere l’efficacia e la logica, uno studio di simulazione analizza la relazione tra l’Adeguamento del Bias e il sovracampionamento. Inoltre, viene utilizzata un’applicazione pratica per illustrare l’implementazione e i benefici tangibili dell’Adeguamento del Bias nella rilevazione delle frodi con le carte di credito.

L’Adeguamento del Bias offre una strada diretta e impattante per migliorare i risultati della modellazione predittiva di fronte a uno squilibrio di classe. Questo articolo fornisce una comprensione completa del meccanismo, dei principi e delle implicazioni reali dell’Adeguamento del Bias, rendendolo uno strumento prezioso per i data scientist che desiderano migliorare le prestazioni del modello in presenza di dataset sbilanciati.

Algoritmo

L’algoritmo di Adeguamento del Bias introduce una metodologia per affrontare lo squilibrio di classe nei compiti di classificazione binaria e multi-classe. Ricalibrando il termine di bias ad ogni epoca, l’algoritmo migliora la capacità del modello di gestire efficacemente dataset sbilanciati. Regolando il termine di bias, l’algoritmo rende il modello più sensibile alle istanze della classe minoritaria, migliorando così l’accuratezza della classificazione.

Modello f(x) e il suo Ruolo nelle Previsioni

Alla base del nostro algoritmo di adeguamento del bias si trova il concetto di f(x) – un fattore cruciale che guida il nostro approccio per affrontare lo squilibrio di classe. f(x) funge da collegamento tra le caratteristiche di input x e le previsioni finali. Nella classificazione binaria, agisce come una mappatura che trasforma gli input in valori reali, allineati con l’attivazione sigmoide per l’interpretazione delle probabilità. Nella classificazione multi-classe, f(x) si trasforma in un insieme di funzioni, f_k(x), in cui ogni classe k ha la propria funzione, che lavora in sincronia con l’attivazione softmax. Questa distinzione è fondamentale nel nostro algoritmo di adeguamento del bias, in cui utilizziamo f(x) per regolare i termini di bias e migliorare la sensibilità allo squilibrio di classe.

Breve Panoramica dell’Algoritmo

Il concetto dell’algoritmo è semplice: calcolare la media di f_k(x) per ogni classe k e rappresentare questa media come δk. Sottraendo δk da f_k(x), ci assicuriamo che il valore atteso di f_k(x) – δk diventi 0 per ogni classe k. Di conseguenza, il modello prevede che ogni classe abbia la stessa probabilità di verificarsi. Sebbene questo fornisca un breve sguardo alla logica dell’algoritmo, è importante notare che questo approccio è supportato da fondamenta teoriche e matematiche, che saranno esplorate ulteriormente nelle sezioni successive di questo articolo.

Algoritmo per la Classificazione Binaria

Creato dall'Autore

Utilizzo per la Previsione: Per effettuare previsioni, applicare l’ultimo valore δ calcolato dall’algoritmo. Questo valore δ riflette gli aggiustamenti cumulativi effettuati durante l’addestramento e funge da base per il termine di bias finale nella funzione di attivazione sigmoide durante la previsione.

Algoritmo per la Classificazione Multi-Classe

Creato dall'Autore

Utilizzo per la previsione: Il culmine del processo di addestramento del nostro algoritmo produce un elemento cruciale – l’ultimo valore δk calcolato. Questo valore δk racchiude gli aggiustamenti cumulativi del termine di bias che sono stati meticolosamente orchestrati durante l’addestramento. La sua importanza risiede nel suo ruolo come parametro fondamentale per il termine di bias finale nella funzione di attivazione softmax durante la previsione.

Creato dall'autore

Spiegazione dell’algoritmo e principi sottostanti

Dall’oversampling all’aggiustamento del peso delle classi, dall’aggiustamento del peso delle classi al nuovo algoritmo

In questa sezione, ci immergiamo in un’esplorazione della Spiegazione dell’Algoritmo e dei Principi Sottostanti. Il nostro obiettivo è quello di chiarire la meccanica e la logica delle operazioni dell’algoritmo, fornendo una comprensione della sua efficacia nel risolvere il problema dello sbilanciamento delle classi nelle attività di classificazione.

Funzione di perdita e sbilanciamento

Iniziamo il nostro viaggio approfondendo il cuore dell’algoritmo, la funzione di perdita. Per la nostra esposizione iniziale, esamineremo la funzione di perdita senza affrontare direttamente il problema dello sbilanciamento delle classi. Consideriamo un problema di classificazione binaria, in cui la Classe 1 comprende il 90% delle osservazioni e la Classe 0 costituisce il restante 10%. Indicando l’insieme di osservazioni della Classe 1 come C1 e della Classe 0 come C0, prendiamo questo come punto di partenza.

La funzione di perdita, in assenza di affrontare lo sbilanciamento delle classi, ha la seguente forma:

Creato dall'autore

Nella ricerca dell’adattamento del modello, cerchiamo di minimizzare questa funzione di perdita:

Creato dall'autore

Mitigare lo sbilanciamento: Oversampling e aggiustamento dei pesi delle classi

Tuttavia, il nocciolo del nostro sforzo risiede nel risolvere il problema dello sbilanciamento delle classi. Per superare questa sfida, ci avventuriamo nell’utilizzo di tecniche di oversampling. Mentre esistono vari metodi di oversampling – che includono oversampling semplice, oversampling casuale, SMOTE e altri – il nostro focus, per chiarezza espositiva, si concentra sull’oversampling semplice, con uno sguardo all’oversampling casuale.

Oversampling semplice: Un approccio fondamentale nel nostro arsenale è l’oversampling semplice, una tecnica in cui duplichiamo le istanze della classe minoritaria di un fattore di otto per eguagliare la dimensione della classe maggioritaria. Nel nostro esempio illustrativo, in cui la classe minoritaria costituisce il 10% e la classe maggioritaria il restante 90%, duplichiamo le osservazioni della classe minoritaria otto volte, uguagliando efficacemente la distribuzione delle classi. Indicando l’insieme di osservazioni duplicate come D0, questo passaggio trasforma la nostra funzione di perdita come segue:

Creato dall'autore

Questo rivela una profonda intuizione: il principio fondamentale dell’oversampling semplice corrisponde in modo fluido al concetto di aggiustamento dei pesi delle classi. Duplicare la classe minoritaria otto volte equivale effettivamente ad aumentare il peso della classe minoritaria di nove volte. Significativamente, la tecnica dell’oversampling riflette il meccanismo dell’aggiustamento dei pesi.

Oversampling casuale: Una breve riflessione sull’oversampling casuale sottolinea un’osservazione parallela. L’oversampling casuale, simile al suo semplice controparte, funge da equivalente all’aggiustamento casuale dei pesi delle osservazioni.

Dall’aggiustamento dei pesi delle classi all’aggiustamento del bias

Una rivelazione chiave sottolinea il cuore del nostro approccio: l’equivalenza essenziale tra l’aggiustamento del bias, l’oversampling e l’aggiustamento dei pesi. Questa intuizione deriva da

“Prentice and Pyke (1979) … hanno dimostrato che, quando il modello contiene un termine costante (intercetta) per ogni categoria, questi termini costanti sono gli unici coefficienti influenzati dalla probabilità di selezione diseguale di Y” Scott & Wild (1986) [2]. Inoltre, Manski e Lerman (1977) mostrano lo stesso risultato nell’ambiente softmax [1].

Svelare la Significatività: Traducendo questa intuizione nel campo del machine learning, la costante (intercetta) termine è il termine di bias. Questa osservazione fondamentale rivela che quando ricalibriamo i pesi delle classi o i pesi delle osservazioni, i cambiamenti risultanti si manifestano principalmente come aggiustamenti al termine di bias. In parole semplici, il termine di bias agisce come il fulcro che collega la nostra strategia per affrontare lo sbilanciamento delle classi.

Una Prospettiva Unificata

Questa comprensione fornisce una spiegazione diretta di come il nostro algoritmo, il campionamento e l’aggiustamento dei pesi siano, in sostanza, intercambiabili e sostituibili. Questa unificazione semplifica il nostro approccio mantenendo la sua potenza nel mitigare le sfide dello sbilanciamento delle classi.

Studio di Simulazione: Verifica dell’Influenza del Termine di Bias attraverso il Campionamento

Per solidificare la nostra affermazione che il campionamento influenza principalmente il termine di bias mantenendo intatto il nucleo funzionale del modello, ci immergiamo in uno studio di simulazione mirato. Il nostro obiettivo è dimostrare empiricamente come le tecniche di campionamento influenzino esclusivamente il termine di bias, lasciando intatta l’essenza del modello.

La Configurazione della Simulazione

A scopo illustrativo, ci concentriamo su uno scenario semplificato: regressione logistica con una singola caratteristica. Il nostro modello è definito come:

Creato dall'Autore

dove 1(.) indica la funzione indicatrice, x_i è estratto da una distribuzione normale standard e e_i segue una distribuzione logistica. In questo contesto, impostiamo f(x)=x.

Esecuzione della Simulazione:

Utilizzando questa configurazione, esaminiamo attentamente l’impatto delle tecniche di campionamento sul termine di bias mantenendo costante il nucleo del modello. Procediamo con tre metodi di campionamento: campionamento semplice, SMOTE e campionamento casuale. Ogni metodo viene applicato attentamente e i risultati vengono registrati con cura.

Il frammento di codice Python riportato di seguito illustra il processo di simulazione:

# Carica Pacchettiimport numpy as npimport statsmodels.api as smfrom imblearn.over_sampling import SMOTE, RandomOverSampler# Imposta il seme di casualitànp.random.seed(1)# Crea Dati di Simulazionex = np.random.normal(size = 10000)y = (2.5 + x + np.random.logistic(size = 10000)) > 0# Il termine di bias è impostato su 2.5 e il coefficiente di x su 1# La dimensione della classe 1 è 9005print(sum(y == 1))# La dimensione della classe 0 è 995print(sum(y == 0))# Vogliamo far corrispondere la dimensione della classe 0 a quella della classe 1# Metodo 0 Non fare nullax0 = xy0 = ymethod0 = sm.Logit(y0, sm.add_constant(x0)).fit()print(method0.summary())  # Termine di bias di 2.54 e coefficiente x3 di 0.97# Metodo 1 Campionamento Semplicex1 = np.concatenate((x, np.repeat(x[y == 0], 8)))y1 = np.concatenate((y, np.array([0] * (len(x1) - len(x)))))method1 = sm.Logit(y1, sm.add_constant(x1)).fit()print(method1.summary())  # Termine di bias di 0.35 e coefficiente x3 di 0.98# Metodo 2 SMOTEsmote = SMOTE(random_state = 1)x2, y2 = smote.fit_resample(x[:, np.newaxis], y)method2 = sm.Logit(y2, sm.add_constant(x2)).fit()print(method2.summary())  # Termine di bias di 0.35 e coefficiente x3 di 1# Metodo 3 Campionamento Casualerandom_sampler = RandomOverSampler(random_state=1)x3, y3 = random_sampler.fit_resample(x[:, np.newaxis], y)method3 = sm.Logit(y3, sm.add_constant(x3)).fit()print(method3.summary()) # Termine di bias di 0.35 e coefficiente x3 di 0.99

Risultati:

Risultati della Simulazione; Creato dall'Autore

Osservazioni chiave

I risultati del nostro studio di simulazione convalidano in modo succinto la nostra proposta. Nonostante l’applicazione di vari metodi di sovracampionamento, la funzione del modello principale f(x)=x rimane inalterata. L’aspetto cruciale risiede nella notevole coerenza del componente del modello in tutte le tecniche di sovracampionamento. Invece, il termine di bias presenta variazioni evidenti, corroborando la nostra affermazione che il sovracampionamento influenza principalmente il termine di bias senza influire sulla struttura del modello sottostante.

Rafforzare il concetto principale

Il nostro studio di simulazione sottolinea innegabilmente l’equivalenza fondamentale tra sovracampionamento, aggiustamento dei pesi e modifica del termine di bias. Mostrando che il sovracampionamento modifica esclusivamente il termine di bias, rafforziamo il principio che queste strategie sono strumenti intercambiabili nell’arsenale contro lo squilibrio di classe.

Applicazione dell’algoritmo di aggiustamento del bias alla rilevazione delle frodi con carte di credito

Per dimostrare l’efficacia del nostro algoritmo di aggiustamento del bias nel gestire lo squilibrio di classe, utilizziamo un dataset del mondo reale proveniente da una competizione Kaggle incentrata sulla rilevazione delle frodi con carte di credito. In questo scenario, la sfida consiste nel prevedere se una transazione con carta di credito è fraudolenta (etichettata come 1) o meno (etichettata come 0), data la rarità intrinseca dei casi di frode.

Iniziamo caricando i pacchetti essenziali e preparando il dataset:

import numpy as npimport pandas as pdimport tensorflow as tfimport tensorflow_addons as tfafrom sklearn.model_selection import train_test_splitfrom imblearn.over_sampling import SMOTE, RandomOverSampler# Carica e preelabora il datasetdf = pd.read_csv("/kaggle/input/playground-series-s3e4/train.csv")y, x = df.Class, df[df.columns[1:-1]]x = (x - x.min()) / (x.max() - x.min())x_train, x_valid, y_train, y_valid = train_test_split(x, y, test_size=0.3, random_state=1)batch_size = 256train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(buffer_size=1024).batch(batch_size)valid_dataset = tf.data.Dataset.from_tensor_slices((x_valid, y_valid)).batch(batch_size)

Definiamo quindi un semplice modello di deep learning per la classificazione binaria e impostiamo l’ottimizzatore, la funzione di perdita e la metrica di valutazione. Seguiamo la valutazione della competizione e scegliamo l’AUC come metrica di valutazione. Inoltre, il modello è intenzionalmente semplificato poiché il focus di questo articolo è mostrare come implementare l’algoritmo di aggiustamento del bias, non ottenere previsioni accurate:

model = tf.keras.Sequential([    tf.keras.layers.Normalization(),    tf.keras.layers.Dense(32, activation='swish'),    tf.keras.layers.Dense(32, activation='swish'),    tf.keras.layers.Dense(1)])optimizer = tf.keras.optimizers.Adam()loss = tf.keras.losses.BinaryCrossentropy()val_metric = tf.keras.metrics.AUC()

All’interno del nucleo del nostro algoritmo di aggiustamento del bias si trovano i passaggi di addestramento e di convalida, in cui affrontiamo meticolosamente lo squilibrio di classe. Per chiarire questo processo, approfondiamo i meccanismi intricati che bilanciano le previsioni del modello.

Passaggio di addestramento con accumulo dei valori delta

Nel passaggio di addestramento, intraprendiamo il viaggio per migliorare la sensibilità del modello allo squilibrio di classe. Qui, calcoliamo e accumuliamo la somma delle uscite del modello per due cluster distinti: delta0 e delta1. Questi cluster hanno un’importanza significativa, rappresentando i valori previsti associati alle classi 0 e 1, rispettivamente.

# Definisci la funzione del passaggio di [email protected] train_step(x, y):    delta0, delta1 = tf.constant(0, dtype = tf.float32), tf.constant(0, dtype = tf.float32)    with tf.GradientTape() as tape:        logits = model(x, training=True)        y_pred = tf.keras.activations.sigmoid(logits)        loss_value = loss(y, y_pred)        # Calcola il nuovo termine di bias per affrontare lo squilibrio di classe        if len(logits[y == 1]) == 0:            delta0 -= (tf.reduce_sum(logits[y == 0]))        elif len(logits[y == 0]) == 0:            delta1 -= (tf.reduce_sum(logits[y == 1]))        else:            delta0 -= (tf.reduce_sum(logits[y == 0]))            delta1 -= (tf.reduce_sum(logits[y == 1]))    grads = tape.gradient(loss_value, model.trainable_weights)    optimizer.apply_gradients(zip(grads, model.trainable_weights))    return loss_value, delta0, delta1

Passo di validazione: Risoluzione del disequilibrio con Delta

I valori delta normalizzati, derivati dal processo di addestramento, assumono un ruolo centrale nel passo di validazione. Armati di questi indicatori raffinati dello sbilanciamento delle classi, allineiamo più accuratamente le previsioni del modello con la vera distribuzione delle classi. La funzione test_step integra questi valori delta per adattare in modo adattivo le previsioni, portando infine a una valutazione raffinata.

@tf.functiondef test_step(x, y, delta):    logits = model(x, training=False)    y_pred = tf.keras.activations.sigmoid(logits + delta)  # Aggiusta le previsioni con delta    val_metric.update_state(y, y_pred)

Utilizzo dei valori delta per la correzione dello sbilanciamento

Man mano che l’addestramento avanza, raccogliamo preziose informazioni racchiuse nelle somme di cluster delta0 e delta1. Questi valori cumulativi emergono come indicatori del bias intrinseco nelle previsioni del nostro modello. Alla fine di ogni epoca, eseguiamo una trasformazione vitale. Dividendo le somme accumulate dei cluster per il numero corrispondente di osservazioni di ciascuna classe, otteniamo valori delta normalizzati. Questa normalizzazione agisce come un equalizzatore cruciale, racchiudendo l’essenza del nostro approccio di regolazione del bias.

E = 1000P = 10B = len(train_dataset)N_class0, N_class1 = sum(y_train == 0), sum(y_train == 1)early_stopping_patience = 0best_metric = 0for epoch in range(E):    # inizializza delta    delta0, delta1 = tf.constant(0, dtype = tf.float32), tf.constant(0, dtype = tf.float32)    print("\nInizio dell'epoca %d" % (epoch,))    # Itera sui batch del dataset.    for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):        loss_value, step_delta0, step_delta1 = train_step(x_batch_train, y_batch_train)        # Aggiorna delta        delta0 += step_delta0        delta1 += step_delta1    # Prendi la media di tutti i valori delta    delta = (delta0/N_class0 + delta1/N_class1)/2        # Esegui un ciclo di validazione alla fine di ogni epoca.    for x_batch_val, y_batch_val in valid_dataset:        test_step(x_batch_val, y_batch_val, delta)    val_auc = val_metric.result()    val_metric.reset_states()    print("Area sotto la curva di validazione (AUC): %.4f" % (float(val_auc),))    if val_auc > best_metric:        best_metric = val_auc        early_stopping_patience = 0    else:        early_stopping_patience += 1        if early_stopping_patience > P:        print("Raggiunta la pazienza di arresto anticipato. Addestramento terminato con AUC di validazione: %.4f" % (float(best_metric),))        break;

Il risultato

Nella nostra applicazione per la rilevazione delle frodi con carta di credito, l’efficacia migliorata del nostro algoritmo risalta. Con l’aggiustamento del bias integrato in modo fluido nel processo di addestramento, otteniamo un impressionante punteggio AUC di 0.77. Questo contrasta nettamente con il punteggio AUC di 0.71 ottenuto senza l’aiuto guida dell’aggiustamento del bias. Il miglioramento significativo delle prestazioni predittive è una testimonianza della capacità dell’algoritmo di navigare nelle complessità dello sbilanciamento delle classi, tracciando un percorso verso previsioni più accurate e affidabili.

Riferimenti

[1] Manski, C. F., & Lerman, S. R. (1977). The estimation of choice probabilities from choice based samples. Econometrica: Journal of the Econometric Society, 1977–1988.

[2] Scott, A. J., & Wild, C. J. (1986). Fitting logistic models under case-control or choice based sampling. Journal of the Royal Statistical Society Series B: Statistical Methodology, 48(2), 170–182.