Regressione logistica – Un tutorial completo con esempi in R

La regressione logistica è un algoritmo di modellazione predittiva che viene utilizzato quando la variabile Y è categorica binaria. Cioè, può assumere solo due valori come 1 o 0. L’obiettivo è quello di determinare un’equazione matematica che può essere utilizzata per prevedere la probabilità dell’evento 1. Una volta che l’equazione è stabilita, può essere usata per predire la Y quando solo le X sono note.

Regressione logistica – Un tutorial completo con esempi in R Contents1. Introduzione alla Regressione Logistica
2. Alcuni esempi del mondo reale di problemi di classificazione binaria
3. Perché non la regressione lineare?
4. L’equazione logistica
5. Come costruire un modello di regressione logistica in R?
6. Come gestire lo squilibrio di classe?
7. Come gestire lo squilibrio di classe con Upsample e Downsample?
8. Costruzione del modello di regressione logistica
9. Come predire sul dataset di test
10. Perché è importante gestire lo squilibrio di classe?
11. Conclusione

1. Introduzione alla regressione logistica

Prima hai visto cos’è la regressione lineare e come usarla per predire le variabili Y continue.

Nella regressione lineare la variabile Y è sempre una variabile continua. Se supponiamo che la variabile Y sia categorica, non si può usare la regressione lineare per modellarla.

Quindi cosa fareste quando la Y è una variabile categorica con 2 classi?

La regressione logistica può essere usata per modellare e risolvere tali problemi, chiamati anche problemi di classificazione binaria.

Un punto chiave da notare qui è che Y può avere solo 2 classi e non di più. Se Y ha più di 2 classi, diventerebbe una classificazione multiclasse e non è più possibile utilizzare la regressione logistica di vaniglia per questo.

Tuttavia, la regressione logistica è una classica tecnica di modellazione predittiva e rimane ancora una scelta popolare per la modellazione di variabili binarie categoriche.

Un altro vantaggio della regressione logistica è che calcola un punteggio di probabilità di previsione di un evento. Ne riparleremo quando cominceremo a costruire i modelli.

Alcuni esempi del mondo reale di problemi di classificazione binaria

Potresti chiederti per quali tipi di problemi puoi usare la regressione logistica.

Ecco alcuni esempi di problemi di classificazione binaria:

  • Rilevamento dello Spam: Predire se una email è Spam o no
  • Frode con carta di credito: Predire se una data transazione con carta di credito è una frode o no
  • Salute : Predire se una data massa di tessuto è benigna o maligna
  • Marketing : Predire se un dato utente comprerà o meno un prodotto assicurativo
  • Banking : Predire se un cliente sarà inadempiente su un prestito.

Perché non la regressione lineare?

Quando la variabile di risposta ha solo 2 possibili valori, è auspicabile avere un modello che predica il valore come 0 o 1 o come un punteggio di probabilità che varia tra 0 e 1.

La regressione lineare non ha questa capacità. Perché, se si usa la regressione lineare per modellare una variabile di risposta binaria, il modello risultante potrebbe non limitare i valori Y predetti entro 0 e 1.

Regressione lineare vs regressione logistica

Ecco dove entra in gioco la regressione logistica. Nella regressione logistica, si ottiene un punteggio di probabilità che riflette la probabilità del verificarsi dell’evento.

Un evento in questo caso è ogni riga del dataset di allenamento. Potrebbe essere qualcosa come classificare se una data email è spam, o una massa di cellule è maligna o un utente comprerà un prodotto e così via.

L’equazione logistica

La regressione logistica ottiene questo prendendo le probabilità logiche dell’evento ln(P/1?P), dove, P è la probabilità dell’evento. Quindi P è sempre compreso tra 0 e 1.

Prendendo l’esponente su entrambi i lati dell’equazione si ottiene:

Si può implementare questa equazione usando la funzione glm() impostando l’argomento family a "binomial".

Inoltre, un avvertimento importante è di assicurarsi di impostare il type="response" quando si usa la funzione predict su un modello di regressione logistica. Altrimenti, predirà il log odds di P, cioè il valore Z, invece della probabilità stessa.

Come costruire un modello di regressione logistica in R?

Ora vediamo come implementare la regressione logistica usando il dataset BreastCancer nel pacchetto mlbench. Dovrete installare il pacchetto mlbench per questo.

L’obiettivo qui è quello di modellare e prevedere se un dato campione (riga nel dataset) è benign o malignant, sulla base di 9 altre caratteristiche della cella. Quindi, carichiamo i dati e teniamo solo i casi completi.

Breast Cancer Dataset

Il dataset ha 699 osservazioni e 11 colonne. La colonna Class è la variabile di risposta (dipendente) e dice se un dato tessuto è maligno o benigno.

Controlliamo la struttura di questo dataset.

A parte Id, tutte le altre colonne sono fattori. Questo è un problema quando si modella questo tipo di dati.

Perché, quando si costruisce un modello logistico con variabili fattore come caratteristiche, si converte ogni livello nel fattore in una variabile binaria dummy di 1 e 0.

Per esempio, Cell shape è un fattore con 10 livelli. Quando si usa glm per modellare Class in funzione della forma della cellula, la forma della cellula sarà divisa in 9 diverse variabili binarie categoriche prima di costruire il modello.

Se si vuole costruire un modello logistico senza fare alcun passo preparatorio, si potrebbe fare come segue. Ma non lo seguiremo, perché ci sono alcune cose di cui occuparsi prima di costruire il modello logit.

La sintassi per costruire un modello logit è molto simile alla funzione lm che avete visto nella regressione lineare. Basta impostare il family='binomial' per glm per costruire un modello di regressione logistica.

glm sta per modelli lineari generalizzati ed è in grado di costruire molti tipi di modelli di regressione oltre alla regressione lineare e logistica.

Vediamo come potrebbe essere il codice per costruire un modello logistico. Tornerò su questo passo più tardi perché ci sono alcuni passi di pre-elaborazione da fare prima di costruire il modello.

Nel modello di cui sopra, Class è modellato come una funzione di Cell.shape da sola.

Ma notate dall’output, il Cell.Shape è stato diviso in 9 variabili diverse. Questo perché, dato che Cell.Shape è memorizzato come una variabile fattore, glm crea 1 variabile binaria (una variabile dummy) per ognuno dei 10 livelli categorici di Cell.Shape.

E’ chiaro che dal significato di Cell.Shape sembra esserci una sorta di ordine all’interno dei livelli categorici di Cell.Shape. Cioè, un valore di forma della cella 2 è maggiore della forma della cella 1 e così via.

Questo è il caso anche di altre variabili nel set di dati. Quindi, è preferibile convertirle in variabili numeriche e rimuovere la colonna id.

Se fosse stata una pura variabile categorica senza ordinamento interno, come, ad esempio, il sesso del paziente, si potrebbe lasciare quella variabile come fattore a sé stante.

# remove id columnbc <- bc# convert factors to numericfor(i in 1:9) { bc <- as.numeric(as.character(bc))}

Another important point to note. When converting a factor to a numeric variable, you should always convert it to character and then to numeric, else, the values can get screwed up.

Now all the columns are numeric.

Also I’d like to encode the response variable into a factor variable of 1’s and 0’s. Though, this is only an optional step.

So whenever the Class is malignant, it will be 1 else it will be 0. Then, I am converting it into a factor.

bc$Class <- ifelse(bc$Class == "malignant", 1, 0)bc$Class <- factor(bc$Class, levels = c(0, 1))

The response variable Class is now a factor variable and all other columns are numeric.

Alright, the classes of all the columns are set. Let’s proceed to the next step.

How to deal with Class Imbalance?

Before building the logistic regressor, you need to randomly split the data into training and test samples.

Since the response variable is a binary categorical variable, you need to make sure the training data has approximately equal proportion of classes.

table(bc$Class)#> benign malignant #> 444 239

Le classi ‘benigno’ e ‘maligno’ sono divise approssimativamente in rapporto 1:2.

E’ chiaro che c’è uno squilibrio di classe. Quindi, prima di costruire il modello logit, è necessario costruire i campioni in modo tale che sia gli 1 che gli 0 siano in proporzioni approssimativamente uguali.

Questa preoccupazione è normalmente gestita con un paio di tecniche chiamate:

  • Down Sampling
  • Up Sampling
  • Hybrid Sampling usando SMOTE e ROSE.

Cos’è il Down Sampling e l’Up Sampling?

7. Come gestire lo squilibrio di classe con Upsampling e Downsampling

Nel Down sampling, la classe di maggioranza è campionata a caso per avere la stessa dimensione della classe minore. Ciò significa che, quando si crea il set di dati di addestramento, le righe con la classe benigna saranno scelte meno volte durante il campionamento casuale.

Similmente, in UpSampling, le righe della classe minoritaria, cioè malignant viene ripetutamente campionata più e più volte fino a raggiungere la stessa dimensione della classe maggioritaria (benign).

Ma nel caso di Hybrid sampling, vengono generati punti dati artificiali e vengono aggiunti sistematicamente intorno alla classe minoritaria. Questo può essere implementato usando i pacchetti SMOTE e ROSE.

Tuttavia, per questo esempio, mostrerò come fare il campionamento verso l’alto e verso il basso.

Così lasciatemi creare i dati di allenamento e di test usando il pacchetto caret.

Nello snippet sopra, ho caricato il pacchetto caret e usato la funzione createDataPartition per generare i numeri di riga per il dataset di allenamento. Impostando p=.70ho scelto il 70% delle righe per andare dentro trainData e il restante 30% per andare in testData.

table(trainData$Class)

Ci sono circa 2 volte più campioni benigni. Quindi ricampioniamoli usando la funzione downSample del pacchetto caret.

Per fare questo basta fornire le variabili X e Y come argomenti.

Benigni e maligni sono ora nello stesso rapporto.

La %ni% è la negazione della funzione %in% e l’ho usata qui per selezionare tutte le colonne tranne la colonna Class.

La funzione downSample richiede la ‘y’ come variabile fattore, questo è il motivo per cui avevo convertito la classe in un fattore nei dati originali.

Grande! Ora faccio l’upsampling usando la funzione upSample. Segue una sintassi simile a quella di downSample.

Come previsto, benigno e maligno sono ora nello stesso rapporto.

Utilizzerò la versione downSampled del dataset per costruire il modello logit nel prossimo passo.

Costruire il modello di regressione logistica

Come predire sul dataset di test

Il logitmod è ora costruito. Ora puoi usarlo per predire la risposta su testData.

pred <- predict(logitmod, newdata = testData, type = "response")

Ora, pred contiene la probabilità che l’osservazione sia maligna per ogni osservazione.

Nota che, quando usi la regressione logistica, devi impostare type='response' per calcolare le probabilità di previsione. Questo argomento non è necessario nel caso della regressione lineare.

La pratica comune è di prendere il cutoff di probabilità come 0,5. Se la probabilità di Y è > 0,5, allora può essere classificato un evento (maligno).

Quindi se pred è maggiore di 0,5, è maligno altrimenti è benigno.

y_pred_num <- ifelse(pred > 0.5, 1, 0)y_pred <- factor(y_pred_num, levels=c(0, 1))y_act <- testData$Class

Calcoliamo la precisione, che non è altro che la proporzione di y_pred che corrisponde a y_act.

mean(y_pred == y_act) 

Ecco un tasso di precisione del 94%.

Perché è importante gestire lo squilibrio di classe?

Va bene, ho promesso che vi dirò perché è necessario prendersi cura dello squilibrio di classe prima. Per capirlo, supponiamo di avere un set di dati in cui il 95% dei valori Y appartiene alla classe benigna e il 5% appartiene alla classe maligna.

Se avessi previsto alla cieca tutti i punti di dati come benigni, avrei raggiunto una percentuale di precisione del 95%. Il che sembra abbastanza alto. Ma ovviamente questo è imperfetto. Ciò che conta è quanto bene prevedi le classi maligne.

Quindi questo richiede che le classi benigne e maligne siano bilanciate E oltre a questo ho bisogno di misure di accuratezza più raffinate e metriche di valutazione del modello per migliorare il mio modello di predizione.

Codice completo

Conclusione

In questo post hai visto quando e come usare la regressione logistica per classificare variabili binarie di risposta in R.

Lo hai visto con un esempio basato sul BreastCancer dataset dove l’obiettivo era determinare se una data massa di tessuto è maligna o benigna.

Costruire il modello e classificare l’Y è solo metà del lavoro. In realtà, nemmeno la metà. Perché, l’ambito delle metriche di valutazione per giudicare l’efficacia del modello è vasto e richiede un attento giudizio per scegliere il modello giusto. Nella prossima parte, discuterò varie metriche di valutazione che aiuteranno a capire quanto bene si comporta il modello di classificazione da diverse prospettive.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.