La regressione logistica

La regressione logistica

Immagina di avere un cesto pieno di frutti: mele e banane. Vuoi creare una macchina che, guardando ogni frutto, possa dire se è una mela o una banana. Il modello di regressione logistica è come una di queste macchine, ma invece di frutti, lavora con dati numerici.

Per capirlo meglio, immagina che ogni frutto possa essere descritto da due cose: quanto è dolce e quanto è giallo. Le mele potrebbero essere generalmente meno dolci e meno gialle delle banane. Quindi, disegni un grafico dove metti tutte le tue mele e banane, segnando quanto sono dolci e quanto sono gialle. Noterai che le mele tendono a raggrupparsi in una parte del grafico, mentre le banane in un’altra.

La regressione logistica ci aiuta a disegnare una linea (o confine) in questo grafico che separa al meglio le mele dalle banane. Quando arriva un nuovo frutto, semplicemente guardiamo da che parte della linea cade basandoci su quanto è dolce e quanto è giallo, e possiamo dire se è più probabile che sia una mela o una banana.

Per farlo, la regressione logistica usa una formula matematica che può prendere i dati di dolcezza e giallo di un frutto, e trasformarli in una probabilità, che è un numero tra 0 e 1. Se la probabilità è vicina a 1, la macchina dirà “Sì, sono abbastanza sicuro che questo sia una banana”. Se è vicina a 0, dirà “No, questo probabilmente è una mela”.

Approfondimento

La regressione logistica è una tecnica statistica usata per prevedere la probabilità di un risultato binario (ad esempio, successo/insuccesso, sì/no, 1/0) basata su una o più variabili indipendenti.

È particolarmente utile per situazioni dove la variabile dipendente è dicotomica. La regressione logistica calcola le probabilità usando una funzione logistica, che è una funzione sigmoidea che produce un risultato tra 0 e 1.

I modelli di AI che impiegano la regressione logistica fanno parte della categoria di modelli discriminativi che si differenziano dai modelli generativi.

Puoi approfondire questi concetti leggendo l’articolo
Modelli generativi e discriminativi a confronto

Per ottenere la probabilità p dell’evento di interesse, possiamo aggiustare la formula esprimendola rispetto a p:

Spesso la troviamo scritta in questo modo:

Questa è nota come funzione logistica o funzione sigmoidea, dove e è la base dei logaritmi naturali. La funzione prende in input qualsiasi valore dai coefficienti e dalle variabili indipendenti, e produce un output tra 0 e 1, che rappresenta la probabilità che l’evento di interesse si verifichi.

La regressione logistica può essere estesa oltre il caso binario per gestire risposte categoriche con tre o più categorie (nota come regressione logistica multinomiale) e casi in cui le categorie hanno un ordine naturale (regressione logistica ordinale).

I coefficienti (β) sono stimati durante il processo di addestramento del modello. Questo viene fatto massimizzando la funzione di verosimiglianza, che equivale a minimizzare una funzione di costo, tipicamente attraverso metodi di ottimizzazione come il metodo della discesa del gradiente.

L’obiettivo è trovare i valori di β che rendono le probabilità predette il più vicino possibile agli esiti osservati nel dataset di addestramento.

Nel contesto delle reti neurali questi coefficienti vengono chiamati w e coincidono con i pesi del modello.

L’output della regressione logistica è una probabilità che varia da 0 a 1. Per classificare un esempio in una delle due categorie, si sceglie una soglia di probabilità (spesso 0.5) sopra la quale l’esempio è classificato nella classe 1, altrimenti nella classe 0.

Tradurre il modello di regressione logistica in una rete neurale è un processo relativamente semplice, dato che la regressione logistica può essere vista come il caso più semplice di rete neurale. Una rete neurale per la regressione logistica consiste in un singolo strato (o nodo) di output che utilizza una funzione di attivazione sigmoidea, proprio come nella regressione logistica tradizionale.

Strato di input: I nodi di questo strato rappresentano le variabili indipendenti (attributi) del dataset. Per un compito di sentiment analysis, questi potrebbero essere, ad esempio, i punteggi TF-IDF (Term Frequency-Inverse Document Frequency) o embeddings di parole del testo di input.

Strato di output: Un singolo nodo che usa la funzione di attivazione sigmoidea per produrre una probabilità che l’input appartenga a una delle due classi (positivo o negativo, nel caso della sentiment analysis).

Esempio di Attributi per Sentiment Analysis

Per una sentiment analysis, gli attributi (o features) potrebbero essere:

TF-IDF di termini chiave: Valori che riflettono l’importanza di termini specifici nel contesto del documento e dell’intero corpus. (Cenni sul metodo TF-IDF (Term Frequency-Inverse Document Frequency)

Word Embeddings: Vettori densi ottenuti da modelli pre-addestrati come Word2Vec o GloVe che catturano il contesto semantico delle parole.

Aggiornamento dei Pesi mediante Discesa del Gradiente e Funzione Cross-Entropy

Il processo di aggiornamento dei pesi in una rete neurale, incluso il modello di regressione logistica come caso speciale, si basa sulla minimizzazione della funzione di perdita, che misura la discrepanza tra le etichette predette dal modello e le etichette reali dei dati di addestramento.

Nel caso della classificazione binaria, una scelta comune per la funzione di perdita è la cross-entropy (o log loss) ricavata in questo modo a partire dalla distribuzione di Bernoulli:

Il gradiente indica la direzione in cui la funzione di perdita cresce più rapidamente; quindi, muovendosi nella direzione opposta, si cerca di trovare il minimo della funzione, cioè i pesi che minimizzano l’errore di classificazione.

In sintesi, la rete neurale per la regressione logistica viene addestrata iterativamente aggiustando i pesi in base all’errore di predizione, con l’obiettivo di ridurre la funzione di perdita cross-entropy attraverso il processo di discesa del gradiente. Questo processo permette al modello di apprendere complesse relazioni tra gli attributi di input e l’etichetta di output, migliorando la sua capacità di classificazione.

Esempio

Per creare un semplice esempio numerico di modello di regressione logistica per classificare mele e banane basandoci su quanto il frutto è giallo e quanto è dolce, cominciamo con l’ipotizzare alcuni dati. In questo modello, useremo due caratteristiche (features): “giallo” (quanto il frutto è giallo) e “dolce” (quanto il frutto è dolce). Queste caratteristiche saranno i nostri input (X), e l’output (Y) sarà la classe del frutto, dove “0” rappresenta una mela e “1” rappresenta una banana.

Step 1: Raccolta dei Dati
Immaginiamo di avere un dataset con queste caratteristiche:

Step 2: Modello di Regressione Logistica
Il modello di regressione logistica può essere espresso come segue:

Step 3: Stima dei Parametri
Senza un software specifico, è complesso stimare i parametri β (o pesi w), ma possiamo immaginare di avere ottenuto le seguenti stime attraverso un algoritmo di ottimizzazione (ad esempio, il metodo della massima verosimiglianza):

Step 4: Previsione
Supponiamo di avere un nuovo frutto che ha un livello di “giallo” di 0.7 e un livello di “dolcezza” di 0.8 e vogliamo classificarlo.

Applichiamo la formula della regressione logistica con i parametri stimati:

Calcoliamo il risultato: 1/(1+0,11) = 0,90

La probabilità che il nuovo frutto sia una banana, calcolata attraverso il modello di regressione logistica con i parametri stimati, è circa del 90%. Questo significa che, basandoci sul nostro modello e sui livelli di “giallo” e “dolcezza” del frutto, possiamo classificarlo con alta probabilità come una banana. ​

Codice python che applica il modello di regressione logistica

Immaginiamo di avere una tabella di dati strutturata come segue dove i dati sono già stati puliti e normalizzati (in generale con molte più righe e colonne):

…..

Salviamola nel file dataset.csv

Il codice python che permette di fare previsioni mediante il modello di regressione logistica è il seguente:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report

# Carichiamo il dataset in un DataFrame
df = pd.read_csv('dataset.csv')

# Prepariamo le variabili indipendenti (X) e la variabile dipendente/target (y)
X = df.drop('target', axis=1)  # Rimuoviamo la colonna target per ottenere solo gli attributi
y = df['target']  # Isoliamo la colonna target

# Dividiamo il dataset in set di addestramento e test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Creiamo un'istanza del modello di regressione logistica
logreg = LogisticRegression()

# Addestriamo il modello utilizzando i dati di addestramento
logreg.fit(X_train, y_train)

# Facciamo previsioni sul set di test
y_pred = logreg.predict(X_test)

# Valutiamo il modello
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)

# Stampiamo i risultati
print("Accuratezza del modello:", accuracy)
print("Report di classificazione:\n", report)

# Ottieniamo i pesi (coefficienti) per ciascun attributo
weights = logreg.coef_[0]

# Associamo ciascun peso al corrispondente nome dell'attributo e stampiamo i risultati
feature_names = X.columns
weights_df = pd.DataFrame({'Feature': feature_names, 'Weight': weights})
print(weights_df.sort_values(by='Weight', ascending=False))


# Prendiamo un nuovo esempio con le sue features
# Questo deve essere un array 2D con gli stessi attributi del dataset originale e stessa scala per i dati

# Ad esempio, se ci sono 3 attributi, il nuovo punto dati potrebbe essere come segue
new_data = [[valore_feature1, valore_feature2, valore_feature3]]


# Effettuare la previsione utilizzando il modello addestrato
new_prediction = logreg.predict(new_data)
new_prediction_proba = logreg.predict_proba(new_data)

# Visualizzazione della previsione
print("Predizione per il nuovo punto dati:", new_prediction)
print("Probabilità associate alla predizione:", new_prediction_proba)

Regressione logistica multinomiale

La regressione logistica multinomiale, nota anche come regressione logistica multiclasse o softmax regression, è un’estensione della regressione logistica utilizzata quando l’obiettivo è prevedere l’appartenenza a più di due classi. Questo modello è particolarmente utile per problemi di classificazione dove le classi sono mutuamente esclusive.

Il modello si basa sull’utilizzo di una matrice di pesi W e di un vettore di bias b, dove ogni riga della matrice W rappresenta i pesi associati a una specifica classe. Il vettore degli input x contiene le caratteristiche (features) dell’oggetto da classificare.

Una volta calcolati i punteggi per ogni classe, il modello utilizza la funzione vettoriale softmax per convertire questi punteggi in probabilità. La funzione softmax garantisce che la somma di tutte le probabilità sia 1, permettendo così di interpretare l’output come una distribuzione di probabilità sulle classi. La funzione vettoriale softmax per la classe i è definita come:

Gli output del modello, dopo l’applicazione della funzione softmax, sono interpretati come probabilità che l’input appartenga a ciascuna delle classi. La classe con la probabilità più alta è la classe predetta per l’input.

Data una singola istanza, per cui l’etichetta corretta y è una delle K classi, la funzione di perdita cross-entropy può essere espressa nel seguente modo:

La discesa del gradiente è un algoritmo di ottimizzazione usato per minimizzare la funzione di perdita aggiornando iterativamente i parametri del modello, in questo caso la matrice dei pesi W e il vettore dei bias b, in direzione opposta al gradiente della funzione di perdita rispetto a questi parametri. L’aggiornamento dei parametri utilizzando la discesa del gradiente nel contesto della funzione di perdita cross-entropy per la regressione logistica multinomiale si esegue come segue:

In pratica, per ogni iterazione dell’algoritmo di discesa del gradiente, i parametri W e b sono aggiornati come segue:

Questo processo viene ripetuto per un numero prefissato di iterazioni o fino a quando la diminuzione della funzione di perdita tra le iterazioni successive non scende sotto una soglia predefinita, indicando che il modello ha raggiunto la convergenza.