course
După ce ai antrenat un model de regresie logistică, cum poți fi sigur că te poți baza pe coeficienți?
Regresia logistică e cunoscută pentru simplitate. Cu scikit-learn, apelezi .fit(), citești rapoartele de cote (odds ratios) și cam asta e. Dar ceea ce majoritatea începătorilor nu știu este că modelul are propriile presupuneri, iar când nu le respecți, coeficienții te induc în eroare, iar predicțiile sunt greșite în moduri pe care nicio metrică nu ți le va semnala.
Adevărul e că regresia logistică are mai puține presupuneri decât regresia liniară, iar cele pe care le are sunt ușor de verificat. Trebuie doar să rulezi diagnosticele potrivite înainte să interpretezi rezultatele, ca să știi în ce părți ale modelului poți avea încredere.
În acest articol, te voi ghida prin fiecare presupunere a regresiei logistice, cum să o verifici în Python și R, ce se întâmplă când e încălcată și ce alternative să alegi când presupunerile nu pot fi respectate.
Dacă ești nou în data science și machine learning, citește articolul nostru despre Regresia liniară simplă pentru a înțelege presupunerile și diagnosticele ei.
Ce este regresia logistică?
Regresia logistică este un model de clasificare care prezice probabilitatea unui rezultat categorial. Îi dai predictori, iar el îți întoarce un număr între 0 și 1 pe care îl poți interpreta ca probabilitatea de a aparține unei anumite clase.
Majoritatea o folosesc pentru clasificare binară, cum ar fi churn sau fără churn, spam sau nu. Variantele, precum regresia logistică multinomială și ordinală, acoperă mai mult de două clase, dar cazul binar e ceea ce înseamnă de obicei „regresie logistică”.
În spate, modelul potrivește o combinație liniară a predictorilor tăi și trece rezultatul prin funcția logistică. Ieșirea este o probabilitate, iar coeficienții îți spun cum deplasează fiecare predictor log-cotele.
Merită menționat că regresia logistică e diferită de regresia liniară. Cea din urmă are presupuneri familiare precum normalitatea reziduurilor, homoscedasticitate, linearitate între predictori și țintă. Regresia logistică nu face aceste presupuneri. Are propria listă, iar ele sunt suficient de diferite încât folosirea presupunerilor de la o regresie liniară îți va da rezultate înșelătoare.
Pentru mai multe detalii despre regresia logistică, citește articolul nostru care arată implementarea în Python.
De ce contează presupunerile regresiei logistice
Presupunerile contează pentru că sunt direct legate de ce faci cu modelul.
Dacă respecți presupunerile, coeficienții înseamnă ceea ce crezi că înseamnă. Rapoartele de cote pe care le citești sunt valide, iar probabilitățile modelului se potrivesc bine cu rezultatele reale. Când presupunerile nu sunt respectate, toate acestea devin șubrede în moduri pe care o matrice de confuzie sau orice altă metrică nu ți le va arăta.
Partea bună este că încălcările nu sunt binare. O abatere ușoară de la, să zicem, presupunerea de linearitate a logitului nu va face modelul inutil. Doar înseamnă că rapoartele de cote sunt ușor greșite și predicțiile ar putea fi mai slabe decât ar trebui. Multe modele din producție trăiesc cu verificări imperfecte ale presupunerilor, și e în regulă.
Ce nu vrei este să sari peste verificări. Fără diagnostice, nu poți spune dacă te uiți la o problemă mică sau una mare până când predicțiile o iau razna.
Prezentare generală a presupunerilor în regresia logistică
Înainte de a intra în fiecare presupunere, iată lista completă pe care trebuie să o verifici.
| Presupunere | Ce cere | Diagnostic comun |
|---|---|---|
| Observații independente | Nicio înregistrare nu influențează altă înregistrare | Designul studiului, corelație intra-clasă |
| Variabilă de rezultat adecvată | Binara sau modelată cu varianta potrivită | Inspectează ținta |
| Linearitatea logitului | Predictori lineari în log-cote | Testul Box-Tidwell, splines |
| Fără multicoliniaritate severă | Predictori care nu sunt puternic corelați | VIF, matrice de corelație |
| Mărime suficientă a eșantionului | Suficiente evenimente per variabilă | Regula EPV |
| Fără outlieri influenți | Nicio înregistrare unică nu denaturează potrivirea | Distanța Cook, leverage |
Tabelul cu presupunerile regresiei logistice
Aceasta e toată lista de verificare. În restul articolului, te voi ghida prin fiecare presupunere, cu diagnostice în Python și R, cum arată o încălcare și ce să faci când ceva nu merge bine.
Principalele presupuneri ale regresiei logistice
Presupunerea 1: Variabila de rezultat este binară (sau modelată adecvat)
Regresia logistică standard este construită pentru un rezultat binar. Variabila țintă ar trebui să aibă exact două categorii, iar modelul este conceput pentru acest caz.
Exemplele clasice sunt churn sau nu, boală sau nu. Orice poți formula ca întrebare da/nu se potrivește bine.
Când rezultatul are mai mult de două categorii, ai nevoie de o altă variantă. Regresia logistică multinomială acoperă categorii neordonate, precum segmente de clienți sau tipuri de produse. Regresia logistică ordinală acoperă categorii ordonate, precum scoruri de satisfacție de la 1 la 5, unde ordinea are sens.
Forțarea unui rezultat multi-clasă într-un model binar de obicei înseamnă să colapsezi categorii pe care n-ar trebui să le colapsezi. Dacă ai o țintă de satisfacție cu cinci niveluri și o reduci la „mulțumit vs. nemulțumit”, pierzi informație care ți-ar fi putut ajuta modelul. Alege varianta care se potrivește formei țintei tale.
Presupunerea 2: Observațiile sunt independente
Fiecare rând din setul tău de date ar trebui să ofere modelului informații pe care niciun alt rând nu le furnizează deja. Dacă două înregistrări sunt legate într-un mod care încalcă asta, erorile standard și valorile p nu vor însemna ceea ce ar trebui.
Presupunerea eșuează ori de câte ori observațiile împart o structură pe care n-ai modelat-o. Un exemplu bun sunt măsurători repetate pe același pacient, care împart biologia acelui pacient. Alt exemplu: elevi grupați în aceeași clasă, care împart profesorul și sala.
Când ignori asta și potrivești o regresie logistică simplă, modelul tratează fiecare rând ca informație nouă și reduce erorile standard mai mult decât ar trebui. Coeficienții pot părea în regulă la suprafață, dar valorile p și intervalele de încredere vor fi prea optimiste.
Alternativele standard sunt regresia logistică cu efecte mixte și GEE. Modelele cu efecte mixte adaugă efecte aleatoare pentru grupuri (pacient, clasă) astfel încât modelul să țină cont de corelația intra-grup. GEE, adică generalized estimating equations, îți dau efecte medii la nivel de populație cu erori standard corectate, fără mecanismul efectelor aleatoare.
Alege efecte mixte când îți pasă de variația intra-grup. Alege GEE când vrei efecte marginale pe întreaga populație.
Presupunerea 3: Linearitatea logitului
Aceasta este presupunerea pe care majoritatea o înțeleg greșit despre regresia logistică.
Modelul nu presupune că predictorii au o relație liniară cu rezultatul. Presupune că au o relație liniară cu log-cotele rezultatului. E altă afirmație și schimbă ceea ce trebuie să verifici.
Ce este logitul
Logitul este logaritmul natural al cotelor. Pentru o probabilitate p, cotele sunt p / (1 - p), iar logitul este logaritmul acelui raport:

Logitul
Regresia logistică potrivește apoi o ecuație liniară pe această scară:

Formula regresiei logistice
Partea dreaptă este liniară în predictori. Partea stângă sunt log-cotele, nu probabilitatea. Probabilitatea care te interesează este recuperată trecând combinația liniară prin funcția logistică, care este neliniară.
Deci relația dintre orice predictor și probabilitate este neliniară. Ceea ce ar trebui să fie liniar este relația dintre orice predictor și log-cote.
De ce contează asta în practică
Când linearitatea logitului nu se menține pentru un predictor, coeficientul acelui predictor rezumă o curbă cu o linie dreaptă. Modelul tot îți dă un număr, iar numărul poate fi chiar semnificativ statistic, dar nu descrie relația reală din date.
De exemplu, age poate avea un efect în formă de U asupra log-cotelor unei boli, cu risc mare la capete și risc mai mic la mijloc. Dacă pui age ca un singur termen liniar, coeficientul poate ieși aproape de zero și vei concluziona că vârsta nu contează. Contează. Specificația este greșită.
Verificarea linearității logitului
Ai câteva opțiuni pentru a verifica această presupunere.
Cea mai rapidă verificare este inspecția vizuală. Împarte fiecare predictor continuu în decile, calculează log-cotele empirice în fiecare bin și plotează rezultatul în funcție de predictor. O linie aproximativ dreaptă înseamnă că presupunerea se menține. O curbă evidentă înseamnă că nu. Verificarea este informală, dar funcționează bine când ai suficiente date per bin.
Testul Box-Tidwell adaugă un termen de interacțiune între fiecare predictor continuu și propriul său logaritm natural. Dacă interacțiunea este semnificativă statistic, presupunerea linearității logitului este încălcată pentru acel predictor. Testul funcționează doar pe predictori strict pozitivi (deoarece nu poți lua logaritmul de zero sau de numere negative) și este sensibil la mărimea eșantionului, ca orice test de semnificație.
Spline-urile sunt o altă opțiune. În loc să verifici dacă linearitatea se menține, înlocuiești termenul liniar cu o bază flexibilă, precum un spline cubic restricționat, și lași modelul să potrivească forma de care are nevoie. Dacă spline-ul se potrivește mult mai bine decât termenul liniar (judecat prin raportul de verosimilitate sau AIC), ai dovezi că specificația liniară a fost prea restrictivă. Spline-urile funcționează și ca remediu. Păstrarea lor în modelul final e adesea cea mai bună soluție când linearitatea eșuează.
Ce faci când linearitatea eșuează
Dacă presupunerea eșuează pentru un predictor, ai câteva opțiuni:
- Transformă predictorul (un log sau o rădăcină pătrată de multe ori sunt suficiente) până când relația arată liniară în log-cote
- Folosește spline-uri și acceptă un model puțin mai complex
Ambele te mențin în familia regresiei logistice și sunt mai bune decât să excluzi un predictor care este de fapt informativ.
Presupunerea 4: Fără multicoliniaritate severă
Regresia logistică gestionează predictori corelați până la un punct. După acel punct, modelul începe să se comporte ciudat în moduri greu de depistat din orice metrică.
Multicoliniaritatea apare când doi sau mai mulți predictori au aceeași (sau foarte similară) informație. Poate ai înălțimea în inci și înălțimea în centimetri în același model. Poate ai venit total și venit per client împreună cu numărul de clienți.
Două lucruri merg prost când există multicoliniaritate:
- Coeficienții devin instabili: Dacă adaugi sau elimini un singur rând, coeficientul unui predictor coliniar poate oscila sau își poate schimba semnul. Modelul încă funcționează, dar coeficienții individuali nu sunt semnificativi.
- Erorile standard se umflă: Cu mai puțină informație independentă per predictor, modelul devine mai puțin sigur despre fiecare coeficient. Valorile p cresc și efectele reale pot apărea ca nesemnificative.
Predicțiile sunt de obicei în regulă. Dacă îți pasă doar de probabilitatea prezisă, multicoliniaritatea ușoară spre moderată rareori creează probleme. „Daunele” sunt concentrate în coeficienți și în inferența pe care o faci asupra lor.
Cele două verificări sunt o matrice de corelație și factorul de inflație a varianței (VIF). O matrice de corelație e primul lucru de privit, în special perechile de predictori cu corelații peste 0,8 sau 0,9 în valoare absolută. Limita ei este că prinde doar colinearitatea pereche, nu cazul multi-direcțional în care trei sau mai mulți predictori sunt redundant colectiv.
VIF e pentru cazul multi-direcțional. Pentru fiecare predictor, VIF măsoară cât de mult este umflată varianța coeficientului său de coliniaritatea cu restul predictorilor. Un VIF de 1 înseamnă fără coliniaritate, valori până la 5 sunt de obicei ok, iar valori peste 10 sunt un semnal puternic că predictorul e redundant cu alții din model.
Când VIF semnalează ceva, cea mai simplă soluție este să elimini unul dintre predictorii coliniari sau să-i combini într-o singură caracteristică, cum ar fi o sumă sau un raport. Dacă preferi să păstrezi toți predictorii, regularizarea (ridge sau elastic net) stabilizează coeficienții fără să te oblige să alegi.
Presupunerea 5: Mărime adecvată a eșantionului
Regresia logistică funcționează cu eșantioane mici, dar e oarecum nesigură. Coeficienții oscilează mai mult decât ar trebui, iar efectele din clasa rară devin aproape imposibil de estimat.
Mărimea eșantionului care contează pentru regresia logistică nu este numărul total de rânduri. Este numărul de evenimente (observații în clasa minoritară). Un set de date cu 100.000 de rânduri și 50 de cazuri de fraudă este o problemă de eșantion mic, deoarece modelul are doar 50 de exemple ale lucrului pe care încearcă să-l învețe.
Aici intervine „evenimente per variabilă” (EPV). EPV este numărul de observații din clasa minoritară împărțit la numărul de predictori din model. Dacă ai 50 de cazuri de fraudă și 10 predictori, EPV este 5.
Vechea regulă era un EPV de cel puțin 10. Lucrări de simulare mai recente au arătat că numărul potrivit depinde de mărimile efectelor din datele tale și de cantitatea de regularizare folosită. EPV-uri de până la 5 pot fi în regulă în unele setări, iar EPV-uri de 20 sau mai mult pot fi necesare în altele.
Concluzia este să tratezi EPV ca pe o informație de avertizare. Sub 10, așteaptă-te la estimări instabile și ia în considerare metode penalizate precum regresia logistică a lui Firth sau ridge. Sub 5, obține mai multe date sau simplifică modelul înainte să te încrezi în orice coeficient individual.
Dezechilibrul de clasă este o problemă înrudită, dar distinctă.
Un set de date în care 99% dintre cazuri sunt o clasă poate avea încă suficiente evenimente per variabilă în termeni absoluți. Ceea ce se schimbă este rata de bază a rezultatului, nu EPV. Datele dezechilibrate tind să producă estimări de probabilitate conservatoare, iar acuratețea încetează să mai fie o metrică utilă. Pentru a evita asta, evaluează cu log-loss sau scorul Brier în loc de acuratețe și ia în considerare ponderi de clasă sau reglarea pragului dacă ai nevoie de decizii echilibrate.
Presupunerea 6: Fără outlieri cu influență mare
Regresia logistică nu presupune că predictorii sunt distribuiți normal. Predictori asimetrici și variabile de numărare sunt în regulă. Ceea ce contează este dacă vreo observație are o influență disproporționată asupra coeficienților potriviți.
O observație influentă este una care, dacă ai elimina-o, ar schimba semnificativ modelul. Nu e același lucru cu un outlier al reziduurilor. Un punct poate avea un reziduu mare (modelul îl prezice prost) fără a fi influent, și un punct poate fi foarte influent (modelul se bazează mult pe el) fără a avea un reziduu mare.
Vei dori câteva diagnostice care privesc aspecte diferite ale influenței:
- Leverage măsoară cât de neobișnuite sunt valorile predictorilor unei observații față de restul datelor. Leverage singur nu înseamnă că o observație e influentă. Înseamnă că punctul are potențialul de a fi influent dacă rezultatul său nu se potrivește cu ceea ce ar sugera predictorii
- Distanța Cook combină leverage-ul cu reziduul într-un singur număr care estimează cât de mult s-ar schimba coeficienții potriviți dacă ai elimina observația. Valori mari ale distanței Cook evidențiază punctele care merită investigate. Convențiile comune sunt valori peste 4/n (unde n este mărimea eșantionului) sau pur și simplu privirea către cele mai mari câteva valori din setul tău de date
- Diagnosticele reziduurilor sunt excelente pentru cazurile pe care leverage și distanța Cook nu le prind. Reziduurile de devianță și reziduurile Pearson semnalează observații pe care modelul are dificultăți în a le potrivi. Un punct cu un reziduu mare merită analizat chiar dacă leverage-ul său e moderat, deoarece modelul îți spune că nu poate explica acel caz cu ceilalți predictori
Când găsești un punct influent, întrebarea este dacă punctul este real sau greșit. O eroare de introducere date se corectează sau se elimină. Un caz real, dar neobișnuit, rămâne, iar tu notezi că concluziile tale depind de el. Doar nu exclude puncte doar pentru că sunt influente. Așa ajungi la un model care se potrivește pe datele de antrenament și nimic altceva.
Idei greșite comune despre presupunerile regresiei logistice
Majoritatea confuziilor privind presupunerile regresiei logistice vin din folosirea listei de verificare a regresiei liniare. Presupunerile regresiei liniare sunt bine cunoscute și predate peste tot și apar și la regresia logistică acolo unde nu își au locul. Iată cele patru cele mai comune pe care să le clarificăm.
Regresia logistică cere variabile distribuite normal
Fals. Regresia logistică nu face nicio presupunere de normalitate pentru vreo variabilă din model.
Rezultatul ar trebui să fie binar, nu normal, și am acoperit asta la Presupunerea 1. Nici predictorii nu sunt presupuşi normali, iar ei pot avea orice formă au datele. Contează relația dintre predictori și log-cote, nu distribuția marginală a vreunei variabile.
Regresia logistică cere homoscedasticitate
Și asta e fals. Homoscedasticitatea (varianță constantă a reziduurilor pe domeniul valorilor prezise) este o presupunere a regresiei liniare care nu se aplică regresiei logistice.
Varianța rezultatului în regresia logistică depinde de însăși probabilitatea prezisă. Pentru un rezultat Bernoulli, varianța este p(1 - p), care e cea mai mare în jur de p = 0.5 și cea mai mică aproape de 0 și 1. Varianța nu e constantă, iar modelul ține cont de asta prin funcția de verosimilitate pe care o maximizează.
Așadar, când potrivești o regresie logistică, nu încalci nimic având probabilități prezise cu varianțe diferite. Așa funcționează modelul.
Predictorii trebuie să fie distribuiți normal
Fals. Regresia logistică nu impune nicio presupunere de distribuție asupra predictorilor.
Poți amesteca predictori continui, binari, de numărare și categorici în același model. Predictori asimetrici sunt în regulă. Predictori cu cozi grele sunt în regulă. Modelul nu se interesează de formele marginale. Singurul lucru care contează este linearitatea logitului (acoperită la Presupunerea 3), care este o presupunere despre forma relației, nu despre forma distribuției.
Dacă asimetria unui predictor creează probleme, de obicei e din cauza linearității logitului sau a outlierilor influenți.
Reziduurile trebuie să fie distribuite normal
Fals. Nu există nicio presupunere de normalitate asupra reziduurilor în regresia logistică.
Regresia liniară presupune că reziduurile sunt distribuite normal în jurul lui zero, pentru că așa funcționează inferența ei. Regresia logistică folosește estimarea prin verosimilitate maximă pe o verosimilitate binomială, iar distribuția reziduurilor este determinată de rezultat (0 sau 1) și de probabilitatea potrivită. Ele nu sunt normale și nici nu ar trebui să fie.
Așadar, când verifici diagnosticele reziduurilor pentru regresia logistică (ca în Presupunerea 6), cauți observații influente și puncte pe care modelul nu le poate explica, nu o curbă în formă de clopot.
Cum să verifici presupunerile regresiei logistice în Python
Voi face diagnosticele cu statsmodels. Scikit-learn potrivește regresie logistică, dar nu îți oferă din start VIF, statistici de influență sau diagnostice de reziduuri.
Configurarea exemplului
Voi genera un set de date sintetic de churn cu trei predictori (vârstă, venit și scor de cheltuieli), unde vârsta și venitul sunt intenționat corelate, astfel încât multicoliniaritatea să aibă ce găsi.
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())

Rezumatul modelului
Rezumatul îți oferă coeficienți, erori standard, statistici z și valori p. age și spending_score ies ca predictori relevanți. Coeficientul lui income este minuscul pentru că rezultatul nu depinde direct de venit. Efectul său aparent este absorbit de vârstă.
Multicoliniaritatea cu VIF
Statsmodels face acest calcul extrem de ușor:
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"])

Rezultatul VIF
VIF-urile pentru age și income ies în jur de 5,5, ceea ce arată multicoliniaritate ușoară. spending_score este aproape de 1, ceea ce e bine. Varianța lui nu este umflată de coliniaritate cu ceilalți. VIF-uri peste 5 sunt semnale ușoare; peste 10 sunt o problemă serioasă ce trebuie rezolvată imediat. Mișcarea aici este fie să elimini unul dintre age sau income, fie să le combini într-o singură caracteristică.
Linearitatea logitului cu Box-Tidwell
Testul Box-Tidwell adaugă termeni de interacțiune între fiecare predictor continuu și propriul său logaritm natural. Interacțiunile semnificative semnalează o relație neliniară a log-cotelor pentru acel predictor.
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])

Rezultatul Box-Tidwell
Dacă oricare dintre aceste valori p iese sub 0,05, presupunerea linearității logitului e suspectă pentru acel predictor. Aici logitul a fost generat liniar, deci interacțiunile n-ar trebui să fie semnificative. Pe date reale, tratează un rezultat semnificativ ca un îndemn de a plota log-cotele empirice în funcție de acel predictor și de a decide dacă o transformare sau un spline e soluția potrivită.
Diagnostice de influență
Statsmodels îți oferă acces la distanța Cook și leverage prin 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)

Rezultatele diagnosticelor de influență
Pragul pentru distanța Cook care merită investigat este aproximativ 4/n. Cu 1000 de rânduri, asta înseamnă 0.004. Orice e mult peste asta necesită o privire mai atentă. În acest set de date, cele mai mari distanțe Cook sunt încă mici în termeni absoluți, ceea ce e rezultatul plictisitor-bun pe care de obicei ți-l dorești.
Voi crea acum o vizualizare pentru a face distribuția mai ușor de citit:

Diagnostic de influență vizualizat
Punctele situate mult deasupra liniei punctate sunt cele de investigat. Există câteva, dar nu prea multe.
Diagnostice ale reziduurilor
Reziduurile de devianță îți spun care observații modelul are dificultăți în a le potrivi.
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)

Rezultatele diagnosticelor de reziduuri
Reziduurile de devianță mari și pozitive sunt cazuri unde modelul a atribuit o probabilitate mică, dar observat a fost pozitiv. Reziduurile mari și negative sunt inversul. Ar trebui să corelezi observațiile cu reziduuri mari cu diagnosticele de influență de mai sus. Un caz care este atât prost prezis, cât și influent este cel care merită cel mai mult să fie investigat.
Cum să verifici presupunerile regresiei logistice în R
R are suport mai strâns încorporat pentru aceste diagnostice. Majoritatea lucrurilor de care ai nevoie vin din R de bază, glm() plus pachetul car.
Configurarea exemplului
Voi genera același tip de set de date sintetic ca în exemplul Python, cu vârsta și venitul intenționat corelate.
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)

Rezumatul modelului
Ieșirea summary(model) îți oferă coeficienți, erori standard, statistici z și valori p. age și spending_score ar trebui să arate relevante, în timp ce efectul lui income este absorbit de age.
Multicoliniaritatea cu VIF
Pachetul car îți oferă vif() pentru orice glm:
library(car)
vif(model)

Rezultatul VIF în R
age și income vor avea ambele VIF-uri în jur de 5,7, ceea ce arată multicoliniaritatea construită în date. spending_score este aproape de 1. Ca și în Python, valorile peste 5 merită atenție, iar cele peste 10 sunt o problemă clară.
Linearitatea logitului cu Box-Tidwell
Funcția car::boxTidwell este concepută pentru regresia liniară, așa că pentru regresia logistică cea mai bună abordare este să adaugi manual termenii de interacțiune și să refaci potrivirea:
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, ]

Rezultatul BoX-Tidwell în R
Ieșirea arată coeficientul și valoarea p pentru fiecare termen de interacțiune. Valorile p semnificative semnalează o încălcare a presupunerii linearității logitului pentru acel predictor. Pentru datele sintetice de aici, testul n-ar trebui să respingă linearitatea. Pe date reale, continuă cu ploturi ale log-cotelor empirice sau potrivește un model cu spline-uri (din pachetul splines) pentru orice predictor pe care testul îl semnalează.
Diagnostice de influență
R oferă cooks.distance() și hatvalues() în baza standard, deci nu e nevoie de pachete terțe:
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)

Diagnostice de influență în R
Pragul pentru distanța Cook este același ca în Python: 4/n, adică 0.004 pentru setul de 1000 de rânduri. Orice e mult peste asta merită investigat. Pentru o verificare vizuală rapidă, plot(model, which = 4) din R de bază îți oferă un grafic al distanței Cook dintr-o singură linie.

Diagnostice de influență în R, vizualizate
Diagnostice ale reziduurilor
Funcția residuals() din R îți dă reziduurile de devianță dintr-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)

Diagnostice ale reziduurilor în R
Reziduurile absolute mari ale devianței sunt cazuri pe care predicția modelului le-a ratat. Ar trebui să corelezi acestea cu semnalele distanței Cook de mai sus pentru a găsi observațiile care sunt atât prost potrivite, cât și influente.
Pentru o vedere dintr-o privire a tot, influence.measures(model) returnează un tabel care combină distanța Cook, leverage, DFBETA-uri și câteva alte statistici de influență într-un singur loc. Este cel mai rapid mod de a scana toate diagnosticele standard pe un glm potrivit.
Ce se întâmplă când presupunerile sunt încălcate?
Cele mai multe încălcări ale presupunerilor nu îți „strică” modelul în sensul că nu mai funcționează. Îl fac să se comporte subtil greșit în moduri pe care le observi doar dacă știi la ce să te uiți.
Patru consecințe apar cel mai des:
- Coeficienți instabili: Schimbări mici în date (câteva rânduri adăugate sau eliminate, o mică schimbare în feature engineering) pot schimba drastic coeficienții sau le pot inversa semnele. Asta face multicoliniaritatea și tot asta se întâmplă când eșantionul e prea mic pentru numărul de predictori
- Calibrare slabă: Probabilitățile prezise de model nu mai corespund ratelor reale din date. Prezice 30% churn pentru un grup și observi 15%. Acuratețea poate arăta în continuare bine, dar probabilitățile sunt greșite. Încălcările linearității logitului și outlierii influenți contribuie la asta
- Inferență înșelătoare: Aceasta e cea mai greu de observat, deoarece modelul încă produce erori standard și valori p care arată bine. Observațiile corelate reduc erorile standard sub cât ar trebui, iar specificațiile greșite ale predictorilor le umflă. În ambele cazuri, valorile p pe care le obții nu înseamnă ceea ce crezi
- Calitate degradată a predicției: Simptomul cel mai evident, deși adesea cel mai mic în practică. Predicțiile rezistă de obicei mai bine decât coeficienții, motiv pentru care echipele care se concentrează doar pe acuratețe ratează adesea semnalele de avertizare.
Dar sincer, încălcările rareori fac un model inutil. Ele fac părți din el nesigure, iar părțile nesigure depind de presupunerea care a eșuat. De aceea diagnosticele contează.
Alternative când presupunerile regresiei logistice eșuează
Dacă diagnosticările indică probleme pe care nu le poți remedia în cadrul regresiei logistice, următoarea mișcare este să folosești un model care nu face acele presupuneri.
Modelele aditive generalizate (GAM) sunt următorul lucru de privit. Un GAM păstrează funcția de legătură logistică și structura aditivă interpretabilă, dar înlocuiește termenii liniari cu funcții netede ale fiecărui predictor. Obții coeficienți-cu-formă în loc de numere simple, ceea ce rezolvă problema linearității logitului. GAM-urile sunt încă suficient de parametrică pentru a fi inspectate și interpretate, ceea ce le face un pas bun după regresia logistică atunci când presupunerea de linearitate nu poate fi menținută.
Modelele pe bază de arbori sunt alternativa mai flexibilă. Pădurile aleatorii și boostingul gradienților nu fac presupuneri despre distribuțiile predictorilor sau formele relațiilor. Gestionează multicoliniaritatea și pot surprinde chiar neliniaritatea. Nu îți dau interpretarea ușoară a coeficienților pe care o oferă regresia logistică, dar tind să depășească la metricile predictive când datele au structură neliniară sau interacțiuni pe care nu le-ai pus în model.
Alegerea între GAM-uri și modele pe arbori ține de ceea ce ai nevoie de la model.
- Alege GAM-uri când prioritatea este interpretabilitatea și vrei să vezi cum afectează fiecare predictor log-cotele
- Alege un arbore boostat cu gradient când prioritatea este calitatea predicției și poți accepta un model mai puțin transparent
Merită menționat că presupunerile regresiei logistice sunt mai ușor de verificat decât de ignorat. Dacă poți corecta problema cu o transformare, un spline, regularizare sau un eșantion mai bun, interpretabilitatea și ieșirile inferențiale ale regresiei logistice de obicei depășesc ceea ce obții din trecerea la un model mai flexibil.
Așadar, treci la GAM-uri sau arbori când diagnosticele îți spun că presupunerile chiar nu se mențin, nu doar pentru că regresia logistică nu e un algoritm „state of the art”.
Bune practici pentru modelarea cu regresie logistică
Și, în final, urmează această listă scurtă ca să obții mereu un model în care poți avea încredere:
- Inspectează presupunerile înainte de interpretare: Rulează VIF, testul Box-Tidwell și diagnosticele de influență înainte să citești coeficienții. Dacă interpretezi mai întâi și verifici după, te vei trezi apărând niște numere pe care nu le-ai verificat. Nu vrei să fii acea persoană la o ședință
- Folosește regularizare când eșantionul e mic: Ridge sau elastic net stabilizează coeficienții când EPV e mic sau predictorii sunt corelați. Compromisul este un mic bias pentru o reducere mare a varianței, ceea ce, de obicei, e un schimb corect
- Validează pe date nevăzute de model: Ține deoparte un set de test sau folosește cross-validation. Metricile pe antrenare supraestimează performanța ori de câte ori modelul are spațiu de supraînvățare, ceea ce regresia logistică are ori de câte ori ai mulți predictori sau evenimente rare
- Evaluează calibrarea: Acuratețea ascunde dacă probabilitățile prezise corespund ratelor reale. Folosește log-loss sau scorul Brier pentru evaluare și uită-te la un grafic de calibrare când probabilitățile contează pentru decizii de business
Concluzie
Adevărul e că regresia logistică este unul dintre modelele mai iertătoare pe care le poți potrivi.
Tolerează predictori asimetrici și rezultate dezechilibrate și nu îi pasă cum arată reziduurile tale. Ce nu poate tolera este o relație specificată greșit cu log-cotele sau un set de predictori care poartă toți aceeași informație.
De aceea, linearitatea logitului și multicoliniaritatea sunt cele două verificări ale presupunerilor pe care merită să le tratezi ca obligatorii. Ele sunt cele care deformează modelul în moduri pe care nicio metrică nu le poate prinde. Celelalte patru presupuneri sunt și ele relevante, dar pe acestea două ar trebui să te concentrezi cu adevărat.
Ca să fii în siguranță, rulează diagnosticele alături de evaluare, nu după. Un model care prezice bine și își trece verificările de presupuneri este un model pe care îl poți susține. Orice mai puțin e un model pe care l-ai antrenat, dar nu l-ai verificat cu adevărat.
Dacă ți se pare complex, asta pentru că este. E nevoie de multe pentru a fi un bun inginer de machine learning, așa că îți recomandăm să te înscrii în traseul nostru Machine Learning Scientist in Python. 85 de ore de materiale te vor pregăti pentru job în 2026.
Întrebări frecvente
Regresia logistică are presupuneri?
Da. Regresia logistică are mai puține presupuneri decât regresia liniară, dar nu este lipsită de presupuneri. Cele principale vizează forma variabilei de rezultat, independența observațiilor, linearitatea log-cotelor și absența unei multicoliniaritati ridicate sau a punctelor foarte influente.
Care sunt cele mai importante presupuneri ale regresiei logistice?
Cele două care contează cel mai mult sunt linearitatea logitului și absența multicoliniarității ridicate. Linearitatea logitului este cel mai adesea înțeleasă greșit, deoarece regresia logistică nu presupune o relație liniară între predictori și rezultat, dar presupune una între predictori și log-cote. Multicoliniaritatea contează pentru că denaturează coeficienții și umflă erorile standard fără a afecta acuratețea, astfel că se poate ascunde de orice verificare care se uită doar la performanța predictivă.
Ce se întâmplă dacă presupunerile regresiei logistice sunt încălcate?
Depinde care presupunere se rupe. Încălcările linearității logitului sau multicoliniaritatea puternică deteriorează discret coeficienții, lăsând acuratețea neatinsă, motiv pentru care sunt ușor de ratat. Încălcarea independenței umflă sau micșorează erorile standard, făcând valorile p nesigure. Majoritatea încălcărilor nu fac modelul inutil, dar fac părți din el nesigure în moduri pe care acuratețea singură nu le va arăta.
Regresia logistică necesită predictori distribuiți normal?
Nu. Regresia logistică nu impune nicio presupunere de distribuție asupra predictorilor. Poți amesteca predictori continui, categorici, asimetrici și cu cozi grele în același model fără probleme. Contează relația dintre fiecare predictor și log-cote, nu forma marginală a predictorului în sine.
Care este un prag VIF bun pentru regresia logistică?
Valorile VIF de până la 5 sunt de obicei în regulă, valorile între 5 și 10 sugerează multicoliniaritate moderată care merită investigată, iar valorile peste 10 indică faptul că unul sau mai mulți predictori sunt redundanți. Pragurile nu sunt reguli stricte, ci convenții, deoarece interpretarea VIF depinde de mărimea eșantionului și de precizia de care ai nevoie. Dacă VIF-ul unui predictor este mare și eroarea sa standard pare instabilă între sub-eșantioane, ai dovezi că colinearitatea creează probleme.