Перейти к основному содержимому

Предпосылки логистической регрессии: что нужно проверить перед моделированием

Практическое руководство по предпосылкам логистической регрессии, диагностикам нарушений в Python и R, а также по альтернативам, когда предпосылки не соблюдаются.
Обновлено 15 июн. 2026 г.  · 15 мин читать

После того как вы обучили модель логистической регрессии, как убедиться, что коэффициентам можно доверять?

Логистическая регрессия известна простотой. В scikit-learn вы вызываете .fit(), смотрите на отношения шансов — и на этом всё. Но большинство новичков не знают, что у модели есть собственные предпосылки, и если их игнорировать, коэффициенты будут вводить в заблуждение, а предсказания окажутся смещёнными так, что ни одна метрика теста об этом не скажет.

По правде говоря, у логистической регрессии меньше предпосылок, чем у линейной, и те, что есть, легко проверить. Достаточно запустить правильные диагностики перед интерпретацией результатов, чтобы понять, каким частям модели можно доверять.

В этой статье я разберу каждую предпосылку логистической регрессии, как проверить её в Python и R, что происходит при нарушениях и к каким альтернативам обращаться, если предпосылки нельзя соблюсти.

Если вы новичок в Data Science и машинном обучении, прочитайте нашу запись в блоге о простой линейной регрессии, чтобы понять её предпосылки и диагностики.

Что такое логистическая регрессия?

Логистическая регрессия — это модель классификации, предсказывающая вероятность категориального исхода. Вы задаёте предикторы, а на выходе получаете число от 0 до 1, которое можно трактовать как вероятность принадлежности к заданному классу.

Чаще всего её применяют для бинарной классификации — уйдёт клиент или нет, спам или не спам. Варианты вроде мультиномиальной и порядковой логистической регрессии покрывают больше двух классов, но под «логистической регрессией» обычно имеют в виду именно бинарный случай.

Под капотом модель подбирает линейную комбинацию предикторов и пропускает результат через логистическую функцию. На выходе — вероятность, а коэффициенты показывают, как каждый предиктор сдвигает логарифм шансов.

Важно понимать, что логистическая регрессия отличается от линейной. У последней есть знакомые предпосылки — нормальность остатков, гомоскедастичность, линейность связи между предикторами и целевой переменной. Логистическая регрессия этого не предполагает. У неё свой список, и он достаточно отличен, чтобы перенос предпосылок линейной регрессии приводил к ложным выводам.

Подробнее о логистической регрессии читайте в нашей статье с реализацией на Python.

Почему важны предпосылки логистической регрессии

Предпосылки важны, потому что они напрямую связаны с тем, как вы используете модель.

Если предпосылки соблюдены, коэффициенты значат именно то, что вы думаете. Отношения шансов корректны, а вероятности хорошо соотносятся с фактическими исходами. Когда предпосылки не соблюдаются, всё это становится шатким так, что матрица ошибок или любая другая метрика этого не покажет.

Хорошая новость — нарушения не бинарны. Небольшое отступление, скажем, от линейности логита не делает модель бесполезной. Это лишь означает, что отношения шансов слегка смещены, а предсказания могли бы быть лучше. Множество продакшен‑моделей живут с несовершенными проверками предпосылок — и это нормально.

Главное — не пропускать проверки. Без диагностик вы не поймёте, мала проблема или велика, пока предсказания не начнут сбоить.

Обзор предпосылок логистической регрессии

Прежде чем разбирать каждую предпосылку, вот полный список, который нужно проверить.

Предпосылка Что требуется Распространённая диагностика
Независимость наблюдений Ни одна запись не влияет на другую Дизайн исследования, внутриклассовая корреляция
Корректная целевая переменная Бинарная или смоделирована подходящим вариантом Осмотр целевой переменной
Линейность логита Предикторы линейны в логарифме шансов Тест Бокса—Тидуэлла, сплайны
Отсутствие сильной мультиколлинеарности Предикторы не сильно коррелируют VIF, корреляционная матрица
Достаточный объём выборки Достаточно событий на переменную Правило EPV
Отсутствие влиятельных выбросов Ни одна запись существенно не искажает подгонку Расстояние Кука, рычаги (leverage)

Таблица предпосылок логистической регрессии

Это весь чек‑лист. Далее я проведу вас по каждой предпосылке с диагностиками в Python и R, покажу, как выглядят нарушения и что делать, если что‑то идёт не так.

Основные предпосылки логистической регрессии

Предпосылка 1: Целевая переменная бинарна (или корректно смоделирована)

Стандартная логистическая регрессия рассчитана на бинарный исход. Целевая переменная должна иметь ровно две категории — под это и спроектирована модель.

Классические примеры: будет отток или нет, болезнь или нет. Всё, что можно сформулировать как вопрос «да/нет», — хороший кандидат.

Если исходов больше двух, нужен другой вариант. Мультиномиальная логистическая регрессия работает с неупорядоченными категориями — сегменты клиентов, типы продуктов. Порядковая логистическая регрессия — с упорядоченными категориями, как оценки удовлетворённости от 1 до 5, где порядок уровней имеет смысл.

Притягивать многоклассовый исход к бинарной модели обычно означает сливать категории, которые сливать не стоит. Если у вас 5 уровней удовлетворённости и вы режете до «доволен/недоволен», вы теряете информацию, которая могла помочь модели. Выбирайте вариант, соответствующий форме вашей цели.

Предпосылка 2: Наблюдения независимы

Каждая строка датасета должна давать модели информацию, которую не даёт другая строка. Если две записи связаны так, что это нарушается, стандартные ошибки и p‑значения перестают означать то, что должны.

Предпосылка рушится всякий раз, когда наблюдения разделяют структуру, которую вы не смоделировали. Примеры: повторные измерения у одного пациента — их объединяет биология пациента. Или студенты в одном классе — их объединяют учитель и аудитория.

Если это игнорировать и подгонять обычную логистическую регрессию, модель рассматривает каждую строку как новую информацию и чрезмерно снижает стандартные ошибки. Коэффициенты могут выглядеть нормально, но p‑значения и доверительные интервалы будут чересчур уверенными.

Стандартные альтернативы — логистическая регрессия со смешанными эффектами и GEE. Смешанные модели добавляют случайные эффекты для групп (пациент, класс), чтобы учесть внутри групп корреляцию. GEE (обобщённые уравнения оценивания) дают усреднённые по популяции эффекты с корректировкой стандартных ошибок без механизма случайных эффектов.

Выбирайте смешанные модели, когда важна внутри групп вариативность. Выбирайте GEE, когда нужны маржинальные эффекты по всей популяции.

Предпосылка 3: Линейность логита

Это предпосылка, которую чаще всего неверно понимают.

Модель не предполагает линейной связи предикторов с исходом. Она предполагает линейную связь с логарифмом шансов исхода. Это другое утверждение, и оно меняет, что именно нужно проверять.

Что такое логит

Логит — это натуральный логарифм шансов. Для вероятности p шансы равны p / (1 - p), а логит — логарифм этого отношения:

Логит

Логит

Логистическая регрессия подгоняет линейное уравнение в этой шкале:

Формула логистической регрессии

Формула логистической регрессии

Правая часть линейна по предикторам. Левая часть — это логарифм шансов, а не вероятность. Сама вероятность получается, когда линейную комбинацию пропускают через логистическую функцию, которая нелинейна.

Значит, связь любого предиктора с вероятностью нелинейна. Линейной должна быть связь предиктора с логарифмом шансов.

Почему это важно на практике

Когда линейность логита не выполняется для какого‑то предиктора, его коэффициент сворачивает кривую в прямую. Модель всё равно выдаёт число, и оно может быть статистически значимым, но это число не описывает реальную связь в данных.

Например, у age может быть U‑образный эффект на логарифм шансов болезни — высокий риск на обоих краях и ниже в середине. Если включить age как один линейный член, коэффициент может оказаться близким к нулю, и вы решите, что возраст не важен. Важен. Просто спецификация неверна.

Проверка линейности логита

Есть несколько вариантов проверки этой предпосылки.

Самая быстрая — визуальный осмотр. Разбейте каждый непрерывный предиктор на децильные бины, посчитайте эмпирический логарифм шансов в каждом бине и постройте график против предиктора. Примерно прямая линия — предпосылка выполняется. Явная кривая — нет. Проверка неформальная, но хорошо работает при достаточном числе наблюдений в бине.

Тест Бокса—Тидуэлла добавляет взаимодействие между каждым непрерывным предиктором и его натуральным логарифмом. Если взаимодействие статистически значимо, предпосылка линейности логита нарушена для этого предиктора. Тест работает только для строго положительных предикторов (лог от нуля и отрицательных не берётся) и чувствителен к размеру выборки, как любой тест значимости.

Сплайны — ещё один вариант. Вместо проверки, выполняется ли линейность, вы заменяете линейный член гибкой базисной функцией, например ограниченным кубическим сплайном, и позволяете модели подогнать нужную форму. Если сплайн существенно лучше линейного члена (по отношению правдоподобия или AIC), значит, линейная спецификация была слишком жёсткой. Сплайны также выступают как исправление — оставить их в финальной модели часто лучший ответ при провале линейности.

Что делать, если линейность нарушена

Если предпосылка не выполняется для предиктора, есть несколько опций:

  • Преобразовать предиктор (часто помогает логарифм или квадратный корень), чтобы связь выглядела линейной в логарифме шансов
  • Использовать сплайны и принять чуть более сложную модель

Оба решения оставляют вас в семействе логистической регрессии и лучше, чем исключать информативный предиктор.

Предпосылка 4: Отсутствие сильной мультиколлинеарности

Логистическая регрессия терпит коррелированные предикторы до определённого момента. После него модель начинает вести себя плохо, и это трудно заметить по метрикам.

Мультиколлинеарность возникает, когда два и более предикторов несут одинаковую (или очень похожую) информацию. Например, рост в дюймах и сантиметрах в одной модели. Или общая выручка и выручка на клиента вместе с числом клиентов.

При мультиколлинеарности происходят две вещи:

  • Коэффициенты становятся нестабильными: добавьте или уберите одну строку — коэффициент на коллинеарном предикторе может резко измениться или сменить знак. Модель работает, но отдельные коэффициенты теряют смысл.
  • Стандартные ошибки раздуваются: с меньшим количеством независимой информации на предиктор модель менее уверена в каждом коэффициенте. P‑значения растут, и реальные эффекты могут стать «незначимыми».

Предсказания обычно в порядке. Если вам важны только вероятности, слабая/умеренная мультиколлинеарность редко мешает. «Урон» сосредоточен в коэффициентах и выводах по ним.

Две проверки — корреляционная матрица и фактор инфляции дисперсии (VIF). Сначала смотрят на пары предикторов с корреляциями выше 0,8–0,9 по модулю. Ограничение в том, что матрица видит только парные связи, а не многомерную избыточность трёх и более предикторов.

VIF как раз для многомерного случая. Для каждого предиктора VIF измеряет, насколько дисперсия его коэффициента раздута коллинеарностью с остальными. VIF=1 — коллинеарности нет, до 5 — обычно нормально, свыше 10 — сильный сигнал, что предиктор избыточен.

Если VIF что‑то флагирует, проще всего убрать один из коллинеарных предикторов или объединить их (сумма, отношение). Если хочется оставить всё, регуляризация (ридж или эластичная сеть) стабилизирует коэффициенты без выбора.

Предпосылка 5: Адекватный объём выборки

Логистическая регрессия работает и на небольших выборках, но менее надёжно. Коэффициенты колеблются сильнее, а эффекты редкого класса почти не оценить.

Важен не общий размер данных, а число событий (наблюдений миноритарного класса). Датасет на 100 000 строк с 50 случаями фрода — это задача малого объёма, потому что модель видит только 50 примеров того, чему учится.

Здесь появляется показатель «событий на переменную» (EPV). EPV — это число наблюдений миноритарного класса, делённое на число предикторов в модели. Если 50 случаев фрода и 10 предикторов, EPV=5.

Старое правило большого пальца — EPV не ниже 10. Недавние симуляции показывают, что число зависит от размеров эффектов и используемой регуляризации. В одних условиях достаточно EPV≈5, в других нужно 20+.

Вывод: воспринимайте EPV как предупреждение. Ниже 10 — ждите нестабильных оценок и рассмотрите пенализированные методы (логистическая регрессия Фирта, ридж). Ниже 5 — соберите больше данных или упростите модель, прежде чем доверять отдельным коэффициентам.

Дисбаланс классов — смежная, но отдельная проблема.

Датасет, где 99% — один класс, всё ещё может иметь достаточно событий на переменную в абсолюте. Сдвигается базовая частота исхода, а не EPV. Несбалансированные данные дают консервативные вероятности, а accuracy перестаёт быть полезной. Используйте log-loss или Brier score вместо accuracy и подумайте о весах классов или настройке порога для сбалансированных решений.

Предпосылка 6: Нет сильно влиятельных выбросов

Логистическая регрессия не требует нормального распределения предикторов. Скосы и счётные переменные — не проблема сами по себе. Важно другое: чтобы ни одно наблюдение непропорционально не влияло на коэффициенты.

Влиятельное наблюдение — такое, удаление которого заметно изменит модель. Это не то же самое, что выброс по остатку. Точка может иметь большой остаток (модель её плохо предсказывает), но не быть влиятельной, и наоборот — быть влиятельной без большого остатка.

Полезно иметь несколько диагностик под разные аспекты влияния:

  • Рычаги (leverage) измеряют, насколько необычны значения предикторов у наблюдения относительно остальных. Сам по себе высокий рычаг не означает влияния — он лишь даёт потенциал, если исход «не согласуется» с предикторами
  • Расстояние Кука объединяет рычаг и остаток в одно число, оценивающее, как изменятся коэффициенты при удалении наблюдения. Большие значения — кандидаты на изучение. Часто смотрят порог 4/n (где n — размер выборки) или просто крупнейшие значения в наборе
  • Диагностика остатков полезна там, где рычаги и Кук не ловят проблем. Остатки девианса и Пирсона отмечают наблюдения, с которыми модели трудно. Точка с большим остатком заслуживает внимания даже при умеренном рычаге — модель «говорит», что не может её объяснить другими предикторами

Когда находите влиятельную точку, вопрос — реальна она или ошибочна. Ошибка ввода исправляется или удаляется. Реальный, но необычный случай остаётся, и вы отмечаете, что выводы зависят от него. Не исключайте точки просто потому, что они влиятельны — так легко получить модель, которая подогнана под обучение и больше ни под что.

Распространённые заблуждения о предпосылках логистической регрессии

Основная путаница возникает из‑за переноса чек‑листа линейной регрессии. Он известен и преподаётся повсеместно, поэтому «мигрирует» в логистическую регрессию, где ему не место. Вот четыре самых частых момента.

Логистическая регрессия требует нормального распределения переменных

Это неверно. Логистическая регрессия не накладывает нормальности ни на одну переменную.

Исход должен быть бинарным, а не нормальным — это мы разобрали в предпосылке 1. Предикторы тоже не обязаны быть нормальными и могут иметь любую форму. Важно не распределение каждой переменной по отдельности, а связь предикторов с логарифмом шансов.

Логистическая регрессия требует гомоскедастичности

Это тоже неверно. Гомоскедастичность (постоянная дисперсия остатков) — предпосылка линейной регрессии, не относящаяся к логистической.

Дисперсия исхода в логистической регрессии зависит от предсказанной вероятности. Для Бернулли дисперсия равна p(1 - p) — максимальна при p = 0.5 и минимальна около 0 и 1. Дисперсия не постоянна, и модель учитывает это в функции правдоподобия, которую максимизирует.

Так что разные дисперсии предсказанных вероятностей — это не нарушение, а норма работы модели.

Предикторы должны быть нормально распределены

Неверно. Логистическая регрессия не требует определённого распределения предикторов.

Можно смешивать непрерывные, бинарные, счётные и категориальные предикторы в одной модели. Скосы допустимы. Тяжёлые хвосты — тоже. Модель не заботит форма маргинальных распределений. Её волнует только линейность логита (см. предпосылку 3) — это предпосылка о форме связи, а не форме распределения.

Если скос предиктора мешает, виновата обычно линейность логита или влиятельные выбросы.

Остатки должны быть нормально распределены

Неверно. Никакой нормальности остатков логистическая регрессия не предполагает.

В линейной регрессии остатки предполагаются нормальными вокруг нуля — это часть вывода. Логистическая регрессия использует ММП на биномиальном правдоподобии, и распределение её остатков определяется исходом (0 или 1) и предсказанной вероятностью. Они не нормальны — и не должны быть.

Поэтому, проверяя остатки (как в предпосылке 6), вы ищете влиятельные наблюдения и точки, которые модель не объясняет, а не колокол.

Как проверить предпосылки логистической регрессии в Python

Диагностику я покажу со statsmodels. Scikit-learn подгоняет логистическую регрессию, но из коробки не даёт VIF, статистик влияния и диагностики остатков.

Подготовка примера

Сгенерирую синтетические данные об оттоке с тремя предикторами (возраст, доход, индекс трат), где возраст и доход специально коррелированы, чтобы мультиколлинеарность было видно.

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

Сводка модели

Сводка модели

Сводка даёт коэффициенты, стандартные ошибки, z‑статистики и p‑значения. age и spending_score оказываются значимыми предикторами. Коэффициент income мал, потому что исход напрямую от дохода не зависит — его «эффект» поглощается возрастом.

Мультиколлинеарность через VIF

В statsmodels это считается очень просто:

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

Вывод VIF

VIF для age и income около 5.5 — это слабая мультиколлинеарность. У spending_score VIF близок к 1 — как и нужно. Значения выше 5 — лёгкий флаг, выше 10 — серьёзная проблема, требующая немедленного решения. Здесь разумно либо убрать один из age или income, либо объединить их в один признак.

Линейность логита через Бокса—Тидуэлла

Тест Бокса—Тидуэлла добавляет взаимодействия между каждым непрерывным предиктором и его натуральным логарифмом. Значимые взаимодействия сигнализируют о нелинейной связи в логарифме шансов.

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

Вывод теста Бокса—Тидуэлла

Вывод теста Бокса—Тидуэлла

Если какие‑то из этих p‑значений ниже 0.05, предпосылка линейности логита для соответствующего предиктора под вопросом. В нашем примере логит сгенерирован линейно, так что взаимодействия не должны быть значимы. На реальных данных значимый результат — повод построить график эмпирического логита против предиктора и решить, подойдёт ли преобразование или сплайн.

Диагностика влияния

В statsmodels доступны расстояние Кука и рычаги через 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)

Вывод диагностики влияния

Вывод диагностики влияния

Порог расстояния Кука для рассмотрения — примерно 4/n. При 1000 строк это 0.004. Всё существенно выше — к тщательному разбору. В этом наборе крупнейшие значения малы — «скучно‑хороший» исход, который обычно и нужен.

Построим визуализацию, чтобы лучше увидеть распределение:

Визуализация диагностики влияния

Визуализация диагностики влияния

Точки, заметно выше пунктирного порога, — кандидаты на разбор. Они есть, но их немного.

Диагностика остатков

Остатки девианса показывают наблюдения, с которыми модели трудно.

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)

Вывод диагностики остатков

Вывод диагностики остатков

Большие положительные остатки девианса — случаи, где модель дала низкую вероятность, но исход был положительным. Большие отрицательные — наоборот. Сопоставьте наблюдения с большими остатками с диагностикой влияния выше. Случай, который и плохо предсказан, и влиятелен, — самый приоритетный для проверки.

Как проверить предпосылки логистической регрессии в R

В R есть более тесная поддержка этих диагностик. Большая часть нужна из базовой glm() плюс пакет car.

Подготовка примера

Сгенерирую аналогичный синтетический датасет, как в примере на Python, с намеренно коррелированными возрастом и доходом.

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)

Сводка модели (R)

Сводка модели (R)

Вывод summary(model) даёт коэффициенты, стандартные ошибки, z‑статистики и p‑значения. age и spending_score должны выглядеть значимыми, а эффект income поглощается age.

Мультиколлинеарность через VIF

Пакет car даёт vif() для любого glm:

library(car)

vif(model)

Вывод VIF в R

Вывод VIF в R

age и income будут с VIF около 5.7 — это заложенная мультиколлинеарность. spending_score близок к 1. Как и в Python, значения выше 5 требуют внимания, свыше 10 — явная проблема.

Линейность логита через Бокса—Тидуэлла

Функция car::boxTidwell рассчитана на линейную регрессию, поэтому для логистической лучше вручную добавить члены взаимодействия и переоценить модель:

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, ]

Вывод Бокса—Тидуэлла в R

Вывод Бокса—Тидуэлла в R

Вывод показывает коэффициент и p‑значение для каждого взаимодействия. Значимые p‑значения указывают на нарушение линейности логита для предиктора. Для синтетики тест не должен отвергать линейность. На реальных данных продолжайте эмпирическими графиками логита или подберите модель со сплайнами (пакет splines) для отмеченных предикторов.

Диагностика влияния

В R доступны cooks.distance() и hatvalues() в базе, без сторонних пакетов:

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)

Диагностика влияния в R

Диагностика влияния в R

Порог расстояния Кука тот же, что и в Python: 4/n, то есть 0.004 при 1000 строках. Всё существенно выше — к разбору. Для быстрого визуального осмотра plot(model, which = 4) строит график расстояния Кука одной строкой.

Визуализация диагностики влияния в R

Диагностика остатков

Функция residuals() в R возвращает остатки девианса для 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)

Диагностика остатков в R

Диагностика остатков в R

Большие по модулю остатки девианса — это наблюдения, где предсказания модели промахнулись. Сопоставьте их с флагами расстояния Кука, чтобы найти случаи, которые одновременно плохо подогнаны и влиятельны.

Для экспресс‑осмотра всего сразу influence.measures(model) вернёт таблицу, объединяющую расстояние Кука, рычаги, DFBETAs и пару других статистик влияния. Это самый быстрый способ просканировать стандартные диагностики для glm.

Что происходит при нарушении предпосылок?

Большинство нарушений не «ломают» модель так, что она перестаёт работать. Они вызывают тонкие сбои, заметные только тем, кто знает, что искать.

Четыре частых последствия:

  1. Нестабильные коэффициенты: небольшие изменения данных (пара строк, лёгкая правка фичей) могут сильно изменить коэффициенты или перевернуть их знак. Это эффект мультиколлинеарности и малого объёма выборки относительно числа предикторов
  2. Плохая калибровка: предсказанные вероятности перестают совпадать с фактическими частотами. Модель даёт 30% риска оттока, а наблюдаем 15%. Точность может быть нормальной, но вероятности — нет. К этому ведут нарушения линейности логита и влиятельные выбросы
  3. Вводящий в заблуждение вывод: самое трудное для обнаружения: модель всё равно выдаёт стандартные ошибки и p‑значения «как будто» нормальные. Зависимые наблюдения занижают стандартные ошибки, неправильные спецификации — раздувают. В итоге p‑значения не значат того, что вы думаете
  4. Ухудшение качества предсказаний: наиболее очевидный симптом, хотя часто и наименее выраженный. Предсказания обычно держатся лучше, чем коэффициенты, поэтому команды, смотрящие только на accuracy, часто пропускают тревожные сигналы.

Честно говоря, нарушения редко делают модель бесполезной. Они делают недостоверными её отдельные части — и какие именно, зависит от нарушенной предпосылки. Поэтому диагностика так важна.

Альтернативы, если предпосылки логистической регрессии не выполняются

Если диагностика указывает на проблемы, которые нельзя исправить в рамках логистической регрессии, следующая опция — модель, не делающая этих предположений.

Обобщённые аддитивные модели (GAM) — первый кандидат. GAM сохраняет логит‑ссылку и интерпретируемую аддитивную структуру, но заменяет линейные члены на сглаженные функции каждого предиктора. Вы получаете «коэффициенты‑с‑формой» вместо одного числа — это решает проблему линейности логита. GAM остаются достаточно параметрическими для анализа и интерпретации, что делает их хорошим шагом вверх, когда линейность не держится.

Деревья — более гибкая альтернатива. Случайные леса и градиентный бустинг не предполагают форм распределений или форм связей. Они справляются с мультиколлинеарностью и улавливают нелинейности. Они не дают простой интерпретации коэффициентов, как логистическая регрессия, но часто выигрывают по предиктивным метрикам, когда в данных есть нелинейная структура или взаимодействия, которых вы не задали.

Выбор между GAM и деревьями зависит от того, что вам нужно от модели.

  • Выбирайте GAM, когда приоритет — интерпретируемость и вы хотите видеть, как каждый предиктор влияет на логарифм шансов
  • Выбирайте бустинг по деревьям, когда приоритет — качество предсказаний и вы готовы к меньшей прозрачности

Заметим, что предпосылки логистической регрессии проще проверить, чем игнорировать. Если проблему можно решить преобразованием, сплайном, регуляризацией или лучшей выборкой, интерпретируемость и выводы логистической регрессии обычно ценнее, чем у более гибких моделей.

Переходите к GAM или деревьям, когда диагностика явно показывает, что предпосылки не держатся, а не просто потому, что логистическая регрессия «не самая современная».

Лучшие практики моделирования логистической регрессии

И напоследок — короткий список, чтобы моделью всегда можно было гордиться:

  • Проверьте предпосылки до интерпретации: запустите VIF, тест Бокса—Тидуэлла и диагностику влияния до чтения коэффициентов. Если интерпретировать раньше, чем проверять, придётся защищать числа, которые вы не верифицировали. Не будьте тем человеком на встрече
  • Используйте регуляризацию при малом объёме выборки: ридж или эластичная сеть стабилизируют коэффициенты при низком EPV или коррелированных предикторах. Это небольшой сдвиг в обмен на сильное снижение дисперсии — обычно выгодная сделка
  • Валидируйте на невиданных данных: отложенная выборка или кросс‑валидация. Тренировочные метрики завышают качество, когда есть пространство для переобучения, а оно есть при множестве предикторов или редких событиях
  • Оценивайте калибровку: точность скрывает, соответствуют ли прогнозные вероятности реальным частотам. Используйте log-loss или Brier score и смотрите на калибровочные графики, если вероятности важны для бизнеса

Выводы

По правде говоря, логистическая регрессия — одна из самых снисходительных моделей.

Ей не страшны скошенные предикторы и дисбаланс классов, и ей всё равно, как выглядят остатки. Но она не терпит неверной спецификации связи с логарифмом шансов и набора предикторов с одинаковой информацией.

Поэтому линейность логита и мультиколлинеарность — две проверки, которые стоит считать обязательными. Именно они искажают модель так, что это не поймает ни одна метрика. Остальные четыре предпосылки тоже важны, но на этих двух нужно сконцентрироваться.

Для надёжности запускайте диагностику параллельно с оценкой качества, а не после. Модель, которая хорошо предсказывает и проходит проверки предпосылок, — модель, за которую можно поручиться. Всё остальное — модель, которую вы обучили, но толком не проверили.

Если это кажется сложным — так и есть. Чтобы стать хорошим инженером по машинному обучению, нужно многое. Рекомендуем записаться на наш трек Machine Learning Scientist in Python. 85 часов материалов подготовят вас к 2026 году.

FAQs

У логистической регрессии есть предпосылки?

Да. Логистическая регрессия делает меньше предположений, чем линейная, но не является «свободной от предпосылок». Основные касаются формы целевой переменной, независимости наблюдений, линейности логарифма шансов и отсутствия сильной мультиколлинеарности или сильно влиятельных точек.

Какие самые важные предпосылки логистической регрессии?

Две самые важные — линейность логита и отсутствие сильной мультиколлинеарности. Линейность логита часто неправильно понимают: логистическая регрессия не предполагает линейной связи предикторов с исходом, но предполагает линейную связь с логарифмом шансов. Мультиколлинеарность важна, потому что искажает коэффициенты и раздувает стандартные ошибки без влияния на точность, поэтому её легко не заметить, если смотреть только на предсказательную эффективность.

Что будет, если предпосылки логистической регрессии нарушены?

Зависит от того, какая предпосылка нарушается. Нарушения линейности логита или сильная мультиколлинеарность тихо портят коэффициенты, оставляя точность нетронутой — поэтому их легко пропустить. Нарушение независимости завышает или занижает стандартные ошибки, делая p‑значения ненадёжными. Большинство нарушений не делают модель бесполезной, но делают недостоверными её части — и по одной точности этого не увидеть.

Нужны ли для логистической регрессии нормально распределённые предикторы?

Нет. Логистическая регрессия не накладывает распределительных требований на предикторы. Можно без проблем смешивать непрерывные, категориальные, скошенные и тяжёлохвостые предикторы в одной модели. Важно не маргинальное распределение предиктора, а его связь с логарифмом шансов.

Какой порог VIF считается хорошим для логистической регрессии?

Значения VIF до 5 обычно приемлемы, 5–10 указывают на умеренную мультиколлинеарность, требующую внимания, свыше 10 сигнализируют, что один или несколько предикторов избыточны. Пороги — не жёсткие правила, а конвенции: интерпретация VIF зависит от объёма выборки и нужной точности. Если у предиктора высокий VIF и его стандартная ошибка «плавает» на разных подвыборках, есть основания полагать, что коллинеарность мешает.

Темы

Учитесь с DataCamp

Course

Introduction to Regression in R

4 ч
77.1K
Predict housing prices and ad click-through rate by implementing, analyzing, and interpreting regression analysis in R.
ПодробнееRight Arrow
Начать курс
Смотрите большеRight Arrow