Corso
Dopo aver addestrato un modello di regressione logistica, come puoi essere sicuro di poterti fidare dei coefficienti?
La regressione logistica è nota per essere semplice. Con scikit-learn, chiami .fit(), leggi gli odds ratio, e più o meno è tutto. Ma ciò che molti principianti non sanno è che il modello ha delle assunzioni, e quando non le rispetti, i coefficienti ti fuorviano e le previsioni sono errate in modi che nessuna metrica di test ti indicherà.
A dirla tutta, la regressione logistica ha meno assunzioni della regressione lineare, e quelle che ha sono facili da verificare. Ti basta eseguire le diagnostiche giuste prima di interpretare i risultati per sapere a quali parti del modello dare fiducia.
In questo articolo ti guiderò attraverso ogni assunzione della regressione logistica, come verificarla in Python e R, cosa succede quando è violata e quali alternative usare quando non la si può rispettare.
Se sei alle prime armi con data science e machine learning, leggi il nostro post sul blog sulla semplice regressione lineare per capirne assunzioni e diagnostiche.
Cos'è la regressione logistica?
La regressione logistica è un modello di classificazione che prevede la probabilità di un esito categorico. Le fornisci dei predittori e restituisce un numero tra 0 e 1 che puoi leggere come la probabilità di appartenere a una determinata classe.
La maggior parte delle persone la usa per classificazioni binarie come churn o non churn, spam o non spam. Varianti come la regressione logistica multinomiale e ordinale coprono più di due classi, ma il caso binario è ciò che di solito si intende quando si parla di "regressione logistica".
Sotto il cofano, il modello adatta una combinazione lineare dei predittori e passa il risultato attraverso la funzione logistica. L'output è una probabilità e i coefficienti ti dicono come ciascun predittore sposta i log-odds.
Vale la pena notare che la regressione logistica è diversa dalla regressione lineare. La prima ha assunzioni familiari come normalità dei residui, omoscedasticità, linearità tra predittori e target. La regressione logistica non fa queste assunzioni. Ha un suo elenco, e sono abbastanza diverse che usare le assunzioni della regressione lineare ti darà risultati fuorvianti.
Per maggiori dettagli sulla regressione logistica, leggi il nostro post che mostra l'implementazione in Python.
Perché le assunzioni della regressione logistica contano
Le assunzioni contano perché si collegano direttamente a ciò che fai con il modello.
Se rispetti le assunzioni, i coefficienti significano ciò che pensi significhino. Gli odds ratio che leggi sono validi e le probabilità del modello mappano bene sugli esiti reali. Quando le assunzioni non sono rispettate, tutto questo diventa incerto in modi che una confusion matrix o qualsiasi altra metrica non ti mostrerà.
La buona notizia è che le violazioni non sono binarie. Una lieve deviazione, per esempio, dall'assunzione di linearità del logit non renderà il modello inutile. Significa solo che i tuoi odds ratio sono leggermente imprecisi e le previsioni potrebbero essere peggiori di quanto dovrebbero. Molti modelli in produzione convivono con verifiche delle assunzioni imperfette, e va bene così.
Quello che non vuoi è saltare i controlli. Senza diagnostiche, non puoi capire se stai guardando un problema piccolo o grande finché le previsioni non vanno storte.
Panoramica delle assunzioni della regressione logistica
Prima di entrare in ciascuna assunzione, ecco l'elenco completo che dovrai verificare.
| Assunzione | Cosa richiede | Diagnostica comune |
|---|---|---|
| Osservazioni indipendenti | Nessun record influenza un altro record | Disegno dello studio, correlazione intraclasse |
| Variabile di esito appropriata | Binaria, o modellata con la variante giusta | Ispeziona il target |
| Linearità del logit | Predittori lineari nei log-odds | Test di Box-Tidwell, spline |
| Nessuna multicollinearità grave | Predittori non fortemente correlati | VIF, matrice di correlazione |
| Campione di dimensione sufficiente | Abbastanza eventi per variabile | Regola pratica EPV |
| Nessun outlier influente | Nessun singolo record che distorce il fit | Distanza di Cook, leverage |
Tabella delle assunzioni della regressione logistica
Questa è tutta la checklist. Nel resto dell'articolo ti guiderò attraverso ogni assunzione con diagnostiche in Python e R, come si presenta una violazione e cosa fare quando qualcosa non va.
Le principali assunzioni della regressione logistica
Assunzione 1: La variabile di esito è binaria (o modellata correttamente)
La regressione logistica standard è pensata per un esito binario. La variabile target dovrebbe avere esattamente due categorie e il modello è progettato intorno a questo caso.
Gli esempi classici sono churn o non churn, malattia o non malattia. Qualsiasi cosa tu possa formulare come domanda sì/no è un buon fit.
Quando l'esito ha più di due categorie, ti serve una variante diversa. La regressione logistica multinomiale gestisce categorie non ordinate come segmenti di clienti o tipi di prodotto. La regressione logistica ordinale gestisce categorie ordinate come punteggi di soddisfazione da 1 a 5, in cui l'ordine tra i livelli ha significato.
Forzare un esito multiclasse in un modello binario di solito significa accorpare categorie che non dovresti accorpare. Se hai un target di soddisfazione con cinque livelli e lo riduci a "soddisfatto vs non", perdi informazioni che avrebbero potuto aiutare il tuo modello. Scegli la variante che corrisponde alla forma del tuo target.
Assunzione 2: Le osservazioni sono indipendenti
Ogni riga del dataset dovrebbe fornire al modello informazioni che nessun'altra riga fornisce già. Se due record sono collegati in modo da violare questo, i tuoi errori standard e i p-value non avranno il significato che dovrebbero.
L'assunzione fallisce ogni volta che le osservazioni condividono una struttura che non hai modellato. Un buon esempio sono misure ripetute sullo stesso paziente, che condividono la biologia del paziente. Un altro esempio sono studenti raggruppati nella stessa classe, poiché condividono l'insegnante e l'aula.
Quando ignori questo e adatti una normale regressione logistica, il modello tratta ogni riga come nuova informazione e riduce gli errori standard più di quanto dovrebbe. I coefficienti possono comunque sembrare a posto in superficie, ma i p-value e gli intervalli di confidenza saranno troppo ottimistici.
Le alternative standard sono la regressione logistica a effetti misti e le GEE. I modelli a effetti misti aggiungono effetti casuali per i gruppi (paziente, classe) così che il modello tenga conto della correlazione intra-gruppo. Le GEE, acronimo di generalized estimating equations, ti danno effetti medi di popolazione con errori standard corretti, senza la macchina degli effetti casuali.
Scegli gli effetti misti quando ti interessa la variazione intra-gruppo. Scegli le GEE quando vuoi effetti marginali sull'intera popolazione.
Assunzione 3: Linearità del logit
Questa è l'assunzione che la maggior parte delle persone fraintende nella regressione logistica.
Il modello non assume che i predittori abbiano una relazione lineare con l'esito. Assume che abbiano una relazione lineare con i log-odds dell'esito. È un'affermazione diversa, e cambia ciò che dovresti verificare.
Cos'è il logit
Il logit è il logaritmo naturale degli odds. Per una probabilità p, gli odds sono p / (1 - p), e il logit è il logaritmo di quel rapporto:

Il logit
La regressione logistica adatta poi un'equazione lineare su questa scala:

Formula della regressione logistica
Il lato destro è lineare nei predittori. Il lato sinistro sono i log-odds, non la probabilità. La probabilità che ti interessa davvero si ottiene passando la combinazione lineare attraverso la funzione logistica, che è non lineare.
Quindi la relazione tra un predittore e la probabilità è non lineare. La relazione tra un predittore e i log-odds è ciò che dovrebbe essere lineare.
Perché questo conta in pratica
Quando la linearità del logit non vale per un predittore, il coefficiente su quel predittore sta riassumendo una curva con una retta. Il modello ti dà comunque un numero, e il numero può anche essere statisticamente significativo, ma non descrive la relazione reale nei tuoi dati.
Per esempio, age potrebbe avere un effetto a U sui log-odds di una malattia, con rischio alto a entrambe le estremità e rischio più basso al centro. Se inserisci age come singolo termine lineare, il coefficiente potrebbe risultare vicino a zero e concluderai che l'età non conta. Invece conta. La specificazione è sbagliata.
Verificare la linearità del logit
Hai diverse opzioni per verificare questa assunzione.
Il controllo più rapido è l'ispezione visiva. Raggruppa ciascun predittore continuo in decili, calcola i log-odds empirici all'interno di ogni bin e traccia il risultato rispetto al predittore. Una linea approssimativamente retta significa che l'assunzione tiene. Una curva evidente significa che non tiene. Il controllo è informale ma funziona bene quando hai abbastanza dati per bin.
Il test di Box-Tidwell aggiunge un termine di interazione tra ciascun predittore continuo e il suo logaritmo naturale. Se l'interazione è statisticamente significativa, l'assunzione di linearità del logit è violata per quel predittore. Il test funziona solo su predittori strettamente positivi (poiché non puoi fare il log di zero o di un numero negativo) ed è sensibile alla dimensione del campione come ogni test di significatività.
Le spline sono un'altra opzione. Invece di verificare se la linearità tiene, sostituisci il termine lineare con una base flessibile come una restricted cubic spline e lasci che il modello adatti la forma di cui ha bisogno. Se la spline si adatta molto meglio del termine lineare (valutato con likelihood ratio o AIC), hai evidenza che la specificazione lineare era troppo restrittiva. Le spline fungono anche da correzione. Tenerle nel modello finale è spesso la soluzione migliore quando la linearità fallisce.
Cosa fare quando la linearità fallisce
Se l'assunzione fallisce per un predittore, hai un paio di opzioni:
- Trasforma il predittore (spesso bastano log o radice quadrata) finché la relazione non appare lineare nei log-odds
- Usa le spline e accetta un modello leggermente più complesso
Entrambe ti mantengono nella famiglia della regressione logistica ed entrambe sono meglio che escludere un predittore in realtà informativo.
Assunzione 4: Niente multicollinearità grave
La regressione logistica gestisce predittori correlati fino a un certo punto. Oltre quel punto, il modello inizia a comportarsi male in modi difficili da cogliere da qualsiasi metrica di test.
La multicollinearità si verifica quando due o più predittori hanno la stessa (o molto simile) informazione. Magari hai altezza in pollici e altezza in centimetri nello stesso modello. Magari hai ricavo totale e ricavo per cliente insieme al numero di clienti.
Quando c'è multicollinearità, due cose vanno storte:
- I coefficienti diventano instabili: se aggiungi o rimuovi una singola riga, il coefficiente di un predittore collineare può oscillare o cambiare segno. Il modello continua a funzionare, ma i singoli coefficienti non sono significativi.
- Gli errori standard si gonfiano: con meno informazione indipendente per predittore, il modello è meno certo su ciascun coefficiente. I p-value aumentano e effetti reali possono risultare non significativi.
Le previsioni di solito vanno bene. Se ti interessa solo la probabilità predetta, una multicollinearità da lieve a moderata raramente causa problemi. Il “danno” è concentrato nei coefficienti e nell'inferenza che fai su di essi.
I due controlli sono una matrice di correlazione e il variance inflation factor (VIF). Una matrice di correlazione è la prima cosa da guardare, in particolare le coppie di predittori con correlazioni sopra 0,8 o 0,9 in valore assoluto. Il limite è che le matrici di correlazione catturano solo la collinearità a coppie, non il caso multi-way in cui tre o più predittori sono collettivamente ridondanti.
Il VIF serve per il caso multi-way. Per ogni predittore, il VIF misura quanto la varianza del suo coefficiente è gonfiata dalla collinearità con il resto dei predittori. Un VIF di 1 significa nessuna collinearità, valori fino a 5 di solito vanno bene, e valori sopra 10 sono un segnale forte che il predittore è ridondante con altri nel modello.
Quando il VIF segnala qualcosa, la correzione più semplice è rimuovere uno dei predittori collineari o combinarli in un'unica feature come una somma o un rapporto. Se preferisci tenere tutti i predittori, la regolarizzazione (ridge o elastic net) stabilizza i coefficienti senza costringerti a scegliere.
Assunzione 5: Dimensione del campione adeguata
La regressione logistica funziona con campioni piccoli, ma è un po' inaffidabile. I coefficienti oscillano più del dovuto e gli effetti di classi rare diventano quasi impossibili da stimare.
La dimensione del campione che conta per la regressione logistica non è il numero totale di righe. È il numero di eventi (osservazioni della classe minoritaria). Un dataset con 100.000 righe e 50 casi di frode è un problema di campione piccolo, perché il modello ha solo 50 esempi della cosa che sta cercando di imparare.
Qui entra in gioco gli eventi per variabile (EPV). L'EPV è il numero di osservazioni della classe minoritaria diviso per il numero di predittori nel modello. Se hai 50 casi di frode e 10 predittori, il tuo EPV è 5.
La vecchia regola pratica era un EPV di almeno 10. Simulazioni più recenti hanno mostrato che il numero giusto dipende dalle dimensioni degli effetti nei tuoi dati e dalla quantità di regolarizzazione che usi. EPV fino a 5 possono andare bene in alcuni contesti, e EPV di 20 o più possono essere necessari in altri.
Il punto è trattare l'EPV come un'informazione di allerta. Sotto 10, aspettati stime instabili e considera metodi penalizzati come la regressione logistica di Firth o ridge. Sotto 5, procurati più dati o semplifica il modello prima di fidarti di qualsiasi coefficiente individuale.
Lo sbilanciamento di classe è un problema correlato ma distinto.
Un dataset in cui il 99% dei casi è di una classe può comunque avere molti eventi per variabile in termini assoluti. Ciò che cambia è il tasso base dell'esito, non l'EPV. Dati sbilanciati tendono a produrre stime di probabilità conservative e l'accuracy smette di essere una metrica utile. Per aggirare il problema, valuta con log-loss o Brier score invece dell'accuracy e considera pesi di classe o il tuning della soglia se ti servono decisioni bilanciate.
Assunzione 6: Niente outlier altamente influenti
La regressione logistica non assume che i predittori siano distribuiti normalmente. Predittori asimmetrici e variabili di conteggio vanno bene di per sé. Quello che al modello importa è se una singola osservazione ha un'influenza eccessiva sui coefficienti adattati.
Un'osservazione influente è una che, se rimossa, cambierebbe significativamente il modello. Non è la stessa cosa di un outlier di residuo. Un punto può avere un residuo grande (il modello lo predice male) senza essere influente, e un punto può essere molto influente (il modello fa forte affidamento su di esso) senza avere un residuo grande.
Ti serviranno alcune diagnostiche che guardano a diversi aspetti dell'influenza:
- Leverage misura quanto i valori dei predittori di un'osservazione sono insoliti rispetto al resto dei dati. Il leverage da solo non significa che un'osservazione sia influente. Significa che il punto ha il potenziale per esserlo se il suo esito non corrisponde a ciò che i predittori suggerirebbero
- Distanza di Cook combina leverage e residuo in un unico numero che stima di quanto cambierebbero i coefficienti adattati se eliminassi l'osservazione. Valori alti della distanza di Cook evidenziano i punti da indagare. Convenzioni comuni sono valori sopra 4/n (dove n è la dimensione del campione) o semplicemente guardare le poche distanze di Cook più grandi nel dataset
- Diagnostiche dei residui sono ottime per i casi che leverage e distanza di Cook non colgono. I residui di devianza e di Pearson segnalano osservazioni che il modello fatica ad adattare. Un punto con un residuo grande merita attenzione anche se il suo leverage è moderato, poiché il modello ti sta dicendo che non riesce a spiegare quel caso con gli altri predittori
Quando trovi un punto influente, la domanda è se il punto è reale o sbagliato. Un errore di inserimento dati va corretto o rimosso. Un caso reale ma insolito resta, e annoti che le tue conclusioni dipendono da esso. Solo, non escludere punti perché sono influenti. È così che finisci con un modello che si adatta ai tuoi dati di training e a nient'altro.
Falsi miti sulle assunzioni della regressione logistica
La maggior parte della confusione sulle assunzioni della regressione logistica deriva dall'uso della checklist della regressione lineare. Le assunzioni della regressione lineare sono ben note e insegnate ovunque, e compaiono nella regressione logistica dove non dovrebbero. Ecco i quattro fraintendimenti più comuni da chiarire.
La regressione logistica richiede variabili distribuite normalmente
Falso. La regressione logistica non fa alcuna assunzione di normalità su nessuna variabile nel modello.
L'esito dovrebbe essere binario, non normale, e lo abbiamo trattato nell'Assunzione 1. I predittori non sono nemmeno assunti normali e possono assumere qualsiasi forma abbiano i dati. Ciò che conta è la relazione tra i predittori e i log-odds, non la distribuzione marginale di una singola variabile.
La regressione logistica richiede omoscedasticità
Anche questo è falso. L'omoscedasticità (varianza costante dei residui lungo l'intervallo dei valori predetti) è un'assunzione della regressione lineare che non si applica alla regressione logistica.
La varianza dell'esito nella regressione logistica dipende dalla probabilità predetta stessa. Per un esito di Bernoulli, la varianza è pari a p(1 - p), che è massima vicino a p = 0.5 e minima vicino a 0 e 1. La varianza non è costante, e il modello lo tiene in conto tramite la funzione di verosimiglianza che massimizza.
Quindi quando adatti una regressione logistica, non stai violando nulla se le probabilità predette hanno varianze diverse. È proprio così che funziona il modello.
I predittori devono essere distribuiti normalmente
Falso. La regressione logistica non pone assunzioni distributive sui predittori.
Puoi mescolare predittori continui, binari, di conteggio e categorici nello stesso modello. Predittori asimmetrici vanno bene. Predittori con code pesanti vanno bene. Al modello non interessa la forma marginale. L'unica cosa che gli interessa è la linearità del logit (trattata nell'Assunzione 3), che è un'assunzione sulla forma della relazione, non sulla forma della distribuzione.
Se l'asimmetria di un predittore crea problemi, di solito è a causa della linearità del logit o di outlier influenti.
I residui devono essere distribuiti normalmente
Falso. Non c'è alcuna assunzione di normalità sui residui della regressione logistica.
La regressione lineare assume che i residui siano normalmente distribuiti attorno a zero, perché fa parte del suo impianto inferenziale. La regressione logistica usa la massima verosimiglianza su una verosimiglianza binomiale, e la distribuzione dei residui è determinata dall'esito (che è 0 o 1) e dalla probabilità adattata. Non sono normali, e non dovrebbero esserlo.
Quindi quando controlli le diagnostiche dei residui per la regressione logistica (come nell'Assunzione 6), stai cercando osservazioni influenti e punti che il modello non riesce a spiegare, non una curva a campana.
Come verificare le assunzioni della regressione logistica in Python
Userò statsmodels per le diagnostiche. Scikit-learn adatta la regressione logistica ma non fornisce VIF, statistiche di influenza o diagnostiche dei residui out of the box.
Impostare l'esempio
Genererò un dataset sintetico di churn con tre predittori (età, reddito e punteggio di spesa), in cui età e reddito sono deliberatamente correlati così che la multicollinearità abbia qualcosa da rilevare.
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
np.random.seed(42)
n = 1000
age = np.random.normal(40, 12, n).clip(18, 80)
income = 30000 + 1500 * age + np.random.normal(0, 8000, n)
spending_score = np.random.uniform(1, 100, n)
logit_p = -3 + 0.04 * age + 0.02 * spending_score
p = 1 / (1 + np.exp(-logit_p))
y = np.random.binomial(1, p)
df = pd.DataFrame({
"churned": y,
"age": age,
"income": income,
"spending_score": spending_score,
})
model = smf.glm(
"churned ~ age + income + spending_score",
data=df, family=sm.families.Binomial()
).fit()
print(model.summary())

Riepilogo del modello
Il riepilogo ti fornisce coefficienti, errori standard, statistiche z e p-value. age e spending_score risultano predittori significativi. Il coefficiente di income è minuscolo perché l'esito non dipende direttamente dal reddito. Il suo effetto apparente viene assorbito da age.
Multicollinearità con VIF
Con statsmodels il calcolo è estremamente semplice:
from statsmodels.stats.outliers_influence import variance_inflation_factor
X = sm.add_constant(df[["age", "income", "spending_score"]])
vif = pd.DataFrame({
"feature": X.columns,
"VIF": [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
})
print(vif[vif["feature"] != "const"])

Output VIF
I VIF per age e income risultano intorno a 5,5, il che mostra una multicollinearità lieve. spending_score è vicino a 1, che è ciò che vuoi. La sua varianza non è gonfiata dalla collinearità con gli altri. VIF sopra 5 sono lievi segnali; sopra 10 sono un problema serio da risolvere subito. La mossa qui è rimuovere uno tra age o income o combinarli in un'unica feature.
Linearità del logit con Box-Tidwell
Il test di Box-Tidwell aggiunge termini di interazione tra ciascun predittore continuo e il suo logaritmo naturale. Interazioni significative segnalano una relazione non lineare nei log-odds per quel predittore.
df_bt = df.copy()
for col in ["age", "income", "spending_score"]:
df_bt[f"{col}_logx"] = df_bt[col] * np.log(df_bt[col])
bt_formula = (
"churned ~ age + income + spending_score + "
"age_logx + income_logx + spending_score_logx"
)
bt_model = smf.glm(
bt_formula, data=df_bt, family=sm.families.Binomial()
).fit()
interactions = ["age_logx", "income_logx", "spending_score_logx"]
print(bt_model.pvalues[interactions])

Output Box-Tidwell
Se uno di questi p-value è sotto 0,05, l'assunzione di linearità del logit è dubbia per quel predittore. Qui il logit è stato generato linearmente, quindi le interazioni non dovrebbero essere significative. Su dati reali, tratta un risultato significativo come un invito a tracciare i log-odds empirici rispetto a quel predittore e decidere se una trasformazione o una spline è la correzione giusta.
Diagnostiche di influenza
Statsmodels ti dà accesso a distanza di Cook e leverage tramite get_influence().
influence = model.get_influence()
cooks_d = influence.cooks_distance[0]
leverage = influence.hat_matrix_diag
flagged = pd.DataFrame({
"cooks_d": cooks_d,
"leverage": leverage,
}).sort_values("cooks_d", ascending=False).head(10)
print(flagged)

Output diagnostiche di influenza
La soglia della distanza di Cook degna di indagine è circa 4/n. Con 1000 righe, è 0,004. Qualsiasi valore ben al di sopra necessita di un esame più attento. In questo dataset, le distanze di Cook più grandi sono ancora piccole in termini assoluti, che è l'esito noioso-ma-buono che di solito vuoi.
Ora creo una visualizzazione per rendere più leggibile la distribuzione:

Diagnostiche di influenza visualizzate
I punti ben al di sopra della soglia tratteggiata sono quelli da indagare. Ce ne sono alcuni, ma non troppi.
Diagnostiche dei residui
I residui di devianza ti dicono quali osservazioni il modello fatica ad adattare.
deviance_resid = model.resid_deviance
fitted = model.fittedvalues
resid_df = pd.DataFrame({
"fitted": fitted,
"deviance": deviance_resid,
}).sort_values("deviance", key=abs, ascending=False).head(10)
print(resid_df)

Output diagnostiche dei residui
Residui di devianza grandi e positivi sono casi in cui il modello ha assegnato una probabilità bassa ma in realtà erano positivi. Residui grandi e negativi sono l'opposto. Dovresti incrociare le osservazioni ad alto residuo con le diagnostiche di influenza sopra. Un caso che è sia mal predetto sia influente è quello che vale maggiormente la pena indagare.
Come verificare le assunzioni della regressione logistica in R
R ha un supporto integrato più stretto per queste diagnostiche. Gran parte di ciò che ti serve proviene dalla glm() base di R più il pacchetto car.
Impostare l'esempio
Genererò lo stesso tipo di dataset sintetico dell'esempio in Python, con età e reddito deliberatamente correlati.
set.seed(42)
n <- 1000
age <- pmin(pmax(rnorm(n, mean = 40, sd = 12), 18), 80)
income <- 30000 + 1500 * age + rnorm(n, sd = 8000)
spending_score <- runif(n, min = 1, max = 100)
logit_p <- -3 + 0.04 * age + 0.02 * spending_score
p <- 1 / (1 + exp(-logit_p))
churned <- rbinom(n, size = 1, prob = p)
df <- data.frame(churned, age, income, spending_score)
model <- glm(churned ~ age + income + spending_score,
data = df, family = binomial)
summary(model)

Output riepilogo del modello
L'output di summary(model) ti fornisce coefficienti, errori standard, statistiche z e p-value. age e spending_score dovrebbero apparire significativi, mentre l'effetto di income viene assorbito da age.
Multicollinearità con VIF
Il pacchetto car fornisce vif() per qualsiasi glm:
library(car)
vif(model)

Output VIF in R
age e income restituiranno entrambi VIF intorno a 5,7, che mostra la multicollinearità incorporata nei dati. spending_score è vicino a 1. Come in Python, valori sopra 5 meritano attenzione e valori sopra 10 sono un problema chiaro.
Linearità del logit con Box-Tidwell
La funzione car::boxTidwell è progettata per la regressione lineare, quindi per la regressione logistica l'approccio migliore è aggiungere manualmente i termini di interazione e riadattare:
df_bt <- df
df_bt$age_logx <- df_bt$age * log(df_bt$age)
df_bt$income_logx <- df_bt$income * log(df_bt$income)
df_bt$spending_score_logx <- df_bt$spending_score * log(df_bt$spending_score)
bt_model <- glm(
churned ~ age + income + spending_score +
age_logx + income_logx + spending_score_logx,
data = df_bt, family = binomial
)
interactions <- c("age_logx", "income_logx", "spending_score_logx")
summary(bt_model)$coefficients[interactions, ]

Output BoX-Tidwell in R
L'output mostra coefficiente e p-value per ciascun termine di interazione. P-value significativi segnalano una violazione dell'assunzione di linearità del logit per quel predittore. Per i dati sintetici qui, il test non dovrebbe rifiutare la linearità. Su dati reali, prosegui con grafici dei log-odds empirici o adatta un modello con spline (dal pacchetto splines) per qualsiasi predittore segnalato dal test.
Diagnostiche di influenza
R fornisce cooks.distance() e hatvalues() in base, quindi non serve alcun pacchetto di terze parti:
cooks_d <- cooks.distance(model)
leverage <- hatvalues(model)
influence_df <- data.frame(
index = seq_along(cooks_d),
cooks_d = cooks_d,
leverage = leverage
)
head(influence_df[order(-influence_df$cooks_d), ], 10)

Diagnostiche di influenza in R
La soglia per la distanza di Cook è la stessa che in Python: 4/n, ovvero 0,004 per il dataset da 1000 righe. Qualsiasi valore ben superiore merita indagine. Per un controllo visivo rapido, plot(model, which = 4) della base R fornisce un grafico della distanza di Cook in una riga.

Diagnostiche di influenza in R visualizzate
Diagnostiche dei residui
La funzione residuals() di R ti dà i residui di devianza da un glm:
deviance_resid <- residuals(model, type = "deviance")
fitted_vals <- fitted(model)
resid_df <- data.frame(
fitted = fitted_vals,
deviance = deviance_resid
)
head(resid_df[order(-abs(resid_df$deviance)), ], 10)

Diagnostiche dei residui in R
Residui di devianza di grande valore assoluto sono casi in cui la previsione del modello ha mancato. Dovresti incrociare questi con i flag della distanza di Cook sopra per trovare osservazioni che sono sia mal adattate sia influenti.
Per una vista unica di tutto, influence.measures(model) restituisce una tabella che combina distanza di Cook, leverage, DFBETAs e un paio di altre statistiche di influenza in un unico posto. È il modo più veloce per scansionare tutte le diagnostiche standard su un glm adattato.
Cosa succede quando le assunzioni sono violate?
La maggior parte delle violazioni delle assunzioni non “romperà” il modello nel senso che non funziona. Lo fa comportare in modi sottili che noti solo se sai cosa cercare.
Quattro conseguenze si presentano più spesso:
- Coefficienti instabili: piccoli cambiamenti nei dati (alcune righe aggiunte o tolte, una leggera modifica all'engineering delle feature) possono cambiare drasticamente i coefficienti o invertirne i segni. È ciò che fa la multicollinearità, ed è anche ciò che accade quando il campione è troppo piccolo per il numero di predittori
- Scarsa calibrazione: le probabilità predette dal modello smettono di corrispondere ai tassi effettivi nei dati. Predice il 30% di churn per un gruppo e osservi il 15%. L'accuracy può anche sembrare buona, ma le probabilità sono sballate. Violazioni della linearità del logit e outlier influenti contribuiscono entrambe a questo
- Inferenza fuorviante: questa è la più difficile da individuare, perché il modello produce comunque errori standard e p-value che sembrano a posto. Osservazioni correlate riducono gli errori standard al di sotto di dove dovrebbero essere, e specificazioni dei predittori errate li gonfiano. In ogni caso, i p-value che ottieni non significano ciò che pensi significhino
- Qualità predittiva degradata: il sintomo più evidente, anche se spesso il più piccolo in pratica. Le previsioni di solito resistono meglio dei coefficienti, motivo per cui i team che guardano solo all'accuracy spesso perdono i segnali di allarme.
Detto onestamente, le violazioni raramente rendono un modello inutile. Rendono inaffidabili alcune sue parti, e le parti inaffidabili dipendono da quale assunzione è saltata. Ecco perché le diagnostiche contano.
Alternative quando le assunzioni della regressione logistica falliscono
Se le diagnostiche indicano problemi che non puoi risolvere all'interno della regressione logistica, la prossima mossa è usare un modello che non fa quelle assunzioni.
I modelli additivi generalizzati (GAM) sono la cosa successiva da considerare. Un GAM mantiene la funzione di collegamento logistica e la struttura additiva interpretabile, ma sostituisce i termini lineari con funzioni smooth di ciascun predittore. Ottieni coefficienti-con-forme invece di numeri singoli, risolvendo il problema della linearità del logit. I GAM sono ancora abbastanza parametrici da ispezionare e interpretare, il che li rende un buon passo avanti rispetto alla regressione logistica quando l'assunzione di linearità non può valere.
I modelli basati su alberi sono l'alternativa più flessibile. Random forest e gradient boosting non fanno assunzioni sulle distribuzioni dei predittori o sulle forme delle relazioni. Gestiscono la multicollinearità e possono anche catturare non linearità. Non ti danno l'interpretazione semplice dei coefficienti che offre la regressione logistica, ma tendono a superarla sulle metriche predittive quando i dati hanno struttura non lineare o interazioni che non hai inserito nel modello.
La scelta tra GAM e modelli ad albero dipende da ciò che ti serve dal modello.
- Scegli i GAM quando l'interpretabilità è la priorità e vuoi vedere come ciascun predittore influisce sui log-odds
- Scegli un albero boosting quando la qualità predittiva è la priorità e puoi accettare un modello meno trasparente
Vale la pena notare che le assunzioni della regressione logistica sono più facili da verificare che da ignorare. Se puoi risolvere il problema con una trasformazione, una spline, regolarizzazione o un campione migliore, l'interpretabilità e l'output inferenziale della regressione logistica di solito battono ciò che ottieni passando a un modello più flessibile.
Quindi, passa a GAM o alberi quando le diagnostiche ti dicono che le assunzioni davvero non tengono, non solo perché la regressione logistica non è un algoritmo all'avanguardia.
Best practice per la modellazione con regressione logistica
Infine, segui questo breve elenco per ottenere sempre un modello di cui fidarti:
- Verifica le assunzioni prima dell'interpretazione: esegui VIF, il test di Box-Tidwell e le diagnostiche di influenza prima di leggere i coefficienti. Se interpreti prima e controlli dopo, ti ritroverai a difendere numeri che non hai verificato. Non vuoi essere quella persona in riunione
- Usa la regolarizzazione quando il campione è piccolo: ridge o elastic net stabilizzano i coefficienti quando l'EPV è basso o i predittori sono correlati. Il trade-off è un piccolo bias in cambio di una grande riduzione della varianza, che di solito è un buon affare
- Valida su dati che il modello non ha visto: tieni da parte un test set o usa la cross-validation. Le metriche di training sovrastimano le prestazioni ogni volta che il modello ha spazio per overfittare, cosa che la regressione logistica fa quando hai molti predittori o eventi rari
- Valuta la calibrazione: l'accuracy nasconde se le probabilità predette mappano sui tassi reali. Usa log-loss o Brier score per la valutazione e guarda un grafico di calibrazione quando le probabilità contano per le decisioni di business
Conclusione
A dirla tutta, la regressione logistica è uno dei modelli più indulgenti che puoi adattare.
Tollera predittori asimmetrici e esiti sbilanciati, e non gli importa come sono i tuoi residui. Ciò che non può tollerare è una relazione con i log-odds specificata male, o un insieme di predittori che hanno tutti la stessa informazione.
Ecco perché linearità del logit e multicollinearità sono i due controlli delle assunzioni da trattare come obbligatori. Sono quelli che distorcono il modello in modi che nessuna metrica di test può cogliere. Anche le altre quattro assunzioni sono rilevanti, ma queste due sono quelle su cui dovresti davvero concentrarti.
Per andare sul sicuro, esegui le diagnostiche insieme alla valutazione, non dopo. Un modello che predice bene e passa i controlli delle assunzioni è un modello che puoi difendere. Qualsiasi altra cosa è un modello che hai addestrato ma che non hai davvero verificato.
Se tutto questo ti sembra complesso, è perché lo è. Serve molto per essere un buon machine learning engineer, quindi ti consigliamo di iscriverti al nostro Machine Learning Scientist in Python. 85 ore di materiali ti renderanno pronto per il lavoro nel 2026.
FAQs
La regressione logistica ha delle assunzioni?
Sì. La regressione logistica ha meno assunzioni della regressione lineare, ma non è priva di assunzioni. Le principali riguardano la forma della variabile di esito, l'indipendenza delle osservazioni, la linearità dei log-odds e l'assenza di multicollinearità elevata o di punti altamente influenti.
Quali sono le assunzioni più importanti della regressione logistica?
Le due che contano di più sono la linearità del logit e l'assenza di multicollinearità elevata. La linearità del logit è la più spesso fraintesa, poiché la regressione logistica non assume una relazione lineare tra predittori ed esito, ma ne assume una tra predittori e log-odds. La multicollinearità conta perché distorce i coefficienti e gonfia gli errori standard senza intaccare l'accuracy, quindi può sfuggire a qualsiasi controllo che guardi solo alle prestazioni predittive.
Cosa succede se le assunzioni della regressione logistica sono violate?
Dipende da quale assunzione salta. Violazioni della linearità del logit o una forte multicollinearità danneggiano silenziosamente i coefficienti lasciando intatta l'accuracy, motivo per cui sono facili da perdere. Fallimenti dell'indipendenza gonfiano o riducono gli errori standard, rendendo i p-value inaffidabili. La maggior parte delle violazioni non rende un modello inutile, ma rende inaffidabili alcune parti in modi che la sola accuracy non mostrerà.
La regressione logistica richiede predittori distribuiti normalmente?
No. La regressione logistica non pone assunzioni distributive sui predittori. Puoi mescolare predittori continui, categorici, asimmetrici e con code pesanti nello stesso modello senza problemi. Ciò che conta è la relazione tra ciascun predittore e i log-odds, non la forma marginale del predittore stesso.
Qual è una buona soglia VIF per la regressione logistica?
Valori di VIF fino a 5 di solito vanno bene, valori tra 5 e 10 suggeriscono una multicollinearità moderata che merita indagine e valori sopra 10 sono un segnale che uno o più predittori sono ridondanti. Le soglie non sono regole rigide ma convenzioni, poiché l'interpretazione del VIF dipende dalla dimensione del campione e dalla precisione di cui hai bisogno. Se il VIF di un predittore è alto e il suo errore standard appare instabile su sottoinsiemi di dati, hai evidenza che la collinearità sta creando problemi.
