La Regressione Logistica, Concetti di Base
Parte (1/3)
Potrebbe interessarti:
- La Regressione Logistica, Spiegazione del Modello - (2/3)
- La Regressione Logistica, Implementazione del Modello - (3/3)
Il progetto Python, che comprende gli script mostrati in questo post, e quelli relativi alla creazione dei grafici Matplotlib e Plotly, è disponibile assieme al corso Introduzione al Machine Learning.
Prima di analizzare nel dettaglio il modello di Regressione Logistica, è utile ripassare alcuni concetti fondamentali di probabilità e statistica. In particolare, rivedremo le nozioni di Probabilità e di Odds, le funzioni Logit e Sigmoide, la Distribuzione di Probabilità e la funzione di costo Cross-Entropy. Questi strumenti teorici sono essenziali per comprendere a fondo il funzionamento della Regressione Logistica, e il modo in cui questo modello effettua previsioni nel contesto della classificazione.
La Probabilità
La Probabilità è una misura della possibilità che accada un dato evento, definita con un numero reale compreso tra $0$ e $1$, dove $0$ indica che l’evento è impossibile, e $1$ indica che l’evento è certo. La probabilità di un evento è calcolata come:
$$ \begin{align} P(E) & = \frac{\text{Numero di Esiti Favorevoli}}{\text{Numero Totale di Esiti Possibili}}\label{proba}\tag{1}\\[6pt] \end{align} $$Ad esempio, se lanciamo un dado non truccato a sei facce, la probabilità di ottenere $4$ è $\frac{1}{6}$, visto che possiamo avere sei esiti possibili (i valori risultanti dal lancio del dado possono essere $1, 2, \cdots, 6$).
La Probabilità Condizionata
La Probabilità Condizionata è la probabilità che un evento si verifichi sapendo che un altro evento si è già verificato. In altre parole, essa misura quanto è probabile l’evento $A$, limitandosi ai casi in cui l’evento $B$ si è verificato. Formalmente, la Probabilità Condizionata di $A$ dato $B$ è definita come:
$$ \begin{align} P(A|B) & = \frac{P(A \cap B)}{P(B)}\label{conditional-proba-1}, \text{ con } P(B) > 0 \tag{2}\\[6pt] \end{align} $$dove:
- $P(A \cap B)$ è la probabilità congiunta, che rappresenta la probabilità che gli eventi $A$ e $B$ si verifichino contemporaneamente. Il simbolo $\cap$ indica l’intersezione dei due insiemi, ossia l’insieme degli esiti comuni sia ad $A$ sia a $B$.
- $P(B)$ è la probabilità che si verifichi l’evento $B$.
Il fatto che $B$ sia avvenuto riduce l’universo dei casi possibili: non stiamo più considerando tutti gli esiti dell’esperimento, ma solo quelli compatibili con $B$. Dividere per $P(B)$ serve quindi a normalizzare la probabilità rispetto a questo nuovo “universo ridotto”. Dal punto di vista geometrico, come mostrato nell’immagine seguente, $P(A|B)$ è il rapporto tra la probabilità dell’area gialla — l’intersezione tra i due eventi $A$ e $B$ — e la probabilità dell’area verde — l’evento $B$:

Per chiarire meglio questo concetto, consideriamo l’esperimento del lancio di un dado equo a sei facce. Definiamo la variabile casuale $X$, come il risultato del lancio del dado. I possibili valori di $X$ sono: ${1, 2, 3, 4, 5, 6}$. Prima di avere qualunque informazione aggiuntiva, tutti questi risultati sono possibili. Definiamo ora due eventi:
- $A$: “esce un 6”, ovvero: $A = \{ X = 6 \}$,
- $B$: “esce un numero pari”, ovvero $B = \{X \in \{2, 4, 6\}\}$.
Prima di sapere se l’evento $B$ si è verificato, le probabilità sono:
$$ \begin{align} P(A) & = P(X = 6) = \frac{1}{6}\\[6pt] P(B) & = P(X \in \{2, 4, 6\}) = \frac{3}{6} = \frac{1}{2}\\[6pt] \end{align} $$Supponiamo ora di sapere che l’evento $B$ si è verificato, cioè che è uscito un numero pari. Questa informazione cambia il contesto: i risultati $1$, $3$ e $5$ diventano impossibili. Il nuovo universo dei casi possibili è quindi: $\{2, 4, 6\}$. A questo punto ci chiediamo: “Qual è la probabilità che sia uscito $6$, sapendo che è uscito un numero pari?”. Poiché i casi possibili sono ora tre, e uno solo di questi è favorevole all’evento $A$, otteniamo:
$$ \begin{align} P(A | B) & = \frac{1}{3}\\[6pt] \end{align} $$Rivediamo ora la formula della probabilità condizionata applicata a questo esempio:
$$ \begin{align} A \cap B & = \{X = 6\}\\[6pt] P(A \cap B) & = \frac{1}{6}\\[6pt] B & = \{X \in \{2, 4, 6\}\}\\[6pt] P(B) & = \frac{3}{6} = \frac{1}{2}\\[6pt] P(A | B) & = \frac{\frac{1}{6}}{\frac{1}{2}} = \frac{2}{6} = \frac{1}{3}\\[6pt] \end{align} $$Questo conferma che la probabilità condizionata si ottiene ricalcolando la probabilità di $A$, tenendo conto del fatto che solo gli esiti compatibili con $B$ sono ancora possibili.
Nel contesto del Machine Learning, definiamo $p$ come la probabilità condizionata che l’osservazione $\textbf{x}^{(i)}$ appartenga alla classe positiva $\left(y^{(i)} = 1\right)$, dato il valore delle sue feature. Ovvero:
$$ \begin{align} p & = P\left(y^{(i)} = 1|\textbf{x}^{(i)}\right) \label{conditional-proba-2}\tag{3}\\[6pt] \end{align} $$Quindi, $p$ è la probabilità condizionata che la label dell’$i$-esima osservazione, $\textbf{x}^{(i)}$, sia uguale a $1$, dato che conosciamo il relativo vettore di feature. Le feature — le caratteristiche o proprietà che descrivono l’osservazione — modificano il contesto in cui valutiamo la probabilità.
Gli Odds
Gli Odds di un evento $E$ rappresentano il rapporto tra la probabilità che l’evento si verifichi, e la probabilità che non si verifichi, e sono calcolati come:
$$ \begin{align} \text{odds} & = \frac{P(E)}{1 - P(E)} \label{odds-P}\tag{4}\\[6pt] \end{align} $$Ad esempio, diciamo che la probabilità di vincere una partita è: $P(\text{Win}) = 0.75$. Gli Odds di $\text{Win}$ sono calcolati come:
$$ \begin{align} \text{odds} & = \frac{0.75}{1 - 0.75} = \frac{0.75}{0.25} = 3\\[6pt] \end{align} $$In questo caso, diciamo che gli Odds di vincita sono di $3$ a $1$ (spesso scritto $3:1$). Possiamo descrivere gli Odds in favore di $p$ come:
$$ \begin{align} \text{odds} & = \frac{p}{1 - p} \label{odds-p}\tag{5}\\[6pt] \end{align} $$dove:
- $p$ è la probabilità dell’evento positivo, cioè che una particolare osservazione appartenga alla classe positiva “$1$”, date le sue feature $\textbf{x}^{(i)}$. L’evento positivo è l’evento che si vuole predirre.
- $1 - p$ è la probabilità dell’evento negativo, cioè che una particolare osservazione appartenga alla classe negativa “$0$”, date le sue feature $\textbf{x}^{(i)}$.
La Funzione Logit
La funzione logit è il logaritmo naturale (ln) degli Odds della probabilità, ed è definita come:
$$ \begin{align} \text{logit}(p) & = \text{log}\left(\frac{p}{1 - p}\right) \label{logit}\tag{6}\\[6pt] & = \text{log}\left(\text{odds}\right)\\[6pt] \end{align} $$Essa trasforma un valore di probabilità nell’intervallo $\left(0, 1\right)$ in un valore reale nell’intervallo $\left(-\infty, \infty\right)$:

Il modello di Regressione Logistica afferma che il logit di $p$ è una funzione lineare delle variabili predittive $x^{(i)}_j$, ovvero:
$$ \begin{align} \text{logit}(p) & = w_1x^{(i)}_1 + w_2x^{(i)}_2 + \dots + w_nx^{(i)}_n + b \label{logit2}\tag{7}\\[6pt] & = \textbf{w} \cdot \textbf{x}^{(i)} + b \label{logit3}\tag{8}\\[6pt] & = z^{(i)} \label{logit4}\tag{9}\\[6pt] \end{align} $$Questo indica che il modello non calcola direttamente la probabilità $p$, ma ritorna il logit di tale probabilità, come combinazione lineare delle feature di input. Ciò vuol dire che un logit può essere interpretato come il punteggio non normalizzato di un modello ML, per una data osservazione, e la classe positiva ad essa associata. Più genericamente, nel contesto del Machine Learning, il termine logit indica il valore di input della funzione di attivazione del neurone, $\sigma$.
La Funzione Sigmoide
Visto che interpretare il valore di un logit è complicato, di solito, come valore di uscita del neurone, si preferisce usare un valore di probabilità. Quindi, dopo aver calcolato il logit, dobbiamo convertire tale valore in un valore indicante la probabilità che l’esempio appartenga alla classe positiva “$1$”. Per operare questa conversione, possiamo usare la funzione $\sigma$ (sigma, o sigmoide), definita come:
$$ \begin{align} p^{(i)} = \sigma\left(z^{(i)}\right) & = \frac{1}{1 + e^{\left(-z^{(i)}\right)}}\label{sigmoid}\tag{10}\\[6pt] & = \frac{1}{1 + e^{\left[-\left(\textbf{w} \cdot \textbf{x}^{(i)} + b\right)\right]}}\\[6pt] & = \frac{1}{1 + e^{\left(-\text{logit}(p)\right)}}\\[6pt] \end{align} $$Il sigmoide è l’inverso della funzione logit, e può essere usata per trasformare un valore logit nel relativo valore di probabilità $p$. Di fatti:
$$ \begin{align} \sigma\left(\text{logit}\left(p\right)\right) & = \text{logit}\left(\sigma\left(p\right)\right) = p\label{sigmoid-inverse-logit}\tag{11}\\[6pt] \end{align} $$Il sigmoide $\sigma$ è una funzione non lineare1, che mappa la combinazione lineare $z^{(i)}$ in un valore di uscita non lineare, nell’intervallo $\left(0, 1\right)$. Essa segue una curva a forma di “S”, che “satura” a $0$ e $1$ per valori estremi di $z^{(i)}$. In particolare:
- $\sigma$ prende in ingresso valori reali nell’intervallo $\left(-\infty, \infty\right)$ e restituisce valori reali nell’intervallo $\left(0, 1\right)$.
- $\sigma$ si avvicina a 0 (ma non raggiunge 0) quando il suo parametro di input $z^{(i)}$ si avvicina all’infinito negativo.
- $\sigma$ si avvicina a 1 (ma non raggiunge 1) quando il suo parametro di input $z^{(i)}$ si avvicina all’infinito positivo.

L’output della funzione sigmoide viene interpretato come la probabilità che un particolare esempio appartenga alla classe positiva “$1$”, date le sue feature $\textbf{x}^{(i)}$:
$$ \begin{align} \sigma\left(z^{(i)}\right) & = p = P\left(y^{(i)}=1|\textbf{x}^{(i)}\right)\\[6pt] \end{align} $$La probabilità che un particolare esempio appartenga alla classe “$0$” può essere calcolata come segue:
$$ \begin{align} P\left(y^{(i)}=0|\textbf{x}^{(i)}\right) & = 1 - \sigma\left(z^{(i)}\right)\\[6pt] \end{align} $$La Distribuzione di Probabilità
Una distribuzione di probabilità è un modello2 che descrive come la probabilità è ripartita tra i possibili risultati di un fenomeno casuale. In un fenomeno incerto (ad esempio il lancio di un dado), non sappiamo quale risultato si verificherà, ma possiamo assegnare una probabilità a ogni possibile risultato. In questo senso, una distribuzione di probabilità ci dice “quanto spesso” oppure “con quale probabilità” ci aspettiamo che ciascun valore possa verificarsi.
Per formalizzare questa idea, introduciamo una variabile casuale $X$, che associa un valore numerico a ogni possibile esito dell’esperimento. La distribuzione di probabilità è la regola che specifica la probabilità che la variabile casuale $X$ assuma un determinato valore $x$ (inteso come risultato dell’esperimento), ovvero:
$$ \begin{align} P(X = x) \end{align} $$- $X$ indica la variabile casuale, o il risultato dell’esperimento casuale;
- $x$ indica un valore specifico che la variabile casuale può assumere, cioè un possibile risultato dell’esperimento.
Consideriamo ora una distribuzione di probabilità discreta3, che può essere vista come la regola che associa a ciascun valore di un insieme finito (o numerabile) di possibili risultati la sua probabilità. Una distribuzione di probabilità discreta deve soddisfare due proprietà fondamentali:
$$ \begin{align} P(X = x_k) & \ge 0 \text{ per ogni } k \\[6pt] \sum_{k=1}^{K} { P(X = x_k) } & = 1 \\[6pt] \end{align} $$La prima condizione garantisce che le probabilità non siano negative, mentre la seconda riflette il fatto che uno dei possibili valori deve necessariamente verificarsi (quando l’esperimento viene eseguito, non può succedere “qualcos’altro” al di fuori dei valori che abbiamo elencato).
Supponiamo che la variabile casuale $X$ rappresenti il risultato del lancio di un dado non truccato (tutti gli esiti sono equiprobabili). In questo caso:
$$ \begin{align} X \in \{1,2,3,4,5,6\} \end{align} $$La distribuzione di probabilità può essere rappresentata dalla seguente tabella:
| $x$ | $P(X = x)$ |
|---|---|
| $1$ | $1/6$ |
| $2$ | $1/6$ |
| $3$ | $1/6$ |
| $4$ | $1/6$ |
| $5$ | $1/6$ |
| $6$ | $1/6$ |
Qui la distribuzione ci dice che tutti i risultati sono ugualmente probabili.
La Funzione Cross-Entropy
La funzione di Cross-Entropy misura la differenza (o dissimilarità) tra due distribuzioni di probabilità discrete: la distribuzione reale dei dati, indicata con $P$, e la distribuzione stimata o predetta dal modello, indicata con $Q$.
In termini intuitivi, la Cross-Entropy quantifica quanto bene il modello riesca ad approssimare la distribuzione dei valori target: più la distribuzione predetta $Q$ è vicina alla distribuzione reale $P$, più basso sarà il valore della Cross-Entropy.
Sia $X$ una variabile casuale4 discreta che può assumere $K$ stati distinti5. Indichiamo con $P\left(X = k\right) = \left[p_1, p_2, \cdots, p_K\right]$ la distribuzione reale, e con $Q\left(X = k\right) = \left[q_1, q_2, \cdots, q_K\right]$ la distribuzione predetta dal modello. La funzione di Cross-Entropy tra $P$ e $Q$ è definita come:
$$ \begin{align} H(P, Q) & = -\sum_{k=1}^{K} P(X = k)\log_2\left(Q(X = k)\right) \label{Cross-Entropy}\tag{12}\\[6pt] & = -\sum_{k=1}^{K} p_k\log_2\left(q_k\right) \label{Cross-Entropy-2}\tag{13}\\[6pt] \end{align} $$dove, per convenzione:
- $p_k = P(X = k)$,
- $q_k = Q(X = k)$,
- $k = 1, \cdots, K$.
In questa formulazione, il termine $\log(q_k)$ penalizza fortemente il modello quando assegna una probabilità bassa a eventi che, nella distribuzione reale $P$, hanno invece una probabilità elevata. Per questo motivo, minimizzare la Cross-Entropy equivale a spingere il modello ad assegnare alte probabilità agli esiti corretti.
Vediamo un esempio per capire meglio il concetto con dei numeri. Supponiamo di avere la distribuzione $P = [0, 1, 0]$ e $Q = [0.2, 0.7, 0.1]$, e di calcolare il valore $-p_k\log_2\left(q_k\right)$ per ogni valore di $k$:
| $k$ | $P(X = k)$ | $Q(X = k)$ | $-p_k\log_2\left(q_k\right)$ |
|---|---|---|---|
| 1 | 0 | 0.2 | 0 |
| 2 | 1 | 0.7 | 0.5146 |
| 3 | 0 | 0.1 | 0 |
In questo esempio, il valore risultante di Cross-Entropy è:
$$ \begin{align} H(P, Q) & = -\sum_{k=1}^{K} p_k\log_2\left(q_k\right)\\[6pt] & = -p_1\log_2\left(q_1\right) - p_2\log_2\left(q_2\right) - p_3\log_2\left(q_3\right)\\[6pt] & = 0 + 0.5146 + 0\\[6pt] & = 0.5146\\[6pt] \end{align} $$e tale valore, in bit, è la misura di quanto la distribuzione $Q$ sia vicina alla distribuzione target, $P$.
Cross-Entropy e Classificazione Binaria
Nel contesto della classificazione binaria, utilizziamo una variabile casuale discreta $X$ per rappresentare l’appartenenza dell’osservazione corrente alla classe positiva oppure alla classe negativa. In questo scenario, $X$ può assumere due soli stati discreti ($K = 2$). La distribuzione di probabilità reale può quindi essere scritta come: $P(X = k) = \left[p, 1-p\right]$, mentre la distribuzione predetta dal modello è: $Q(X = k) = \left[q, 1-q\right]$.
In questo caso, la definizione generale di Cross-Entropy $\eqref{Cross-Entropy-2}$ si riduce alla seguente espressione:
$$ \begin{align} H(P, Q) & = -p\log_2(q) - (1 - p)\log_2(1 - q) \label{log_loss}\tag{14}\\[6pt] \end{align} $$Questa quantità rappresenta il numero medio di bit di informazione necessari per codificare la distribuzione reale $P$ utilizzando un modello che assume la distribuzione $Q$. Quanto più la distribuzione predetta $Q$ è vicina alla distribuzione reale $P$, tanto minore sarà il valore della Cross-Entropy. Viceversa, quando il modello assegna una probabilità bassa all’esito corretto, la Cross-Entropy cresce rapidamente. In particolare, Cross-Entropy penalizza in modo molto severo le previsioni errate, soprattutto nei casi in cui il modello è molto confidente nella propria previsione, ma questa risulta essere sbagliata. Per questo motivo, nella classificazione binaria, la Cross-Entropy è spesso indicata anche come logarithmic loss (log loss).
Vediamo un’altro esempio. Diciamo che vogliamo classificare un’e-mail come spam (classe positiva, 1), o non-spam (classe negativa, 0). Supponiamo che la true label per l’osservazione corrente sia $y = 1$ - l’esempio corrente è una mail di spam - e facciamo tre previsioni diverse. Calcoliamo quindi il costo associato alla Cross-Entropy binaria per ogni predizione, usando il logaritmo naturale (in nat) al posto del logaritmo in base $2$ (che restituisce bit):
Predizione 1:
$$ \begin{align} H(P, Q) & = -p\log(q) - (1 - p)\log(1 - q)\\[6pt] & = -1\log({0.9}) - 0\log(1-0.9) = -\log(0.9) = 0.105\\[6pt] \end{align} $$
Nel caso di una buona predizione, $\hat{y} = Q(X=1) = 0.9$, abbiamo:In questo caso abbiamo un costo modesto - il modello è sicuro della predizione, e corretto.
Predizione 2:
$$ \begin{align} H(P, Q) & = -1\log({0.6}) - 0\log(1-0.6) = -\log(0.6) = 0.510\\[6pt] \end{align} $$
Nel caso di una predizione “debole”, $Q(X=1) = 0.6$, abbiamo:In questo caso, il costo è maggiore. Il modello non è molto sicuro della previsione, che risulta comunque corretta.
Predizione 3:
$$ \begin{align} H(P, Q) & = -1\log({0.1}) + 0\log(1-0.1) = -\log(0.1) = 2.302\\[6pt] \end{align} $$
Nel caso di una predizione errata, $Q(X=1) = 0.1$, abbiamo:Qui abbiamo un costo elevato. Il modello è sicuro della sua previsione (il valore di $Q$ è vicino allo $0$), ma la previsione è sbagliata.
Il Sigmoide è una funzione non lineare a causa del termine esponenziale nel denominatore. ↩︎
Modello inteso come una rappresentazione semplificata e matematica di un fenomeno reale o ideale. ↩︎
Gli esempi basati su distribuzioni di probabilità discrete sono, in genere, più facili da capire rispetto a quelli continui. ↩︎
Una variabile casuale (o variabile aleatoria) è una variabile che può assumere valori (o stati) diversi in dipendenza da qualche fenomeno aleatorio. Ad esempio, il risultato del lancio di un dado bilanciato a sei facce può essere modellato come una variabile casuale che può assumere uno dei sei possibili valori: $1$, $2$, $3$, $4$, $5$, $6$, e ogni valore ha probabilità $\frac{1}{6}$ di presentarsi. ↩︎
Una variabile casuale discreta $X$ può assumere uno dei $K$ valori distinti e separati. Tali valori sono comunemente indicati come $x_1, x_2, \cdots, x_K$, dove $K$ è un numero finito o numerabile. Ciascun valore $x_k$ rappresenta un possibile esito (o stato) in cui la variabile $X$ può trovarsi, ed è associato a una probabilità $P(X = x_k)$. L’insieme di queste probabilità definisce la distribuzione di probabilità di $X$. Poiché $X$ deve assumere necessariamente uno di questi $K$ valori, le probabilità associate devono soddisfare la condizione di normalizzazione: $\sum_{k=1}^{K} P(X = x_k) = 1$. Ad esempio, se $X$ rappresenta il risultato del lancio di un dado a sei facce, essa può assumere uno dei sei valori discreti $(1, 2, 3, 4, 5, 6)$, ciascuno con una probabilità associata. Nel contesto del Machine Learning, in particolare nei problemi di classificazione, gli stati di una variabile casuale discreta vengono spesso chiamati classi, etichette (label), categorie o outcome. ↩︎