Nel precedente articolo “Introduzione alla classificazione e alla regressione logistica” ho delineato le basi matematiche dell’algoritmo di regressione logistica, il cui compito è quello di separare le cose nell’esempio di allenamento calcolando il confine di decisione.
Il confine di decisione può essere descritto da un’equazione. Come nella regressione lineare, l’algoritmo di regressione logistica sarà in grado di trovare i migliori parametri \tetas per far sì che il confine decisionale separi effettivamente i punti dati in modo corretto. In questo articolo vedremo come calcolare queste \tetas.
Supponiamo di avere un generico insieme di allenamento
{ (x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), \punti, (x^{(m)}, y^{(m)})
fatto di m esempi di allenamento, dove (x^{(1)}, y^{(1)}) è il 1° esempio e così via. Più specificamente, x^{(m)} è la variabile di ingresso dell’esempio m-esimo, mentre y^{(m)} è la sua variabile di uscita. Essendo questo un problema di classificazione, ogni esempio ha ovviamente l’output y vincolato tra 0 e 1. In altre parole, y \in {0,1}.
Ogni esempio è rappresentato come al solito dal suo vettore di caratteristiche
\vec{x} = \begin{bmatrice} x_0 \ x_1 \punti \xn \end{bmatrice}
dove x_0 = 1 (il solito vecchio trucco). Questo è un esempio generico, non conosciamo il numero esatto di caratteristiche.
Finalmente abbiamo la funzione di ipotesi per la regressione logistica, come visto nell’articolo precedente:
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}
Il nostro compito ora è quello di scegliere i migliori parametri \theta nell’equazione di cui sopra, dato l’attuale set di allenamento, al fine di minimizzare gli errori. Ricordate che \theta non è un singolo parametro: si espande all’equazione del confine di decisione che può essere una linea o una formula più complessa (con più \theta da indovinare).
La procedura è simile a quella che abbiamo fatto per la regressione lineare: definire una funzione di costo e cercare di trovare i migliori valori possibili di ogni \theta minimizzando l’output della funzione di costo. La minimizzazione sarà eseguita da un algoritmo di discesa del gradiente, il cui compito è quello di analizzare l’output della funzione di costo fino a trovare il punto minimo più basso.
La funzione di costo usata nella regressione lineare non funzionerà qui
Potreste ricordare la funzione di costo originale J(\theta) usata nella regressione lineare. Posso dirvi subito che non funzionerà qui con la regressione logistica. Se cercate di usare la funzione di costo della regressione lineare per generare J(\theta) in un problema di regressione logistica, vi ritrovereste con una funzione non convessa: un grafico dalla forma strana senza un punto minimo globale facile da trovare, come si vede nella figura qui sotto.
Questo strano risultato è dovuto al fatto che nella regressione logistica abbiamo intorno la funzione sigmoide, che non è lineare (cioè non è una linea). Con la J(\theta) rappresentata in figura 1. l’algoritmo di discesa del gradiente potrebbe bloccarsi in un punto di minimo locale. Ecco perché abbiamo ancora bisogno di una funzione convessa ordinata come abbiamo fatto per la regressione lineare: una funzione a forma di scodella che faciliti il lavoro della funzione di discesa del gradiente per convergere al punto di minimo ottimale.
Una migliore funzione di costo per la regressione logistica
Torniamo per un minuto alla funzione di costo che abbiamo usato nella regressione lineare:
J(\vec{\theta}) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)})^2
che può essere riscritta in modo leggermente diverso:
J(\vec{\theta}) = \frac{1}{m} \sum_{i=1}^{m} \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
Non è successo niente di spaventoso: Ho solo spostato il \frac{1}{2} accanto alla parte della somma. Ora rendiamolo più generale definendo una nuova funzione
\mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) = \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
In parole povere, una funzione \mathrm{Cost} che prende due parametri in input: h_\theta(x^{(i)}) come funzione di ipotesi e y^{(i)} come output. Si può pensare che sia il costo che l’algoritmo deve pagare se fa una previsione h_\theta(x^{(i)} mentre l’etichetta effettiva era y^{(i)}.
Con questo nuovo pezzo del puzzle posso riscrivere la funzione di costo per la regressione lineare come segue:
J(\theta) = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)})
Tuttavia sappiamo che la funzione di costo della regressione lineare non può essere usata nei problemi di regressione logistica. Allora, di cosa si tratta? Bene, si scopre che per la regressione logistica dobbiamo solo trovare una diversa funzione \mathrm{Cost}, mentre la parte di somma rimane la stessa.
Funzione di costo della regressione logistica
Per la regressione logistica, la funzione \mathrm{Cost} è definita come:
Mathrm{Cost}(h_\theta(x),y) ==begin{caso}-\log(h_\theta(x)) & \testo{se y = 1} \\-\log(1-h_\theta(x)) & \testo{se y = 0} \fine{casi}
Gli indici i sono stati rimossi per chiarezza. In parole povere questo è il costo che l’algoritmo paga se predice un valore h_\theta(x) mentre l’etichetta del costo reale risulta essere y. Usando questa funzione garantiremo la convessità alla funzione che l’algoritmo di discesa del gradiente deve elaborare, come discusso sopra. C’è anche una prova matematica per questo, che è fuori dallo scopo di questo corso introduttivo.
Nel caso y = 1, l’output (cioè il costo da pagare) si avvicina a 0 come h_\theta(x) si avvicina a 1. Al contrario, il costo da pagare cresce all’infinito man mano che h_\theta(x) si avvicina a 0. Lo si può vedere chiaramente nel grafico 2. sotto, lato sinistro. Questa è una proprietà desiderabile: vogliamo una penalità maggiore quando l’algoritmo predice qualcosa di molto lontano dal valore reale. Se l’etichetta è y = 1 ma l’algoritmo predice h_\theta(x) = 0, il risultato è completamente sbagliato.
Conversamente, la stessa intuizione si applica quando y = 0, raffigurato nel grafico 2. sotto, lato destro. Penalità più grandi quando l’etichetta è y = 0 ma l’algoritmo predice h_\theta(x) = 1.
Ottimizzazioni aggiuntive della funzione di costo
Quella che abbiamo appena visto è la versione verbosa della funzione di costo per la regressione logistica. Possiamo renderla più compatta in un’espressione di una sola riga: questo aiuterà ad evitare noiose istruzioni if/else quando si converte la formula in un algoritmo.
Mathrm{Cost}(h_\theta(x),y) = -y \log(h_\theta(x)) – (1 – y) \log(1-h_\theta(x))
Prova: provate a sostituire y con 0 e 1 e vi ritroverete con i due pezzi della funzione originale.
Con l’ottimizzazione in atto, la funzione di costo della regressione logistica può essere riscritta come:
begin{align}J(\theta) & = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \8333> = – \dfrac{1}{m}
Ho spostato il segno meno all’esterno per evitare ulteriori parentesi.
Collegando la funzione di costo e la discesa del gradiente insieme
Cosa rimane? Abbiamo la funzione di ipotesi e la funzione di costo: abbiamo quasi finito. È ora il momento di trovare i migliori valori per i parametri \teti nella funzione di costo, o in altre parole di minimizzare la funzione di costo eseguendo l’algoritmo di discesa del gradiente. La procedura è identica a quella che abbiamo fatto per la regressione lineare.
Più formalmente, vogliamo minimizzare la funzione di costo:
\min_{\theta} J(\theta)
Che ci darà un insieme di parametri \theta, i migliori (cioè con meno errori). Una volta fatto, saremo pronti a fare previsioni su nuovi esempi di input con le loro caratteristiche x, utilizzando i nuovi \theta nella funzione di ipotesi:
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}
dove h_\theta(x) è l’output, la previsione, o ancora la probabilità che y = 1.
Il modo in cui minimizzeremo la funzione di costo è usando la discesa del gradiente. La buona notizia è che la procedura è al 99% identica a quella che abbiamo fatto per la regressione lineare.
Per minimizzare la funzione di costo dobbiamo eseguire la funzione di discesa del gradiente su ogni parametro:
Ricorda di aggiornare simultaneamente tutti i \theta_j come abbiamo fatto nella controparte della regressione lineare: se hai n caratteristiche, cioè un vettore di caratteristiche \vec{\theta} = , tutti questi parametri devono essere aggiornati simultaneamente ad ogni iterazione:
inizio{align} \ripetere fino alla convergenza \\theta_0 & := \cdots \theta_1 & := \cdots \cdots \theta_n & := \punti \testo \fine{align}
Tornando all’algoritmo, vi risparmio il calcolo della derivata scoraggiante \frac{parziale}{\teta_j} J(\\teta), che diventa:
{frac{parziale}{parziale \teta_j} J(\theta) = \dfrac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)}) x_j^{(i)}
Così il ciclo sopra può essere riscritto come:
begin{align} \ripetere fino alla convergenza \theta_j & := \theta_j – \alpha \dfrac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)}) x_j^{(i)}
Sorprendentemente, sembra identico a quello che stavamo facendo per la regressione lineare multivariata. Quello che è cambiato però è la definizione dell’ipotesi h_\theta(x): per la regressione lineare avevamo h_\theta(x) = \theta^{\top}{x}, mentre per la regressione logistica abbiamo h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}}.
D’ora in poi si possono applicare le stesse tecniche per ottimizzare l’algoritmo di discesa del gradiente che abbiamo visto per la regressione lineare, per assicurarsi che la conversione al punto di minimo funzioni correttamente. Nel prossimo capitolo mi addentrerò in alcuni trucchi avanzati di ottimizzazione, oltre a definire ed evitare il problema dell’overfitting.