course
Efter att du har tränat en modell för logistisk regression, hur kan du vara säker på att du kan lita på koefficienterna?
Logistisk regression är känd för att vara enkel. Med scikit-learn anropar du .fit(), läser av odds-kvoterna, och det är ungefär det. Men vad de flesta nybörjare inte vet är att modellen har egna antaganden, och när du inte följer dem vilseleder koefficienterna dig och förutsägelserna blir fel på sätt som inga testmått kommer att avslöja.
Sanningen är att logistisk regression har färre antaganden än linjär regression, och de den har är lätta att kontrollera. Du behöver bara köra rätt diagnostik innan du tolkar utfallet för att veta vilka delar av modellen du kan lita på.
I den här artikeln går jag igenom varje antagande som logistisk regression gör, hur du kontrollerar vart och ett i Python och R, vad som händer när de bryts, och vilka alternativ du kan ta till när antagandena inte kan följas.
Om du är ny inom data science och maskininlärning, läs vårt blogginlägg om enkel linjär regression för att förstå dess antaganden och diagnostik.
Vad är logistisk regression?
Logistisk regression är en klassificeringsmodell som förutspår sannolikheten för ett kategoriskt utfall. Du matar in prediktorer, och den returnerar ett tal mellan 0 och 1 som du kan läsa som sannolikheten att tillhöra en given klass.
De flesta använder den för binär klassificering som churn eller inte churn, skräppost eller inte skräppost. Varianter som multinomial och ordinal logistisk regression täcker fler än två klasser, men det binära fallet är vad de flesta menar när de säger "logistisk regression".
Under ytan anpassar modellen en linjär kombination av dina prediktorer och skickar resultatet genom den logistiska funktionen. Utfallet är en sannolikhet, och koefficienterna berättar hur varje prediktor förskjuter log-oddsen.
Det är värt att notera att logistisk regression skiljer sig från linjär regression. Den senare har välkända antaganden som normalfördelade residualer, homoskedasticitet, linearitet mellan prediktorer och målvariabel. Logistisk regression gör inte de antagandena. Den har sin egen lista, och de är tillräckligt annorlunda för att antaganden från en linjär regression ska ge vilseledande resultat.
För mer detaljer om logistisk regression, läs vårt blogginlägg som visar implementering i Python.
Varför antagandena i logistisk regression spelar roll
Antagandena spelar roll eftersom de har en direkt koppling till vad du gör med modellen.
Om du respekterar antagandena betyder koefficienterna det du tror att de betyder. Odds-kvoterna du läser av är giltiga, och modellens sannolikheter mappar väl mot faktiska utfall. När antagandena inte respekteras blir allt detta skakigt på sätt som en förvirringsmatris eller något annat mått inte visar.
Det bra är att överträdelser inte är binära. En mild avvikelse från till exempel antagandet om linearitet i logiten gör inte din modell oanvändbar. Det betyder bara att dina odds-kvoter är något fel och att dina förutsägelser kan vara sämre än de borde vara. Många produktionsmodeller lever med ofullkomliga antagandekontroller, och det är okej.
Det du inte vill är att hoppa över kontrollerna. Utan diagnostik kan du inte avgöra om du tittar på ett litet eller ett stort problem förrän förutsägelserna slår fel.
Översikt över antaganden i logistisk regression
Innan vi går in på varje antagande, här är hela listan du behöver kontrollera.
| Antagande | Vad det kräver | Vanlig diagnostik |
|---|---|---|
| Oberoende observationer | Ingen post påverkar en annan post | Studiedesign, intraklasskorrelation |
| Lämplig utfallsvariabel | Binär, eller modellerad med rätt variant | Inspektera målet |
| Linearitet i logiten | Prediktorer linjära i log-oddsen | Box–Tidwell-test, splines |
| Ingen allvarlig multikollinearitet | Prediktorer inte starkt korrelerade | VIF, korrelationsmatris |
| Tillräcklig storlek på urvalet | Tillräckligt med händelser per variabel | EPV-tumregel |
| Inga inflytelserika outliers | Ingen enskild post snedvrider anpassningen | Cook’s avstånd, leverage |
Tabell över antaganden i logistisk regression
Det är hela checklistan. I resten av artikeln går jag igenom varje antagande med diagnostik i Python och R, hur en överträdelse ser ut, och vad du gör när något går fel.
De viktigaste antagandena i logistisk regression
Antagande 1: Utfallsvariabeln är binär (eller lämpligt modellerad)
Standardlogistisk regression är byggd för ett binärt utfall. Målvariabeln ska ha exakt två kategorier, och modellen är utformad för det fallet.
De klassiska exemplen är churn eller inte churn, sjukdom eller ingen sjukdom. Allt du kan formulera som en ja/nej-fråga passar bra.
När ditt utfall har fler än två kategorier behöver du en annan variant. Multinomial logistisk regression hanterar icke-ordnade kategorier som kundsegment eller produkttyper. Ordinal logistisk regression hanterar ordnade kategorier som nöjdhetsbetyg från 1 till 5, där ordningen mellan nivåerna har betydelse.
Att tvinga in ett multiklassutfall i en binär modell innebär oftast att du slår ihop kategorier som inte borde slås ihop. Om du har ett nöjdhetsmål med fem nivåer och skär ner det till "nöjd vs inte", förlorar du information som kunde ha hjälpt din modell. Välj varianten som matchar formen på ditt mål.
Antagande 2: Observationerna är oberoende
Varje rad i din data ska ge modellen information som ingen annan rad redan ger. Om två poster är länkade på ett sätt som bryter mot detta, kommer dina standardfel och p-värden inte att betyda det de borde.
Antagandet faller när observationer delar struktur som du inte har modellerat. Ett bra exempel är upprepade mätningar på samma patient, eftersom de delar patientens biologi. Ett annat exempel är elever grupperade i samma klassrum, eftersom de delar lärare och rum.
När du ignorerar detta och anpassar en vanlig logistisk regression behandlar modellen varje rad som ny information och minskar standardfelen mer än den borde. Koefficienterna kan fortfarande se bra ut på ytan, men p-värden och konfidensintervall blir överdrivet självsäkra.
Standardalternativen är logistisk regression med mixade effekter och GEE. Modeller med mixade effekter lägger till slumpmässiga effekter för grupperna (patient, klassrum) så att modellen tar hänsyn till korrelation inom grupp. GEE, som står för generalized estimating equations, ger dig populationsgenomsnittliga effekter med korrigerade standardfel, utan maskineriet för slumpmässiga effekter.
Välj mixade effekter när du bryr dig om variation inom grupp. Välj GEE när du vill ha marginaleffekter över hela populationen.
Antagande 3: Linearitet i logiten
Detta är antagandet som flest missförstår om logistisk regression.
Modellen antar inte att dina prediktorer har ett linjärt samband med utfallet. Den antar att de har ett linjärt samband med log-oddsen för utfallet. Det är ett annat påstående, och det förändrar vad du ska kontrollera.
Vad logiten är
Logiten är den naturliga logaritmen av oddsen. För en sannolikhet p är oddsen p / (1 - p), och logiten är logaritmen av den kvoten:

Logiten
Logistisk regression anpassar sedan en linjär ekvation på denna skala:

Formel för logistisk regression
Högersidan är linjär i prediktorerna. Vänstersidan är log-oddsen, inte sannolikheten. Sannolikheten du faktiskt bryr dig om fås genom att skicka den linjära kombinationen genom den logistiska funktionen, som är icke-linjär.
Så sambandet mellan en prediktor och sannolikheten är icke-linjärt. Sambandet mellan en prediktor och log-oddsen är det som ska vara linjärt.
Varför detta spelar roll i praktiken
När lineariteten i logiten inte håller för någon prediktor sammanfattar koefficienten på den prediktorn en kurva med en rät linje. Modellen ger dig fortfarande ett tal, och talet kan fortfarande vara statistiskt signifikant, men talet beskriver inte det faktiska sambandet i dina data.
Till exempel kan age ha en U-formad effekt på log-oddsen för en sjukdom, med hög risk i båda ändar och lägre risk i mitten. Om du stoppar in age som en enda linjär term kan koefficienten bli nära noll och du drar slutsatsen att ålder inte spelar någon roll. Det gör den. Specifikationen är fel.
Kontroll av linearitet i logiten
Du har några alternativ för att kontrollera detta antagande.
Den snabbaste kontrollen är visuell inspektion. Dela upp varje kontinuerlig prediktor i deciler, beräkna de empiriska log-oddsen inom varje fack, och plotta resultatet mot prediktorn. En ungefär rak linje innebär att antagandet håller. En tydlig kurva innebär att det inte gör det. Kontrollens informella karaktär funkar bra när du har tillräckligt med data per fack.
Box–Tidwell-testet lägger till en interaktionsterm mellan varje kontinuerlig prediktor och dess egen naturliga logaritm. Om interaktionen är statistiskt signifikant bryts antagandet om linearitet i logiten för den prediktorn. Testet fungerar bara på strikt positiva prediktorer (eftersom du inte kan ta logaritmen av noll eller ett negativt tal), och det är känsligt för stickprovsstorlek som alla signifikanstester.
Splines är ett annat alternativ. Istället för att kontrollera om linearitet håller, ersätter du den linjära termen med en flexibel basfunktion som en begränsad kubisk spline och låter modellen anpassa den form den behöver. Om splinen passar mycket bättre än den linjära termen (bedömt med likelihood-kvot eller AIC) har du bevis på att den linjära specifikationen var för restriktiv. Splines fungerar också som en lösning. Att behålla dem i slutmodellen är ofta det bästa svaret när linearitet faller.
Vad du gör när linearitet faller
Om antagandet faller för en prediktor har du ett par alternativ:
- Transformera prediktorn (en log- eller kvadratrots-transform brukar räcka) tills sambandet ser linjärt ut i log-oddsen
- Använd splines och acceptera en något mer komplex modell
Båda håller dig inom familjen logistisk regression, och båda är bättre än att utesluta en prediktor som faktiskt är informativ.
Antagande 4: Ingen allvarlig multikollinearitet
Logistisk regression hanterar korrelerade prediktorer upp till en punkt. Efter den punkten börjar modellen bete sig konstigt på sätt som är svåra att upptäcka med något testmått.
Multikollinearitet uppstår när två eller fler prediktorer har samma (eller väldigt lik) information. Kanske har du längd i tum och längd i centimeter i samma modell. Kanske har du totalintäkt och intäkt per kund tillsammans med kundantal.
Två saker går fel när multikollinearitet finns:
- Koefficienter blir instabila: Om du lägger till eller tar bort en enda rad kan koefficienten på en kollinear prediktor svänga eller byta tecken. Modellen fungerar fortfarande, men de enskilda koefficienterna är inte meningsfulla.
- Standardfel blåses upp: Med mindre oberoende information per prediktor blir modellen mindre säker på varje koefficient. P-värden stiger, och verkliga effekter kan komma tillbaka som icke-signifikanta.
Förutsägelser är oftast okej. Om du bara bryr dig om den predikterade sannolikheten orsakar mild till måttlig multikollinearitet sällan problem. "Skadan" är koncentrerad till koefficienterna och den inferens du gör på dem.
De två kontrollerna är en korrelationsmatris och variance inflation factor (VIF). En korrelationsmatris är det första att titta på, särskilt par av prediktorer med korrelationer över 0,8 eller 0,9 i absolutvärde. Begränsningen är att korrelationsmatriser bara fångar parvis kollinearitet, inte fallet där tre eller fler prediktorer tillsammans är redundanta.
VIF finns för det senare fallet. För varje prediktor mäter VIF hur mycket variansen för dess koefficient blåses upp av kollinearitet med resten av prediktorerna. En VIF på 1 betyder ingen kollinearitet, värden upp till 5 är oftast okej, och värden över 10 är en stark signal om att prediktorn är redundant med andra i modellen.
När VIF flaggar något är den enklaste lösningen att ta bort en av de kollineära prediktorerna eller kombinera dem till en enda egenskap, som en summa eller kvot. Om du hellre vill behålla alla prediktorer stabiliserar regularisering (ridge eller elastic net) koefficienterna utan att du behöver välja.
Antagande 5: Adekvat stickprovsstorlek
Logistisk regression fungerar med små sampel, men är något opålitlig. Koefficienter svänger mer än de borde, och effekter i sällsynta klasser blir nästan omöjliga att skatta.
Den stickprovsstorlek som spelar roll för logistisk regression är inte det totala radantalet. Det är antalet händelser (observationer i minoritetsklassen). Ett dataset med 100 000 rader och 50 bedrägerifall är ett småsamplesproblem, eftersom modellen bara har 50 exempel på det den försöker lära sig.
Det är där events per variable (EPV) kommer in. EPV är antalet observationer i minoritetsklassen delat med antalet prediktorer i modellen. Om du har 50 bedrägerifall och 10 prediktorer är din EPV 5.
Den gamla tumregeln var en EPV på minst 10. Nyare simuleringsarbete har visat att rätt tal beror på effektstorlekarna i dina data och mängden regularisering du använder. EPV så låga som 5 kan vara okej i vissa sammanhang, och EPV på 20 eller mer kan behövas i andra.
Slutsatsen är att behandla EPV som varningsinformation. Under 10, förvänta dig instabila skattningar och överväg straffade metoder som Firths logistiska regression eller ridge. Under 5, skaffa mer data eller förenkla modellen innan du litar på någon enskild koefficient.
Klassobalans är ett relaterat men separat problem.
Ett dataset där 99% av fallen är en klass kan fortfarande ha gott om händelser per variabel i absoluta tal. Vad som skiftar är basfrekvensen för utfallet, inte EPV. Obalanserade data tenderar att ge konservativa sannolikhetsskattningar, och noggrannhet slutar vara ett användbart mått. För att komma runt det, utvärdera med log-loss eller Brier score istället för noggrannhet, och överväg klassvikter eller tröskeljustering om du behöver balanserade beslut.
Antagande 6: Inga starkt inflytelserika outliers
Logistisk regression antar inte att dina prediktorer är normalfördelade. Skeva prediktorer och räknevariabler är helt okej i sig. Det modellen bryr sig om är om någon enskild observation har oproportionerligt stor påverkan på de anpassade koefficienterna.
En inflytelserik observation är en som, om du tar bort den, påtagligt skulle ändra modellen. Det är inte samma sak som en residual outlier. En punkt kan ha en stor residual (modellen förutsäger den dåligt) utan att vara inflytelserik, och en punkt kan vara starkt inflytelserik (modellen lutar sig tungt mot den) utan att ha en stor residual.
Du vill ha några diagnostikmått som tittar på olika aspekter av inflytande:
- Leverage mäter hur ovanliga en observations prediktorvärden är relativt resten av data. Leverage i sig betyder inte att en observation är inflytelserik. Det betyder att punkten har potential att vara inflytelserik om dess utfall inte matchar vad dess prediktorer skulle antyda
- Cook’s avstånd kombinerar leverage med residualen till ett enda tal som uppskattar hur mycket de anpassade koefficienterna skulle ändras om du tog bort observationen. Stora värden på Cook’s avstånd lyfter fram punkter värda att undersöka. Vanliga konventioner är värden över 4/n (där n är stickprovsstorleken) eller att bara titta på de största par Cook’s-avstånden i ditt dataset
- Residualdiagnostik är bra för fall som leverage och Cook’s avstånd inte fångar. Deviance-residualer och Pearson-residualer flaggar observationer som modellen har svårt att anpassa. En punkt med stor residual är värd att titta på även om dess leverage är måttlig, eftersom modellen säger att den inte kan förklara det fallet med de andra prediktorerna
När du hittar en inflytelserik punkt är frågan om punkten är verklig eller felaktig. Ett inmatningsfel åtgärdas eller tas bort. Ett verkligt men ovanligt fall stannar kvar, och du noterar att dina slutsatser beror på det. Uteslut bara inte punkter för att de är inflytelserika. Det är så du slutar med en modell som passar din träningsdata och inget annat.
Vanliga missuppfattningar om antaganden i logistisk regression
Det mesta av förvirringen kring antaganden i logistisk regression kommer från att använda linjär regressions checklista. Linjär regressions antaganden är välkända och lärs ut överallt, och de dyker upp i logistisk regression där de inte hör hemma. Här är de fyra vanligaste att reda ut.
Logistisk regression kräver normalfördelade variabler
Detta är falskt. Logistisk regression gör inget normalitetsantagande om någon variabel i modellen.
Utfallet ska vara binärt, inte normalt, och det har vi täckt i antagande 1. Prediktorerna antas inte heller vara normala, och de kan ha vilken form som helst som datan har. Det som spelar roll är sambandet mellan prediktorerna och log-oddsen, inte marginalfördelningen för någon enskild variabel.
Logistisk regression kräver homoskedasticitet
Detta är också falskt. Homoskedasticitet (konstant varians hos residualer över intervallet av predikterade värden) är ett antagande i linjär regression som inte gäller för logistisk regression.
Variansen för utfallet i logistisk regression beror på den predikterade sannolikheten själv. För ett Bernoulliutfall är variansen p(1 - p), som är högst nära p = 0.5 och lägst nära 0 och 1. Variansen är inte konstant, och modellen tar hänsyn till det genom den likelihood-funktion den maximerar.
Så när du anpassar en logistisk regression bryter du inte mot något genom att ha predikterade sannolikheter med olika varianser. Det är bara så modellen fungerar.
Prediktorer måste vara normalfördelade
Detta är falskt. Logistisk regression ställer inga fördelningsantaganden på prediktorerna.
Du kan blanda kontinuerliga, binära, räkne- och kategorivariabler i samma modell. Skeva prediktorer är okej. Tungekade prediktorer är okej. Modellen bryr sig inte om marginalformer. Det enda den bryr sig om är lineariteten i logiten (täckt i antagande 3), vilket är ett antagande om relationens form, inte fördelningens form.
Om skevheten hos en prediktor skapar problem beror det vanligtvis på lineariteten i logiten eller inflytelserika outliers.
Residualerna måste vara normalfördelade
Detta är falskt. Det finns inget normalitetsantagande på residualerna i logistisk regression.
Linjär regression antar att residualer är normalfördelade runt noll, eftersom det är en del av hur dess inferens fungerar. Logistisk regression använder maximum likelihood-estimering på en binomial likelihood, och fördelningen av dess residualer bestäms av utfallet (som är 0 eller 1) och den anpassade sannolikheten. De är inte normala, och de är inte tänkta att vara det.
Så när du kontrollerar residualdiagnostik för logistisk regression (som i antagande 6), letar du efter inflytelserika observationer och punkter som modellen inte kan förklara, inte efter en klockkurva.
Hur du kontrollerar antaganden i logistisk regression i Python
Jag gör diagnostiken med statsmodels. Scikit-learn anpassar logistisk regression men ger dig inte VIF, influensstatistik eller residualdiagnostik direkt.
Förbereda exemplet
Jag genererar ett syntetiskt churn-dataset med tre prediktorer (ålder, inkomst och spenderingspoäng), där ålder och inkomst avsiktligt är korrelerade så att multikollinearitet har något att hitta.
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())

Modellsammanfattning
Sammanfattningen ger dig koefficienter, standardfel, z-statistik och p-värden. age och spending_score kommer ut som meningsfulla prediktorer. Koefficienten för income är liten eftersom utfallet inte direkt beror på inkomst. Dess skenbara effekt absorberas av ålder.
Multikollinearitet med VIF
Statsmodels gör denna beräkning otroligt enkel:
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"])

VIF-utdata
VIF-värdena för age och income hamnar runt 5,5, vilket visar mild multikollinearitet. spending_score hamnar nära 1, vilket är vad du vill ha. Dess varians blåses inte upp av kollinearitet med de andra. VIF över 5 är milda flaggor; över 10 är ett allvarligt problem du behöver lösa omedelbart. Åtgärden här är att antingen ta bort en av age eller income eller kombinera dem till en enda egenskap.
Linearitet i logiten med Box–Tidwell
Box–Tidwell-testet lägger till interaktionstermer mellan varje kontinuerlig prediktor och dess egen naturliga logaritm. Signifikanta interaktioner flaggar ett icke-linjärt log-oddssamband för den prediktorn.
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])

Box–Tidwell-utdata
Om något av dessa p-värden är under 0,05 är antagandet om linearitet i logiten tveksamt för den prediktorn. Här genererades logiten linjärt, så interaktionerna borde inte vara signifikanta. På verkliga data, behandla ett signifikant resultat som en uppmaning att plotta de empiriska log-oddsen mot den prediktorn och avgöra om en transformation eller en spline är rätt åtgärd.
Influensdiagnostik
Statsmodels ger dig tillgång till Cook’s avstånd och leverage via 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)

Utdata för influensdiagnostik
Tröskeln för Cook’s avstånd värt att undersöka är ungefär 4/n. Med 1000 rader är det 0,004. Allt klart över det behöver en närmare titt. I detta dataset är de största Cook’s-avstånden fortfarande små i absoluta tal, vilket är det tråkigt-bra utfallet du vanligtvis vill ha.
Låt mig nu skapa en visualisering för att göra fördelningen lättare att läsa:

Visualiserad influensdiagnostik
Punkter som ligger väl över den streckade tröskeln är de att undersöka. Det finns några, men inte för många.
Residualdiagnostik
Deviance-residualerna visar vilka observationer modellen har svårt att anpassa.
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)

Utdata för residualdiagnostik
Stora positiva deviance-residualer är fall där modellen gav låg sannolikhet men utfallet var positivt. Stora negativa residualer är det omvända. Du bör korsreferera observationer med höga residualer med influensdiagnostiken ovan. Ett fall som både är dåligt predikterat och inflytelserikt är det mest värda att undersöka.
Hur du kontrollerar antaganden i logistisk regression i R
R har tajtare inbyggt stöd för dessa diagnostik. Det mesta du behöver kommer från bas-R:s glm() plus paketet car.
Förbereda exemplet
Jag genererar samma typ av syntetiska dataset som i Python-exemplet, med ålder och inkomst avsiktligt korrelerade.
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)

Utdata från modellsammanfattning
Utdata från summary(model) ger dig koefficienter, standardfel, z-statistik och p-värden. age och spending_score bör se meningsfulla ut, medan effekten av income absorberas av age.
Multikollinearitet med VIF
Paketet car ger dig vif() för valfri glm:
library(car)
vif(model)

VIF-utdata i R
age och income kommer båda tillbaka med VIF runt 5,7, vilket visar multikollineariteten inbyggd i datan. spending_score ligger nära 1. Precis som i Python förtjänar värden över 5 uppmärksamhet och värden över 10 är ett tydligt problem.
Linearitet i logiten med Box–Tidwell
Funktionen car::boxTidwell är utformad för linjär regression, så för logistisk regression är det bästa tillvägagångssättet att lägga till interaktionstermer manuellt och anpassa om:
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, ]

BoX–Tidwell-utdata i R
Utdata visar koefficient och p-värde för varje interaktionsterm. Signifikanta p-värden flaggar ett brott mot antagandet om linearitet i logiten för den prediktorn. För de syntetiska data här bör testet inte förkasta linearitet. På verkliga data, följ upp med empiriska log-odds-plottar eller anpassa en modell med splines (från paketet splines) för varje prediktor som testet flaggar.
Influensdiagnostik
R erbjuder cooks.distance() och hatvalues() i basen, så inget tredjepartspaket behövs:
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)

Influensdiagnostik i R
Tröskeln för Cook’s avstånd är densamma som i Python: 4/n, eller 0,004 för datasetet med 1000 rader. Allt klart över det förtjänar undersökning. För en snabb visuell kontroll ger bas-R:s plot(model, which = 4) en Cook’s avståndsplot med en rad.

Visualiserad influensdiagnostik i R
Residualdiagnostik
R:s residuals() ger dig deviance-residualer från en 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)

Residualdiagnostik i R
Stora absoluta deviance-residualer är fall där modellens förutsägelse missade. Du bör korsreferera dessa med flaggorna för Cook’s avstånd ovan för att hitta observationer som både är dåligt anpassade och inflytelserika.
För en överblick av allt på en gång returnerar influence.measures(model) en tabell som kombinerar Cook’s avstånd, leverage, DFBETAs och ett par andra influensstatistik på ett ställe. Det är det snabbaste sättet att skanna all standarddiagnostik på en anpassad glm.
Vad händer när antagandena bryts?
De flesta antagandebrott kommer inte att rasera din modell så att den inte fungerar. De får den att bete sig subtilt fel på sätt som du bara märker om du vet vad du ska leta efter.
Fyra konsekvenser dyker upp för det mesta:
- Instabila koefficienter: Små förändringar i datan (några rader tillagda eller borttagna, en liten förändring i feature engineering) kan drastiskt ändra koefficienterna eller byta deras tecken. Detta är vad multikollinearitet gör, och det är också vad som händer när din stickprovsstorlek är för liten för antalet prediktorer
- Dålig kalibrering: Modellens predikterade sannolikheter slutar stämma med de faktiska frekvenserna i datan. Den förutspår 30% churn för en grupp och du observerar 15%. Noggrannhet kan fortfarande se bra ut, men sannolikheterna är fel. Brott mot linearitet i logiten och inflytelserika outliers bidrar båda till detta
- Vilseledande inferens: Denna är svårast att upptäcka, eftersom modellen fortfarande producerar standardfel och p-värden som ser bra ut. Korrelerade observationer minskar standardfel under vad de borde vara, och fel specifikation av prediktorer ökar dem. Oavsett vilket betyder p-värdena du får inte det du tror att de betyder
- Försämrad prediktionskvalitet: Det mest uppenbara symptomet, även om det ofta är det minsta i praktiken. Förutsägelser håller vanligtvis bättre än koefficienterna, vilket är varför team som bara fokuserar på noggrannhet ofta missar varningssignalerna.
Men ärligt talat gör överträdelser sällan en modell oanvändbar. De gör delar av den opålitliga, och vilka delar som är opålitliga beror på vilket antagande som bröts. Det är därför diagnostiken spelar roll.
Alternativ när antagandena i logistisk regression faller
Om din diagnostik pekar på problem som du inte kan lösa inom logistisk regression, är nästa steg att använda en modell som inte gör de antagandena.
Generalized additive models (GAMs) är nästa att titta på. En GAM behåller den logistiska länken och den tolkbara additiva strukturen, men ersätter de linjära termerna med släta funktioner av varje prediktor. Du får koefficienter-med-former istället för enstaka tal, vilket löser problemet med linearitet i logiten. GAMs är fortfarande tillräckligt parametriska för att inspektera och tolka, vilket gör dem till ett bra steg upp från logistisk regression när linearitetsantagandet inte kan hålla.
Trädbaserade modeller är det mer flexibla alternativet. Random forests och gradient boosting gör inga antaganden om prediktorfördelningar eller relationsformer. De hanterar multikollinearitet och kan till och med fånga icke-linearitet. De ger dig inte den enkla koefficienttolkningen som logistisk regression erbjuder, men de tenderar att prestera bättre på prediktiva mått när datan har icke-linjär struktur eller interaktioner som du inte lade in i modellen.
Valet mellan GAMs och trädbaserade modeller handlar om vad du behöver från modellen.
- Välj GAMs när tolkbarhet är prioritet och du vill se hur varje prediktor påverkar log-oddsen
- Välj ett gradientboostat träd när prediktionskvalitet är prioritet och du kan acceptera en mindre transparent modell
Det är värt att notera att antagandena i logistisk regression är lättare att kontrollera än att ignorera. Om du kan åtgärda problemet med en transformation, en spline, regularisering eller ett bättre urval, slår logistisk regressions tolkbarhet och inferentiella utdata vanligtvis det du får av ett byte till en mer flexibel modell.
Gå alltså vidare till GAMs eller träd när diagnostiken säger att antagandena verkligen inte håller, inte bara för att logistisk regression inte är en toppmodern algoritm.
Best practices för modellering med logistisk regression
Och till sist, följ denna korta lista för att alltid få en modell du kan lita på:
- Inspektera antaganden före tolkning: Kör VIF, Box–Tidwell-testet och influensdiagnostik innan du läser av koefficienterna. Om du tolkar först och kontrollerar senare kommer du att försvara siffror du inte har verifierat. Du vill inte vara den personen i ett möte
- Använd regularisering när stickprovet är litet: Ridge eller elastic net stabiliserar koefficienter när EPV är lågt eller prediktorer är korrelerade. Avvägningen är en liten bias för en stor variansreduktion, vilket oftast är ett bra byte
- Validera på data modellen inte har sett: Håll ut en testmängd eller använd korsvalidering. Träningsmått överdriver prestanda närhelst modellen har utrymme att överanpassa, vilket logistisk regression har när du har många prediktorer eller sällsynta händelser
- Utvärdera kalibrering: Noggrannhet döljer om dina predikterade sannolikheter mappar till faktiska frekvenser. Använd log-loss eller Brier score för utvärdering, och titta på en kalibreringsplot när sannolikheter spelar roll för affärsbeslut
Slutsats
Ärligt talat är logistisk regression en av de mer förlåtande modeller du kan anpassa.
Den tolererar skeva prediktorer och obalanserade utfall, och den bryr sig inte om hur dina residualer ser ut. Det den inte tolererar är en felaktigt specificerad relation till log-oddsen, eller en uppsättning prediktorer som alla har samma information.
Det är därför linearitet i logiten och multikollinearitet är de två antagandekontroller som är värda att behandla som obligatoriska. Det är de som förvränger modellen på sätt som inga testmått kan fånga. De andra fyra antagandena är också relevanta, men dessa två är vad du verkligen bör fokusera på.
För att vara säker, kör diagnostiken parallellt med utvärderingen, inte efteråt. En modell som förutsäger väl och klarar sina antagandekontroller är en modell du kan stå för. Allt mindre är en modell du har tränat men inte riktigt verifierat.
Om detta låter komplext, är det för att det är det. Det krävs mycket för att vara en bra maskininlärningsingenjör, så vi rekommenderar att du anmäler dig till vår Machine Learning Scientist in Python-spår. 85 timmars material gör dig redo för jobb 2026.
FAQs
Har logistisk regression antaganden?
Ja. Logistisk regression har färre antaganden än linjär regression, men den är inte fri från antaganden. De viktigaste gäller utfallsvariabelns form, oberoende mellan observationer, linearitet i log-oddsen och frånvaro av hög multikollinearitet eller starkt inflytelserika punkter.
Vilka är de viktigaste antagandena i logistisk regression?
De två som spelar störst roll är linearitet i logiten och frånvaro av hög multikollinearitet. Linearitet i logiten missförstås oftast, eftersom logistisk regression inte antar ett linjärt samband mellan prediktorer och utfall, men väl mellan prediktorer och log-odds. Multikollinearitet spelar roll eftersom den förvränger koefficienterna och blåser upp standardfel utan att påverka noggrannheten, så den kan gömma sig för alla kontroller som bara tittar på prediktiv prestanda.
Vad händer om antagandena i logistisk regression bryts?
Det beror på vilket antagande som bryts. Överträdelser av linearitet i logiten eller stark multikollinearitet skadar tyst koefficienterna samtidigt som noggrannheten lämnas intakt, vilket är varför de är lätta att missa. Brott mot oberoende blåser upp eller krymper standardfel, vilket gör p-värden opålitliga. De flesta överträdelser gör inte en modell oanvändbar, men de gör delar av den otillförlitliga på sätt som enbart noggrannhet inte visar.
Kräver logistisk regression normalfördelade prediktorer?
Nej. Logistisk regression ställer inga fördelningsantaganden på prediktorerna. Du kan blanda kontinuerliga, kategoriska, skeva och tungekade prediktorer i samma modell utan problem. Det som spelar roll är sambandet mellan varje prediktor och log-oddsen, inte prediktorns marginalform i sig.
Vad är en bra VIF-tröskel för logistisk regression?
VIF-värden upp till 5 är vanligtvis okej, värden mellan 5 och 10 antyder måttlig multikollinearitet värd att undersöka, och värden över 10 signalerar att en eller flera prediktorer är redundanta. Trösklarna är inte hårda regler utan konventioner, eftersom VIF-tolkning beror på stickprovsstorlek och den precision du behöver. Om en prediktors VIF är hög och dess standardfel ser instabilt ut över datasubset har du bevis för att kollineariteten orsakar problem.