Статистика

Generalized Linear Models: когда прямая линия не работает

В 1972 году Нелдер и Веддербёрн показали: логистическая регрессия, регрессия Пуассона и гамма-регрессия - это один фреймворк с тремя параметрами. Sklearn до сих пор отражает это: PoissonRegressor, GammaRegressor и LogisticRegression - это всё GLM.

  • Credit scoring: логистическая регрессия (бинарный исход дефолт/нет)
  • Страхование: гамма-регрессия для severity потерь (правосторонняя асимметрия)
  • Demand forecasting: регрессия Пуассона для счётных данных заказов
  • CTR prediction: логистическая регрессия как baseline в каждой рекомендательной системе
  • Медицина: отрицательная биномиальная для overdispersed count данных (количество рецидивов)
  • Sklearn GLM: PoissonRegressor, GammaRegressor, TweedieRegressor из одного фреймворка

**1972 год. Лондон. Два статистика меняют историю прикладной математики.** Джон Нелдер и Роберт Веддербёрн публикуют в Journal of the Royal Statistical Society статью в восемь страниц. До этого момента логистическая регрессия живёт в учебниках по биостатистике, регрессия Пуассона - в учебниках по демографии, гамма-регрессия - по актуарной математике. Три разных метода с тремя разными алгоритмами и тремя разными нотациями. Нелдер и Веддербёрн смотрят на это и видят одно и то же. Их статья показывает: за всеми этими методами стоит один фреймворк с тремя компонентами. После публикации исчезает необходимость изобретать новый алгоритм для каждого нестандартного типа данных. Это и есть scientific unification в чистом виде - один из редких случаев, когда одна идея обесценивает десятки предыдущих.

**Чему этот урок учит на самом деле**: не просто "как запустить логистическую регрессию", а почему credit scoring, demand forecasting, страховое ценообразование и click-through prediction - это один и тот же метод с разными параметрами. GLM - это язык, на котором инженеры описывают любой regression task где обычная прямая линия ломается. После этого урока будет понятно, почему sklearn имеет `PoissonRegressor` и `GammaRegressor` рядом с `LogisticRegression` - и как выбирать между ними.

Почему обычная линейная регрессия ломается: три типа проблем

**Линейная регрессия предполагает одно главное:** Y ~ N(Xβ, σ²). Отклик Y нормально распределён вокруг линейного предиктора, дисперсия постоянна. Три типа данных нарушают это предположение настолько грубо, что OLS даёт не просто неточные - принципиально неправильные ответы. Первый тип: **бинарный отклик** (0/1). Предсказываем вероятность одобрения кредита - OLS может выдать -0.3 или 1.4, что бессмысленно; нужен отклик в [0,1]. Второй тип: **счётные данные** (0, 1, 2, 3...) - число жалоб за день, число транзакций в час. OLS предскажет отрицательные значения и игнорирует дискретность. Третий тип: **всегда положительный непрерывный отклик** - время ожидания, стоимость страхового случая. Распределение right-skewed, а OLS предполагает симметрию.

Предварительные знания

  • Linear Regression
  • MLE: Why PyTorch's Cross-Entropy Loss is Fisher's 1922 Formula
  • Hypothesis Testing: How p-values Killed 64,000 Studies

**Профессиональный приём**: первый вопрос при постановке regression task - "что такое Y?" Бинарный → logistic. Счёт без верхней границы → Poisson. Всегда положительный, right-skewed → Gamma. Линейный OLS - это GLM с Normal family и identity link; его стоит выбирать осознанно, а не по умолчанию.

Три компонента GLM: унифицированный фреймворк

**GLM - это не один метод, а архитектурный паттерн.** Любая GLM-модель состоит из трёх выборов. Выбрать их правильно - значит корректно специфицировать задачу. Эта трёхкомпонентная структура объясняет, почему Нелдер и Веддербёрн смогли объединить такие разные методы: при фиксированном фреймворке различия между моделями сводятся к двум строкам конфигурации.

**Почему это важно для практики**: link function - это не математический трюк, а содержательный выбор. Logit link кодирует убеждение "вероятность - это log-odds, линейно зависящие от предикторов". Log link кодирует "ожидаемый счёт умножается при изменении предиктора, а не складывается". Интерпретация коэффициентов полностью меняется в зависимости от link.

Exponential Family: почему именно эти распределения

**Не любое распределение можно использовать в GLM - только exponential family.** Это не произвол, а математически мотивированное ограничение. Exponential family имеет форму p(y; theta) = h(y) * exp(eta(theta) * T(y) - A(theta)), где T(y) - sufficient statistic, A(theta) - log-partition function. Это семейство включает большинство классических распределений: Normal, Binomial, Poisson, Gamma, Exponential, Beta, Multinomial. Три свойства делают его идеальным для GLM: 1. sufficient statistics существуют, что означает минимальный объём информации из данных 2. conjugate priors существуют, что критично для Байесовских GLM 3. IRLS алгоритм (о нём ниже) гарантированно сходится.

**Canonical link vs лучший link**: canonical link - это тот, при котором log-likelihood имеет самую красивую форму. Но это не значит, что он всегда правильный. Gamma с log link часто интерпретируется лучше, чем с canonical inverse link (потому что exp(beta) - мультипликативный эффект). statsmodels и sklearn позволяют задать любую link function; canonical - просто дефолт.

IRLS: как оценивают параметры GLM

**В отличие от OLS, GLM нет аналитического решения** - кроме случая Normal с identity link, который и есть OLS. Параметры находят через maximum likelihood estimation, применяя Newton-Raphson к log-likelihood. Нелдер и Веддербёрн показали, что этот итерационный процесс эквивалентен последовательному решению взвешенной МНК задачи. Алгоритм называется IRLS (Iteratively Reweighted Least Squares). На каждой итерации строится вспомогательная переменная z ("adjusted dependent variable") и матрица весов W, затем решается WLS. Сходимость квадратичная (как Newton-Raphson) - обычно 5-10 итераций достаточно даже для больших датасетов.

Deviance: что такое goodness-of-fit для GLM

**GLM не использует R² - R² не имеет смысла за пределами Normal family.** Вместо него используется deviance - обобщение RSS (residual sum of squares) на произвольные распределения. Deviance измеряет, насколько текущая модель хуже "насыщенной" модели (saturated model), которая идеально подгоняет каждое наблюдение, используя n параметров. Логика та же, что у -2*log-likelihood: маленький deviance - хорошая подгонка.

Overdispersion: самая частая ошибка в Poisson моделях

**Poisson регрессия предполагает Var[Y] = E[Y] = mu.** Реальные счётные данные почти всегда нарушают это. Если конкурирующие риски, скрытая гетерогенность или кластеризация - дисперсия оказывается значительно выше ожидаемой (overdispersion). Диагностика простая: смотреть на Deviance/df или Pearson chi-square/df. Если значительно больше 1 - overdispersion. Два стандартных решения в production: Quasi-Poisson (масштабирует стандартные ошибки на sqrt(phi)) и Negative Binomial GLM (явно моделирует дополнительную дисперсию через параметр r).

**Чем опасен проигнорированный overdispersion**: стандартные ошибки коэффициентов оказываются заниженными, p-values слишком маленькими. Это означает Type I error inflation - модель "видит" значимые эффекты там, где их нет. В кредитном скоринге или A/B тестировании это приводит к неверным бизнес-решениям. Diagnostic: в statsmodels после fit() смотреть `result.pearson_chi2 / result.df_resid`; в sklearn проверять через `PoissonRegressor` vs `mean_tweedie_deviance`.

GLM в production CS: где это живёт прямо сейчас

**GLM в современных production системах** Шесть контекстов, где GLM - стандартное решение или базовый baseline • **Credit Scoring (Logistic GLM)**: Бинарный отклик: одобрить кредит / отказать - Logistic regression остаётся industry standard в банках из-за интерпретируемости (scorecard). sklearn `LogisticRegression`, statsmodels `Logit`. Регуляризация L1/L2 через `C` параметр. • **Insurance Pricing (Gamma/Tweedie GLM)**: Positive continuous: стоимость страхового случая - Gamma GLM для severity (conditional on claim), Poisson для frequency, Tweedie для pure premium. sklearn `GammaRegressor`, `TweedieRegressor`. • **Demand Forecasting (Poisson GLM)**: Счётные данные: заказы, транзакции, клики - Poisson с log link для count data; с offset для rate data (заказы/час). LightGBM и XGBoost поддерживают Poisson loss нативно. • **Click Prediction (Logistic + features)**: Binary outcome с миллионами признаков - CTR prediction в рекламе - logistic regression с L1 (FTRL-Proximal) по сути GLM в online-режиме. Google, Meta используют обобщения этого подхода. • **A/B Тестирование (GLM вместо t-test)**: Правильная модель для нечисловых метрик - Revenue per user right-skewed -> Gamma GLM. Conversion binary -> Logistic GLM. GLM даёт корректный inference там, где t-test предполагает нормальность. • **Network Anomaly Detection (Poisson baseline)**: Счёт пакетов/запросов как Poisson process - Baseline: Poisson GLM для ожидаемого трафика; аномалия = Pearson residual >> 3 sigma. Строится поверх как simple interpretable baseline перед autoencoder.

**Финальный кадр**: scikit-learn начиная с версии 0.23 имеет `PoissonRegressor`, `GammaRegressor`, `TweedieRegressor` в `sklearn.linear_model` - все это GLM. statsmodels `sm.GLM()` даёт полный inference (p-values, deviance, AIC/BIC, residuals). Выбор между ними: sklearn для pipeline и production deployment, statsmodels для exploratory analysis и inference.

Практика: автоматический выбор GLM семейства

Почему обычная линейная регрессия ломается: три типа проблем

**Линейная регрессия предполагает одно главное:** Y ~ N(Xβ, σ²). Отклик Y нормально распределён вокруг линейного предиктора, дисперсия постоянна. Три типа данных нарушают это предположение настольк...

Что является ключевой идеей раздела «Почему обычная линейная регрессия ломается: три типа проблем»?

Три компонента GLM: унифицированный фреймворк

**GLM - это не один метод, а архитектурный паттерн.** Любая GLM-модель состоит из трёх выборов. Выбрать их правильно - значит корректно специфицировать задачу. Эта трёхкомпонентная структура объясн...

Что является ключевой идеей раздела «Три компонента GLM: унифицированный фреймворк»?

Exponential Family: почему именно эти распределения

**Не любое распределение можно использовать в GLM - только exponential family.** Это не произвол, а математически мотивированное ограничение. Exponential family имеет форму p(y; theta) = h(y) * exp...

Что является ключевой идеей раздела «Exponential Family: почему именно эти распределения»?

Тип откликаПроблема с OLSПравильный GLMProduction применение
Binary (0/1)P(Y=1) может быть <0 или >1Logistic (Binomial family)Credit scoring, churn prediction, A/B тест конверсий
Count (0, 1, 2...)Отрицательные предсказания, игнорирует дискретностьPoisson regressionDemand forecasting, багажные жалобы, число кликов
Positive continuousИгнорирует right-skew, предполагает NormalGamma regressionInsurance pricing, время ответа сервиса, LTV
Rate (events/exposure)log(rate) нужен, OLS не обеспечиваетPoisson + offsetСтраховые ставки на 1000 км пробега
Proportion в (0,1)Граничные значения 0 и 1 проблематичныBeta regression (quasi-GLM)Доля рынка, completion rate

КОМПОНЕНТ 1: RANDOM COMPONENT (распределение из exponential family) Y ~ f(y; theta, phi), f принадлежит exponential family E[Y] = mu, Var[Y] = V(mu) * phi КОМПОНЕНТ 2: SYSTEMATIC COMPONENT (линейный предиктор) eta = beta_0 + beta_1*x_1 + ... + beta_p*x_p = X*beta КОМПОНЕНТ 3: LINK FUNCTION g(.) g(mu) = eta <=> mu = g^{-1}(eta) --- Разные GLM = разные choices трёх компонент --- Logistic: Y~Binomial, link=logit, g(mu) = log(mu/(1-mu)) Poisson: Y~Poisson, link=log, g(mu) = log(mu) Gamma: Y~Gamma, link=inverse, g(mu) = 1/mu (или log) OLS: Y~Normal, link=identity, g(mu) = mu <- линейная рег. = GLM! --- Пример: Poisson с log link --- Предсказываем число заказов delivery в час. eta = 0.5 + 0.3*hour + 0.2*weekday = 1.5 (в полдень, рабочий день) mu = exp(eta) = exp(1.5) = 4.48 заказов/час Ключ: mu всегда положительна (log link гарантирует это), даже если eta отрицательна. OLS не даёт такой гарантии.

РаспределениеCanonical linkФункция дисперсии V(mu)Применение в ML/prod
Normalidentity: g(mu)=muV(mu) = 1Непрерывный отклик, baseline
Binomiallogit: g(mu)=log(mu/(1-mu))V(mu) = mu*(1-mu)Binary classification, конверсии
Poissonlog: g(mu)=log(mu)V(mu) = muСчётные данные, rare events
Gammainverse: g(mu)=1/muV(mu) = mu^2Positive skewed: insurance, LTV
Inverse Gaussian1/mu^2: g(mu)=1/mu^2V(mu) = mu^3Extreme right-skew, время до события

Инициализация: mu_0 = y (или умное начальное приближение) На итерации t: 1. Вычислить eta_t = g(mu_t) <- применить link 2. Adjusted dep. var: z_t = eta_t + (y - mu_t) * g'(mu_t) 3. Веса: w_i = 1 / [V(mu_i) * (g'(mu_i))^2] <- из family + link 4. Решить WLS: beta_{t+1} = (X^T W X)^{-1} X^T W z_t 5. Обновить: mu_{t+1} = g^{-1}(X * beta_{t+1}) 6. Повторить до сходимости ||beta_{t+1} - beta_t|| < epsilon --- Пример весов для Logistic regression --- mu_i = 0.7 (предсказанная вероятность) V(mu_i) = mu_i*(1-mu_i) = 0.7*0.3 = 0.21 g'(mu_i) = 1 / (mu_i*(1-mu_i)) = 1/0.21 = 4.76 <- производная logit w_i = 1 / (0.21 * 4.76^2) = 1 / (0.21 * 22.7) = 0.21 Интуиция: объекты около границы решения (mu ~0.5) получают наибольший вес, объекты с большой уверенностью - меньший.

DEVIANCE (общее определение): D = 2 * [log L(saturated) - log L(model)] Для Poisson: D = 2 * sum(y_i * log(y_i/mu_i) - (y_i - mu_i)) Null deviance D_0: модель только с intercept (mu = y_bar для всех) Residual deviance D_1: наша модель с предикторами --- Numeric пример --- D_0 = 520.4 (null model: только среднее) D_1 = 48.7 (наша Poisson модель с двумя предикторами) df_residual = n - p = 500 - 3 = 497 McFadden pseudo-R^2 = 1 - D_1/D_0 = 1 - 48.7/520.4 = 0.906 Deviance/df = 48.7/497 = 0.098 <- хорошо (близко к 1) Если Deviance/df >> 1 (например, 4.7): OVERDISPERSION! --- Сравнение моделей --- Delta_D = D_1 - D_2 ~ chi^2(df_1 - df_2) при H_0: модели одинаковы Это likelihood ratio test для GLM.

Упражнения

  1. В чём принципиальное отличие GLM с log link от запуска OLS на log(Y)? — GLM с log link моделирует log(E[Y]) = Xbeta, то есть ожидание моделируется на исходной шкале через link function OLS на log(Y) моделирует E[log(Y)] = Xbeta - это другая величина; по неравенству Йенсена E[log(Y)] != log(E[Y]) При log-трансформации Y нули в данных требуют ad-hoc поправки (log(Y+1) или drop); GLM с Poisson семейством обрабатывает нули корректно Back-transformation в OLS на log(Y) даёт медиану, не среднее; нужна поправка на смещение (дельта-метод или smearing estimator)
  2. Запустили Poisson регрессию для предсказания числа звонков в call center. Deviance/df = 4.7. Что произошло и что делать? — Deviance/df = 4.7 указывает на overdispersion: реальная дисперсия в ~4.7 раза выше предполагаемой Poisson (где Var = E[Y]) Последствие: стандартные ошибки занижены в sqrt(4.7) ≈ 2.2 раза, p-values ложно маленькие, высокий риск Type I error Решение 1: Quasi-Poisson - масштабирует SE на sqrt(phi); сохраняет те же коэффициенты, корректирует inference Решение 2: Negative Binomial GLM - явно моделирует overdispersion через дополнительный параметр r; лучше если overdispersion структурная В statsmodels: sm.GLM(y, X, family=sm.families.NegativeBinomial()) или quasi-Poisson через scale='X2'
  3. Бинарный outcome: 95% нулей (rare events). Logistic regression подойдёт? Какие альтернативы? — Logistic regression технически применима, но есть нюансы: сепарация (perfect или near-perfect separation) приводит к расходимости MLE Intercept смещается при сильном class imbalance: нужна коррекция Firth penalty или prior-correction King & Zeng (2001) Predicted probabilities обычно занижены для minority class; калибровка через Platt scaling или isotonic regression помогает Альтернативы для rare events: complementary log-log link (cloglog) GLM если события rare в Poisson sense; sample weighting в logistic В sklearn: class_weight='balanced' или sample_weight для Logistic; в statsmodels - explicit prior correction
  4. Нужно ввести offset в Poisson модель для предсказания числа страховых случаев на 1000 км пробега. Зачем и как? — Offset нужен когда моделируется rate (события/exposure), а не просто count. Число ДТП зависит от пробега - нельзя игнорировать exposure Модель: log(E[Y]) = log(exposure) + Xbeta, то есть log(rate) = Xbeta. Offset = log(exposure) фиксируется, не оценивается Без offset: модель перепутает 5 ДТП за 1000 км и 5 ДТП за 100 км как одинаковые наблюдения В statsmodels: sm.GLM(y, X, family=Poisson(), offset=np.log(mileage)).fit() В sklearn PoissonRegressor: нет нативного offset, используют log(mileage) как feature с beta фиксированным в 1 через custom approach

Что унести из урока

  • **GLM = три выбора**: random component (exponential family), systematic component (linear predictor), link function g(mu)=eta. OLS - это GLM с Normal family и identity link
  • **Link function vs Y-трансформация**: GLM с log link моделирует log(E[Y]), не E[log(Y)]. Это фундаментальное различие, влияющее на inference и интерпретацию
  • **IRLS сходится** за 5-10 итераций для большинства задач; квадратичная сходимость как у Newton-Raphson
  • **Deviance вместо R²**: McFadden R² = 1 - D_model/D_null; Deviance/df ~1 - хорошая подгонка, >>1 - overdispersion
  • **Overdispersion - самая частая ловушка** в Poisson моделях: занижает SE и раздувает Type I error; решение - Quasi-Poisson или Negative Binomial
  • **sklearn реализует GLM**: `LogisticRegression`, `PoissonRegressor`, `GammaRegressor`, `TweedieRegressor` в `sklearn.linear_model`; statsmodels для полного inference

Куда дальше

GLM - фреймворк, каждый из частных случаев которого заслуживает отдельного урока. Плюс связи с MLE и hypothesis testing, на которых всё строится.

  • Логистическая регрессия — Binomial GLM с logit link - детально: ROC AUC, calibration, regularization, imbalanced classes
  • Регрессия Пуассона и count data — Poisson GLM детально: zero-inflation, hurdle models, Negative Binomial
  • Линейная регрессия (OLS) — Частный случай GLM: Normal family, identity link - теперь виден в унифицированном контексте
  • Maximum Likelihood Estimation — IRLS - это MLE через Newton-Raphson; понимание MLE объясняет, почему GLM работает
  • Проверка гипотез — Likelihood Ratio Test для сравнения GLM моделей; chi-square тест для deviance

Связанные уроки

  • ml-10-logistic-regression
Generalized Linear Models: когда прямая линия не работает

0

1

Войти