Przejdź do głównej treści

Założenia regresji logistycznej: co sprawdzić przed modelowaniem

Praktyczny przegląd założeń stojących za regresją logistyczną, diagnostyk, które wykrywają naruszenia w Pythonie i R, oraz alternatyw, gdy założeń nie da się spełnić.
Zaktualizowano 15 cze 2026  · 15 min Czytać

Po wytrenowaniu modelu regresji logistycznej – skąd wiesz, że możesz ufać współczynnikom?

Regresja logistyczna słynie z prostoty. Ze scikit-learn wywołujesz .fit(), odczytujesz ilorazy szans i na tym koniec. Większość początkujących nie wie jednak, że model ma własne założenia, a gdy ich nie przestrzegasz, współczynniki wprowadzają w błąd, a predykcje są chybione w sposób, którego żaden metryk testowy ci nie pokaże.

Prawdę mówiąc, regresja logistyczna ma mniej założeń niż regresja liniowa, a te, które ma, łatwo sprawdzić. Wystarczy uruchomić odpowiednie diagnostyki, zanim zinterpretujesz wyniki, by wiedzieć, którym częściom modelu ufać.

W tym artykule przeprowadzę cię przez każde założenie regresji logistycznej, pokażę, jak je sprawdzić w Pythonie i R, co się dzieje, gdy są naruszane, oraz po jakie alternatywy sięgnąć, gdy nie da się ich spełnić.

Jeśli dopiero zaczynasz przygodę z data science i uczeniem maszynowym, przeczytaj nasz wpis o prostej regresji liniowej, by zrozumieć jej założenia i diagnostyki.

Czym jest regresja logistyczna?

Regresja logistyczna to model klasyfikacyjny, który przewiduje prawdopodobieństwo wyniku kategorycznego. Podajesz predyktory, a on zwraca liczbę między 0 a 1, którą można odczytać jako prawdopodobieństwo przynależności do danej klasy.

Najczęściej używa się jej do klasyfikacji binarnej, jak churn/bez churnu, spam/nie spam. Warianty, takie jak regresja logistyczna wielomianowa i porządkowa, obsługują więcej niż dwie klasy, ale przypadek binarny jest zwykle tym, co ludzie mają na myśli, mówiąc „regresja logistyczna”.

Pod spodem model dopasowuje liniową kombinację predyktorów i przepuszcza wynik przez funkcję logistyczną. Wyjściem jest prawdopodobieństwo, a współczynniki mówią, jak każdy predyktor przesuwa logarytm szans.

Warto podkreślić, że regresja logistyczna różni się od liniowej. Ta druga ma znajome założenia, takie jak normalność reszt, homoscedastyczność, liniowość między predyktorami a celem. Regresja logistyczna ich nie przyjmuje. Ma własną listę, na tyle inną, że stosowanie założeń regresji liniowej da ci mylące wyniki.

Po więcej szczegółów o regresji logistycznej zajrzyj do naszego wpisu pokazującego implementację w Pythonie.

Dlaczego założenia regresji logistycznej mają znaczenie

Założenia są ważne, bo bezpośrednio łączą się z tym, co robisz z modelem.

Jeśli je respektujesz, współczynniki znaczą to, co myślisz. Ilorazy szans są poprawne, a prawdopodobieństwa dobrze odwzorowują rzeczywiste wyniki. Gdy założeń nie przestrzegasz, wszystko to staje się chwiejne w sposób, którego macierz pomyłek ani żadna inna metryka ci nie pokaże.

Dobrą wiadomością jest to, że naruszenia nie są binarne. Niewielkie odstępstwo od, powiedzmy, liniowości logitu nie czyni modelu bezużytecznym. Oznacza tylko, że twoje ilorazy szans są lekko nietrafione, a predykcje mogą być gorsze, niż powinny. Wiele modeli produkcyjnych żyje z niedoskonałymi kontrolami założeń – i to jest w porządku.

Czego nie chcesz, to pomijania kontroli. Bez diagnostyki nie odróżnisz małego problemu od dużego, dopóki predykcje nie zaczną się sypać.

Przegląd założeń regresji logistycznej

Zanim przejdziemy do każdego z osobna, oto pełna lista do sprawdzenia.

Założenie Czego wymaga Typowa diagnostyka
Niezależne obserwacje Żaden rekord nie wpływa na inny rekord Projekt badania, wewnątrzklasowa korelacja
Odpowiednia zmienna wyjściowa Binarna lub modelowana właściwym wariantem Inspekcja celu
Liniowość logitu Predyktory liniowe w skali log-szans Test Boxa–Tidwella, splajny
Brak silnej wielokolinearności Predyktory niezbyt silnie skorelowane VIF, macierz korelacji
Wystarczająca liczebność próby Dość zdarzeń na zmienną Zasada EPV
Brak wpływowych obserwacji odstających Żaden rekord nadmiernie nie zniekształca dopasowania Odległość Cooka, dźwignia (leverage)

Tabela założeń regresji logistycznej

To cała lista kontrolna. W dalszej części artykułu przeprowadzę cię przez każde założenie z diagnostykami w Pythonie i R, pokażę, jak wygląda naruszenie i co zrobić, gdy coś idzie nie tak.

Główne założenia regresji logistycznej

Założenie 1: Zmienna wyjściowa jest binarna (lub odpowiednio modelowana)

Standardowa regresja logistyczna jest zbudowana na wynik binarny. Zmienna celu powinna mieć dokładnie dwie kategorie i wokół tego przypadku zaprojektowano model.

Klasyczne przykłady to churn/bez churnu, choroba/brak choroby. Wszystko, co da się ująć jako pytanie tak/nie, dobrze pasuje.

Gdy wynik ma więcej niż dwie kategorie, potrzebujesz innego wariantu. Regresja logistyczna wielomianowa obsługuje kategorie nieuporządkowane, jak segmenty klientów czy typy produktów. Regresja porządkowa obsługuje kategorie uporządkowane, jak oceny satysfakcji od 1 do 5, gdzie kolejność poziomów ma znaczenie.

Wymuszanie wieloklasowego wyniku w modelu binarnym zwykle oznacza łączenie kategorii, których nie powinno się łączyć. Jeśli masz cel satysfakcji z pięcioma poziomami i sprowadzasz go do „zadowolony vs niezadowolony”, tracisz informację, która mogła pomóc modelowi. Wybierz wariant, który pasuje do kształtu twojego celu.

Założenie 2: Obserwacje są niezależne

Każdy wiersz w zbiorze danych powinien dostarczać modelowi informacji, których nie daje żaden inny wiersz. Jeśli dwa rekordy są powiązane w sposób naruszający to założenie, twoje błędy standardowe i wartości p nie będą znaczyć tego, co powinny.

Założenie zawodzi, gdy obserwacje dzielą strukturę, której nie zamodelowałeś. Dobrym przykładem są powtarzane pomiary u tego samego pacjenta – dzielą jego biologię. Innym przykładem są uczniowie w tej samej klasie – dzielą nauczyciela i salę.

Gdy to ignorujesz i dopasowujesz zwykłą regresję logistyczną, model traktuje każdy wiersz jak nową informację i zaniża błędy standardowe bardziej, niż powinien. Współczynniki mogą na pierwszy rzut oka wyglądać dobrze, ale wartości p i przedziały ufności będą zbyt pewne siebie.

Standardowe alternatywy to regresja logistyczna z efektami mieszanymi i GEE. Modele mieszane dodają efekty losowe dla grup (pacjent, klasa), aby uwzględnić korelację wewnątrzgrupową. GEE (uogólnione równania estymujące) daje efekty uśrednione populacyjnie ze skorygowanymi błędami standardowymi, bez aparatu efektów losowych.

Wybierz modele mieszane, gdy zależy ci na zróżnicowaniu wewnątrz grup. Wybierz GEE, gdy chcesz efektów brzegowych dla całej populacji.

Założenie 3: Liniowość logitu

To założenie najczęściej jest źle rozumiane w kontekście regresji logistycznej.

Model nie zakłada, że predyktory mają liniową relację z wynikiem. Zakłada, że mają liniową relację z log-szansą wyniku. To inna teza, która zmienia to, co powinieneś sprawdzać.

Czym jest logit

Logit to naturalny logarytm ilorazu szans. Dla prawdopodobieństwa p szansa to p / (1 - p), a logit to logarytm tego ilorazu:

The logit

Logit

Regresja logistyczna dopasowuje następnie równanie liniowe w tej skali:

Logistic regression formula

Wzór regresji logistycznej

Prawa strona jest liniowa w predyktorach. Lewa strona to log-szansa, nie prawdopodobieństwo. Prawdopodobieństwo, na którym ci zależy, odzyskuje się, przepuszczając liniową kombinację przez funkcję logistyczną, która jest nieliniowa.

Zatem relacja między dowolnym predyktorem a prawdopodobieństwem jest nieliniowa. Liniowa ma być relacja między predyktorem a log-szansą.

Dlaczego to ma znaczenie w praktyce

Gdy liniowość logitu nie zachodzi dla jakiegoś predyktora, współczynnik tego predyktora streszcza krzywą prostą linią. Model nadal daje liczbę i może być ona statystycznie istotna, ale nie opisuje rzeczywistej relacji w danych.

Na przykład age może mieć efekt w kształcie litery U na log-szansę choroby – wysokie ryzyko na obu krańcach i niższe pośrodku. Jeśli wstawisz age jako pojedynczy składnik liniowy, współczynnik może wyjść bliski zeru i wyciągniesz wniosek, że wiek nie ma znaczenia. Ma. Specyfikacja jest błędna.

Sprawdzanie liniowości logitu

Masz kilka opcji weryfikacji tego założenia.

Najszybsza jest inspekcja wizualna. Podziel każdy ciągły predyktor na decyle, policz empiryczną log-szansę w każdym koszyku i nanieś ją na wykres względem predyktora. W przybliżeniu prosta linia oznacza, że założenie się trzyma. Wyraźna krzywizna – że nie. Kontrola jest nieformalna, ale działa dobrze, gdy masz dość danych na koszyk.

Test Boxa–Tidwella dodaje składnik interakcji między każdym ciągłym predyktorem a jego naturalnym logarytmem. Jeśli interakcja jest istotna statystycznie, założenie liniowości logitu jest naruszone dla tego predyktora. Test działa tylko dla predyktorów ściśle dodatnich (bo nie obliczysz logarytmu zera ani liczby ujemnej) i jest wrażliwy na liczebność próby, jak każdy test istotności.

Splajny to inna opcja. Zamiast sprawdzać, czy liniowość zachodzi, zastępujesz składnik liniowy elastyczną funkcją bazową, jak ograniczony splajn kubiczny, i pozwalasz modelowi dopasować potrzebny kształt. Jeśli splajn dopasowuje się dużo lepiej niż termin liniowy (sądząc po ilorazie wiarygodności lub AIC), masz dowód, że specyfikacja liniowa była zbyt restrykcyjna. Splajny są też naprawą – często najlepiej zostawić je w finalnym modelu, gdy liniowość zawodzi.

Co zrobić, gdy liniowość zawodzi

Jeśli założenie zawodzi dla predyktora, masz kilka opcji:

  • Przekształć predyktor (często pomaga logarytm lub pierwiastek kwadratowy), aż relacja będzie wyglądać liniowo w skali log-szans
  • Użyj splajnów i zaakceptuj nieco bardziej złożony model

Obie opcje pozostają w rodzinie regresji logistycznej i są lepsze niż wykluczanie predyktora, który w rzeczywistości jest informacyjny.

Założenie 4: Brak silnej wielokolinearności

Regresja logistyczna radzi sobie ze skorelowanymi predyktorami do pewnego punktu. Po jego przekroczeniu model zaczyna zachowywać się źle w sposób trudny do wychwycenia metrykami.

Wielokolinearność występuje, gdy dwa lub więcej predyktorów niesie tę samą (lub bardzo podobną) informację. Może masz wzrost w calach i wzrost w centymetrach w tym samym modelu. Może masz łączne przychody i przychody na klienta wraz z liczbą klientów.

Gdy występuje wielokolinearność, dzieją się dwie rzeczy:

  • Współczynniki stają się niestabilne: Dodanie lub usunięcie pojedynczego wiersza może znacząco zmienić współczynnik skorelowanego predyktora lub odwrócić jego znak. Model dalej działa, ale poszczególne współczynniki nie są sensowne.
  • Błędy standardowe puchną: Przy mniejszej niezależnej informacji na predyktor model jest mniej pewny każdego współczynnika. Wartości p rosną i realne efekty mogą wyjść nieistotne.

Predykcje zwykle są w porządku. Jeśli zależy ci tylko na przewidywanym prawdopodobieństwie, łagodna do umiarkowanej wielokolinearność rzadko szkodzi. „Szkoda” skupia się na współczynnikach i wnioskowaniu na ich podstawie.

Dwie kontrole to macierz korelacji i współczynnik inflacji wariancji (VIF). Macierz korelacji to pierwsza rzecz do sprawdzenia, zwłaszcza pary predyktorów z korelacją powyżej 0,8–0,9 bezwzględnie. Ograniczenie jest takie, że macierze korelacji łapią tylko kolinearność par, nie wielostronną, gdzie trzy lub więcej predyktorów łącznie jest redundantnych.

VIF służy do przypadku wielostronnego. Dla każdego predyktora VIF mierzy, jak bardzo wariancja jego współczynnika jest zawyżana przez kolinearność z resztą predyktorów. VIF równy 1 oznacza brak kolinearności, wartości do 5 zwykle są ok, a wartości powyżej 10 silnie sygnalizują, że predyktor jest redundantny względem innych w modelu.

Gdy VIF coś flaguje, najprościej jest usunąć jeden ze skorelowanych predyktorów lub połączyć je w jedną cechę (np. suma albo iloraz). Jeśli wolisz zachować wszystkie, regularyzacja (ridge albo elastic net) stabilizuje współczynniki bez konieczności wyboru.

Założenie 5: Odpowiednia liczebność próby

Regresja logistyczna działa przy małych próbach, ale bywa wtedy zawodna. Współczynniki wahają się bardziej, niż powinny, a efekty rzadkiej klasy stają się niemal niemożliwe do oszacowania.

Liczebność, która ma znaczenie w regresji logistycznej, to nie łączna liczba wierszy. To liczba zdarzeń (obserwacji w klasie mniejszościowej). Zbiór 100 000 wierszy i 50 przypadków fraudu to problem małej próby, bo model ma tylko 50 przykładów tego, czego ma się nauczyć.

Tu wchodzi miara „events per variable” (EPV) – liczba obserwacji klasy mniejszościowej podzielona przez liczbę predyktorów w modelu. Jeśli masz 50 fraudów i 10 predyktorów, twoje EPV to 5.

Dawna zasada kciuka mówiła o EPV co najmniej 10. Nowsze symulacje pokazały, że właściwa liczba zależy od wielkości efektów w danych i stopnia regularyzacji. EPV rzędu 5 bywa ok w niektórych ustawieniach, a EPV 20 i więcej może być potrzebne w innych.

Wniosek: traktuj EPV jako sygnał ostrzegawczy. Poniżej 10 spodziewaj się niestabilnych oszacowań i rozważ metody karane, jak regresja Firtha lub ridge. Poniżej 5 – zbierz więcej danych lub uprość model, zanim zaufasz jakimkolwiek pojedynczym współczynnikom.

Nierównowaga klas to pokrewny, ale odrębny problem.

Zbiór, w którym 99% przypadków to jedna klasa, nadal może mieć dużo zdarzeń na zmienną w wartościach bezwzględnych. Zmienia się bazowa częstość wyniku, nie EPV. Dane niezrównoważone mają tendencję do konserwatywnych estymat prawdopodobieństw, a accuracy przestaje być użyteczne. Aby to obejść, oceniaj log-loss lub Brier score zamiast accuracy oraz rozważ wagi klas lub strojenie progu, jeśli potrzebujesz zrównoważonych decyzji.

Założenie 6: Brak silnie wpływowych obserwacji odstających

Regresja logistyczna nie zakłada normalności rozkładów predyktorów. Skośne predyktory i zmienne zliczające są na ogół w porządku. Modelowi zależy natomiast na tym, by żadna pojedyncza obserwacja nie miała nadmiernego wpływu na dopasowane współczynniki.

Obserwacja wpływowa to taka, której usunięcie znacząco zmieniłoby model. To nie to samo co odstająca reszta. Punkt może mieć dużą resztę (model słabo go przewiduje), ale nie być wpływowy; i odwrotnie – może być bardzo wpływowy (model się na nim „opiera”), choć nie ma dużej reszty.

Przydadzą ci się diagnostyki patrzące na różne aspekty wpływu:

  • Leverage mierzy, jak nietypowe są wartości predyktorów danej obserwacji względem reszty danych. Sama dźwignia nie oznacza wpływowości – oznacza potencjał, jeśli wynik nie zgadza się z tym, co sugerują predyktory
  • Odległość Cooka łączy leverage z resztą w jedną liczbę, która szacuje, jak mocno zmieniłyby się dopasowane współczynniki po usunięciu obserwacji. Duże wartości wskazują punkty warte zbadania. Częste reguły to wartości powyżej 4/n (gdzie n to liczba obserwacji) lub po prostu przyjrzenie się kilku największym wartościom
  • Diagnostyka reszt jest świetna w przypadkach, których leverage i odległość Cooka nie wyłapują. Reszty dewiancji i reszty Pearsona flagują obserwacje, z którymi model ma kłopot. Punkt z dużą resztą warto sprawdzić nawet przy umiarkowanym leverage, bo model mówi, że nie potrafi go wyjaśnić innymi predyktorami

Gdy znajdziesz wpływowy punkt, pytanie brzmi: czy jest prawdziwy, czy błędny. Błąd w danych – popraw lub usuń. Prawdziwy, ale nietypowy przypadek – zostaw i zanotuj, że twoje wnioski od niego zależą. Nie wykluczaj punktów tylko dlatego, że są wpływowe – tak powstaje model, który pasuje do twoich danych treningowych i do niczego więcej.

Powszechne nieporozumienia wokół założeń regresji logistycznej

Większość zamieszania wokół założeń regresji logistycznej wynika ze stosowania listy kontrolnej regresji liniowej. Jej założenia są powszechnie znane i nauczane wszędzie – i pojawiają się tam, gdzie nie powinny. Oto cztery najczęstsze, które warto wyjaśnić.

Regresja logistyczna wymaga normalnie rozłożonych zmiennych

To fałsz. Regresja logistyczna nie przyjmuje żadnego założenia normalności dla zmiennych w modelu.

Wynik ma być binarny, a nie normalny – to omówiliśmy w Założeniu 1. Predyktory też nie są zakładane jako normalne i mogą mieć dowolny kształt. Liczy się związek między predyktorami a log-szansą, nie rozkład marginalny pojedynczej zmiennej.

Regresja logistyczna wymaga homoscedastyczności

To także fałsz. Homoscedastyczność (stała wariancja reszt względem zakresu wartości przewidywanych) to założenie regresji liniowej, które nie dotyczy regresji logistycznej.

Wariancja wyniku w regresji logistycznej zależy od samego przewidywanego prawdopodobieństwa. Dla Bernoulliego wariancja to p(1 - p) – najwyższa blisko p = 0.5, najniższa blisko 0 i 1. Wariancja nie jest stała i model uwzględnia to w funkcji wiarygodności, którą maksymalizuje.

Więc dopasowując regresję logistyczną, nie łamiesz niczego, mając przewidywane prawdopodobieństwa o różnej wariancji. Tak po prostu działa model.

Predyktory muszą mieć rozkład normalny

To fałsz. Regresja logistyczna nie nakłada żadnych założeń rozkładowych na predyktory.

Możesz mieszać w jednym modelu predyktory ciągłe, binarne, zliczające i kategoryczne. Skośne są ok. O „ciężkich ogonach” też. Model nie dba o kształty marginalne. Dba jedynie o liniowość logitu (Założenie 3) – to założenie o kształcie relacji, nie rozkładu.

Jeśli skos predyktora tworzy problemy, zwykle chodzi o liniowość logitu lub wpływowe obserwacje.

Reszty muszą mieć rozkład normalny

To fałsz. W regresji logistycznej nie ma założenia normalności reszt.

Regresja liniowa zakłada normalność reszt wokół zera, bo na tym opiera się jej wnioskowanie. Regresja logistyczna stosuje estymację największej wiarygodności na rozkładzie dwumianowym, a rozkład jej reszt zależy od wyniku (0 lub 1) i dopasowanego prawdopodobieństwa. Nie są normalne i nie powinny być.

Dlatego sprawdzając diagnostykę reszt (jak w Założeniu 6), szukasz obserwacji wpływowych i przypadków, których model nie potrafi wyjaśnić, a nie „dzwonu Gaussa”.

Jak sprawdzać założenia regresji logistycznej w Pythonie

Skorzystam ze statsmodels do diagnostyk. Scikit-learn dopasowuje regresję logistyczną, ale nie daje VIF, statystyk wpływu ani diagnostyk reszt „z pudełka”.

Przygotowanie przykładu

Wygeneruję syntetyczny zbiór churn z trzema predyktorami (wiek, dochód i wskaźnik wydatków), gdzie wiek i dochód są celowo skorelowane, by wielokolinearność miała co wykrywać.

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())

Model summary

Podsumowanie modelu

Podsumowanie podaje współczynniki, błędy standardowe, statystyki z i wartości p. age i spending_score wychodzą jako istotne predyktory. Współczynnik income jest malutki, bo wynik nie zależy bezpośrednio od dochodu – jego pozorny wpływ „wchłania” wiek.

Wielokolinearność przez VIF

Statsmodels bardzo to ułatwia:

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 output

Wynik VIF

VIF dla age i income wychodzą około 5,5, co wskazuje łagodną wielokolinearność. spending_score jest blisko 1 – i to chcesz zobaczyć. Jego wariancja nie jest zawyżana przez kolinearność z innymi. VIF powyżej 5 to delikatny sygnał; powyżej 10 – poważny problem do natychmiastowego rozwiązania. Ruch tutaj to albo usunąć age lub income, albo połączyć je w jedną cechę.

Liniowość logitu testem Boxa–Tidwella

Test Boxa–Tidwella dodaje składniki interakcji między każdym ciągłym predyktorem a jego naturalnym logarytmem. Istotne interakcje flagują nieliniową relację w skali log-szans dla danego predyktora.

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 output

Wynik testu Boxa–Tidwella

Jeśli któraś z tych wartości p jest poniżej 0,05, założenie liniowości logitu jest wątpliwe dla tego predyktora. Tutaj logit został wygenerowany liniowo, więc interakcje nie powinny być istotne. W danych rzeczywistych potraktuj istotny wynik jako sygnał, by wykreślić empiryczny logit względem tego predyktora i zdecydować, czy właściwa jest transformacja, czy splajn.

Diagnostyka wpływu

Statsmodels udostępnia odległość Cooka i leverage poprzez 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)

Influence diagnostics output

Wynik diagnostyki wpływu

Próg odległości Cooka warty zbadania to mniej więcej 4/n. Przy 1000 wierszy to 0.004. Wszystko znacznie powyżej tego wymaga bliższego oglądu. W tym zbiorze największe odległości Cooka są małe w wartościach bezwzględnych – i to to „nudno-dobre” wyjście, którego zwykle chcesz.

Teraz stworzę wizualizację, by rozkład był czytelniejszy:

Influence diagnostics visualized

Wizualizacja diagnostyki wpływu

Punkty znacznie powyżej przerywanego progu to te do zbadania. Są – ale nie za wiele.

Diagnostyka reszt

Reszty dewiancji wskazują obserwacje, z którymi model ma kłopot.

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)

Residual diagnostics output

Wynik diagnostyki reszt

Duże dodatnie reszty dewiancji to przypadki, gdzie model przypisał niskie prawdopodobieństwo, ale faktycznie były pozytywne. Duże ujemne – odwrotnie. Powinieneś skrzyżować obserwacje z dużymi resztami z diagnostyką wpływu powyżej. Przypadek jednocześnie źle przewidziany i wpływowy jest najbardziej wart uwagi.

Jak sprawdzać założenia regresji logistycznej w R

R ma ściślejsze wsparcie wbudowane dla tych diagnostyk. Większość potrzebnych rzeczy pochodzi z bazowego glm() plus pakietu car.

Przygotowanie przykładu

Wygeneruję ten sam typ syntetycznego zbioru, co w Pythonie, z celowo skorelowanymi wiekiem i dochodem.

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)

Model summary output

Wynik podsumowania modelu

Wyjście summary(model) podaje współczynniki, błędy standardowe, statystyki z i wartości p. age i spending_score powinny wyglądać na istotne, podczas gdy wpływ income jest „wchłaniany” przez age.

Wielokolinearność przez VIF

Pakiet car daje vif() dla dowolnego glm:

library(car)

vif(model)

VIF output in R

Wynik VIF w R

age i income wrócą z VIF około 5,7, co pokazuje wbudowaną w dane wielokolinearność. spending_score jest blisko 1. Jak w Pythonie – wartości powyżej 5 wymagają uwagi, a powyżej 10 to jasny problem.

Liniowość logitu testem Boxa–Tidwella

Funkcja car::boxTidwell jest zaprojektowana do regresji liniowej, więc dla regresji logistycznej najlepiej ręcznie dodać składniki interakcji i dopasować model ponownie:

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 output in R

Wynik testu Boxa–Tidwella w R

Wyjście pokazuje współczynnik i wartość p dla każdego składnika interakcji. Istotne wartości p flagują naruszenie liniowości logitu dla tego predyktora. Dla syntetycznych danych tutaj test nie powinien odrzucać liniowości. W danych rzeczywistych podążaj za tym wykresami empirycznej log-szansy lub dopasuj model ze splajnami (pakiet splines) dla każdego predyktora, który test flaguje.

Diagnostyka wpływu

R zapewnia cooks.distance() i hatvalues() w bazie, więc nie potrzeba pakietów zewnętrznych:

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)

Influence diagnostics in R

Diagnostyka wpływu w R

Próg odległości Cooka jest taki sam jak w Pythonie: 4/n, czyli 0.004 dla zbioru 1000-wierszowego. Wszystko wyraźnie powyżej tego warto zbadać. Dla szybkiej wizualnej kontroli, bazowe plot(model, which = 4) tworzy wykres odległości Cooka jednym poleceniem.

Wizualizacja diagnostyki wpływu w R

Diagnostyka reszt

Funkcja residuals() w R zwraca reszty dewiancji z 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)

Residual diagnostics in R

Diagnostyka reszt w R

Duże bezwzględnie reszty dewiancji to przypadki, w których predykcja modelu chybiła. Skrzyżuj je z flagami odległości Cooka powyżej, by znaleźć obserwacje jednocześnie słabo dopasowane i wpływowe.

Dla jednego podglądu wszystkiego, influence.measures(model) zwraca tabelę łączącą odległość Cooka, leverage, DFBETA i kilka innych statystyk wpływu w jednym miejscu. To najszybszy sposób, by przeskanować standardowe diagnostyki dopasowanego glm.

Co się dzieje, gdy założenia są naruszane?

Większość naruszeń nie „psuje” modelu w sensie braku działania. Sprawiają, że zachowuje się subtelnie źle – i zauważysz to tylko, jeśli wiesz, czego szukać.

Cztery konsekwencje pojawiają się najczęściej:

  1. Niestabilne współczynniki: Małe zmiany w danych (kilka wierszy dodanych/usuniętych, drobna zmiana inżynierii cech) mogą drastycznie zmienić współczynniki lub odwrócić ich znaki. Tak działa wielokolinearność i tak się dzieje przy zbyt małej próbie względem liczby predyktorów
  2. Słaba kalibracja: Przewidywane prawdopodobieństwa przestają odpowiadać rzeczywistym częstościom. Model przewiduje 30% churnu dla grupy, a obserwujesz 15%. Accuracy może dalej wyglądać dobrze, ale prawdopodobieństwa są chybione. Naruszenia liniowości logitu i wpływowe obserwacje obu przyczyniają się do tego
  3. Mylnie prowadzone wnioskowanie: To najtrudniej wychwycić, bo model nadal produkuje błędy standardowe i wartości p, które wyglądają ok. Skorelowane obserwacje zaniżają błędy standardowe poniżej należnego poziomu, a błędne specyfikacje predyktorów je zawyżają. Tak czy inaczej, wartości p nie znaczą tego, co myślisz
  4. Spadek jakości predykcji: Najbardziej oczywisty objaw, choć w praktyce często najmniejszy. Predykcje zwykle trzymają się lepiej niż współczynniki, dlatego zespoły skupione tylko na accuracy często przegapiają sygnały ostrzegawcze.

Szczerze mówiąc, naruszenia rzadko czynią model bezużytecznym. Czynią jego części niewiarygodnymi – a to, które części, zależy od tego, które założenie pękło. Dlatego diagnostyki są ważne.

Alternatywy, gdy założenia regresji logistycznej zawodzą

Jeśli diagnostyki wskazują problemy, których nie da się naprawić w ramach regresji logistycznej, kolejnym krokiem jest model, który tych założeń nie przyjmuje.

Uogólnione modele addytywne (GAM) to pierwszy kandydat. GAM zachowuje funkcję łączącą logistyczną i interpretowalną strukturę addytywną, ale zastępuje składniki liniowe gładkimi funkcjami każdego predyktora. Dostajesz współczynniki-z-kształtami zamiast pojedynczych liczb, co rozwiązuje problem liniowości logitu. GAM nadal jest na tyle parametryczny, by dało się go oglądać i interpretować, więc to dobry krok od regresji logistycznej, gdy liniowość nie może się utrzymać.

Modele drzewiaste są bardziej elastyczną alternatywą. Las losowy i boosting nie zakładają rozkładów predyktorów ani kształtu relacji. Radzą sobie z wielokolinearnością i potrafią uchwycić nieliniowości. Nie dają jednak łatwej interpretacji współczynników, jak regresja logistyczna, ale zwykle wygrywają na metrykach predykcyjnych, gdy dane mają nieliniową strukturę lub interakcje, których nie wstawiłeś do modelu.

Wybór między GAM a modelami drzewiastymi sprowadza się do tego, czego potrzebujesz od modelu.

  • Wybierz GAM, gdy priorytetem jest interpretowalność i chcesz widzieć, jak każdy predyktor wpływa na log-szanse
  • Wybierz boosting drzew, gdy priorytetem jest jakość predykcji i akceptujesz mniejszą przejrzystość

Warto zauważyć, że założenia regresji logistycznej łatwiej sprawdzić niż ignorować. Jeśli problem da się naprawić transformacją, splajnem, regularyzacją lub lepszą próbą, interpretowalność i wnioskowanie regresji logistycznej zwykle biją to, co dostaniesz po przesiadce na bardziej elastyczny model.

Przechodź do GAM lub drzew, gdy diagnostyki mówią, że założenia naprawdę nie trzymają, a nie tylko dlatego, że regresja logistyczna nie jest „najbardziej zaawansowanym” algorytmem.

Dobre praktyki modelowania regresji logistycznej

I na koniec – trzymaj się tej krótkiej listy, by zawsze mieć model, któremu możesz zaufać:

  • Sprawdź założenia przed interpretacją: Uruchom VIF, test Boxa–Tidwella i diagnostykę wpływu, zanim odczytasz współczynniki. Jeśli interpretujesz najpierw, a sprawdzasz później, będziesz bronić liczb, których nie zweryfikowałeś. Nie chcesz być tą osobą na spotkaniu
  • Używaj regularyzacji przy małej próbie: Ridge lub elastic net stabilizuje współczynniki, gdy EPV jest niskie lub predyktory są skorelowane. Koszt to małe obciążenie za dużą redukcję wariancji – zwykle opłacalna wymiana
  • Waliduj na danych niewidzianych przez model: Odłóż zbiór testowy lub użyj walidacji krzyżowej. Metryki treningowe zawyżają wydajność, gdy model ma przestrzeń do nadmiernego dopasowania – a regresja logistyczna ma ją zawsze, gdy jest dużo predyktorów lub rzadkie zdarzenia
  • Oceniaj kalibrację: Accuracy ukrywa, czy twoje przewidywane prawdopodobieństwa odpowiadają rzeczywistym częstościom. Używaj log-loss lub Brier score i patrz na wykres kalibracji, gdy prawdopodobieństwa mają znaczenie biznesowe

Wnioski

Prawdę mówiąc, regresja logistyczna to jeden z bardziej wyrozumiałych modeli, jakie możesz dopasować.

Toleruje skośne predyktory i niezrównoważone wyniki, nie obchodzi jej, jak wyglądają reszty. Czego nie toleruje, to źle wyspecyfikowane relacje z log-szansą albo zestaw predyktorów niosących tę samą informację.

Dlatego liniowość logitu i wielokolinearność to dwa sprawdzenia założeń, które warto traktować jako obowiązkowe. To one zniekształcają model w sposób, którego nie złapie żadna metryka testowa. Pozostałe cztery też są istotne, ale na tych dwóch naprawdę się skup.

Dla bezpieczeństwa uruchamiaj diagnostyki równolegle z ewaluacją, a nie po niej. Model, który dobrze przewiduje i przechodzi kontrolę założeń, to model, pod którym możesz się podpisać. Wszystko poniżej to model, który wytrenowałeś, ale tak naprawdę nie zweryfikowałeś.

Jeśli brzmi to skomplikowanie, to dlatego, że takie jest. Dużo potrzeba, by być dobrym inżynierem ML, więc polecamy zapisać się na nasz Machine Learning Scientist in Python. 85 godzin materiałów przygotuje cię do pracy w 2026 roku.

FAQs

Czy regresja logistyczna ma założenia?

Tak. Regresja logistyczna ma mniej założeń niż liniowa, ale nie jest ich pozbawiona. Najważniejsze dotyczą kształtu zmiennej wyjściowej, niezależności obserwacji, liniowości log-szans oraz braku silnej wielokolinearności czy silnie wpływowych punktów.

Jakie są najważniejsze założenia regresji logistycznej?

Dwa najważniejsze to liniowość logitu i brak silnej wielokolinearności. Liniowość logitu bywa najczęściej źle rozumiana – regresja logistyczna nie zakłada liniowej relacji między predyktorami a wynikiem, ale zakłada liniową relację między predyktorami a log-szansą. Wielokolinearność ma znaczenie, bo zniekształca współczynniki i zawyża błędy standardowe bez wpływu na accuracy, więc może się ukryć przed kontrolami patrzącymi wyłącznie na wyniki predykcji.

Co się dzieje, gdy założenia regresji logistycznej są naruszane?

To zależy, które założenie pęka. Naruszenia liniowości logitu lub silna wielokolinearność po cichu psują współczynniki, pozostawiając accuracy bez zmian – dlatego łatwo je przegapić. Naruszenie niezależności zaniża lub zawyża błędy standardowe, czyniąc wartości p niewiarygodnymi. Większość naruszeń nie czyni modelu bezużytecznym, ale sprawia, że jego części są niegodne zaufania w sposób, którego samo accuracy nie pokaże.

Czy regresja logistyczna wymaga normalnie rozłożonych predyktorów?

Nie. Regresja logistyczna nie nakłada założeń rozkładowych na predyktory. Możesz bez problemu łączyć w tym samym modelu zmienne ciągłe, kategoryczne, skośne i o ciężkich ogonach. Liczy się relacja między predyktorem a log-szansą, a nie marginalny kształt samego predyktora.

Jaki jest dobry próg VIF dla regresji logistycznej?

Wartości VIF do 5 są zwykle w porządku, wartości od 5 do 10 sugerują umiarkowaną wielokolinearność wartą zbadania, a powyżej 10 sygnalizują, że jeden lub więcej predyktorów jest redundantnych. Progi to konwencje, nie twarde zasady – interpretacja VIF zależy od liczebności próby i potrzebnej precyzji. Jeśli VIF predyktora jest wysoki, a jego błąd standardowy wygląda niestabilnie w podzbiorach danych, masz dowód, że kolinearność sprawia kłopot.

Tematy

Ucz się z DataCamp

course

Wprowadzenie do regresji w R

4 godz.
77.1K
Prognozuj ceny mieszkań i współczynnik kliknięć reklam, implementując, analizując i interpretując analizę regresji w R.
Zobacz szczegółyRight Arrow
Rozpocznij kurs
Zobacz więcejRight Arrow