Статистика

Логистическая регрессия: вероятность как прямая линия

Логистическая регрессия могла предотвратить катастрофу Challenger в 1986 году: полные данные по 23 запускам давали P(отказ) > 0.99 при -2C. Инструмент существовал. Сегодня этот же инструмент лежит в основе кредитного скоринга, spam-фильтров и медицинской диагностики.

  • Кредитный скоринг: FICO, банки по всему миру используют logistic regression baseline
  • Spam-фильтры: Gmail logistic regression на 100+ features как первый слой
  • CTR prediction: Facebook Ads LR на миллиардах примеров в реальном времени
  • Медицинская диагностика: вероятность заболевания по биомаркерам
  • A/B тесты: logistic regression для conversion rate с covariate adjustment
  • Sklearn LogisticRegression: 5 solver'ов, L1/L2/ElasticNet regularization из коробки

**1986 год. Мыс Канаверал. -2°C.** Challenger взрывается через 73 секунды после старта. Гибнут 7 астронавтов. Президентская комиссия установит потом: за ночь до запуска инженеры Morton Thiokol имели данные о поведении уплотнительных колец O-rings при разных температурах. Они построили scatter plot - но только по полётам с инцидентами. Дополнительные данные, где отказов не было, в анализ не вошли. Если бы они применили логистическую регрессию P(отказ | температура) ко ВСЕМ 23 запускам - S-кривая показала бы P > 0.99 при -2°C. Инструмент существовал. Просто никто не взялся его применить. **Логистическая регрессия могла спасти 7 жизней.**

**Что этот урок даёт на самом деле**: не ещё одну формулу классификации, а понимание того, почему бинарный исход требует отдельного аппарата - и как logit-link элегантно решает задачу, которую OLS решить не может. После урока в голове появится карта: logit → odds ratio → MLE → ROC/AUC → регуляризация. Это фундамент, на котором держится вся индустрия credit scoring, spam filtering, medical diagnostics и CTR prediction.

Проблема: почему OLS не работает для вероятностей

Классическая **линейная регрессия (OLS)** оптимизирована для непрерывного отклика Y ∈ (-∞, +∞). Когда Y бинарный - 0 или 1 - возникает фундаментальное противоречие. Модель Ŷ = Xβ может предсказать любое вещественное число, в том числе отрицательное или больше 1. Для вероятности это лишено смысла.

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

  • Linear Regression
  • Generalized Linear Models: When the Line Won't Do

**LPM (Linear Probability Model)** иногда используется в эконометрике именно как OLS на бинарном Y - для интерпретируемости при небольших эффектах в середине диапазона. Но это осознанный trade-off, а не рекомендация. При P близких к 0 или 1 - LPM даёт предсказания за пределами [0,1] и обладает структурно некорректными доверительными интервалами.

Logit link: элегантное решение

Нужна функция-связка (link function), которая отображает линейный предиктор (-∞, +∞) в вероятность (0, 1). **Логистическая функция (sigmoid)** σ(z) = 1/(1+e^(-z)) делает именно это: монотонно возрастает, ограничена строго между 0 и 1, симметрична относительно 0.5. Её обратная функция - **logit** - переводит вероятность в log-odds, которые уже лежат на всей вещественной прямой.

**Интуиция для sigmoid**: при z = 0 - модель ничего не знает (p = 0.5). Чем больше |z|, тем увереннее предсказание. При z = +4.6 - p ≈ 0.99 (почти уверен в классе 1). При z = -4.6 - p ≈ 0.01. В logistic regression gradient descent двигает веса так, чтобы sigmoid-выходы для правильных классов становились ближе к 1 и 0.

Интерпретация коэффициентов через Odds Ratios

Коэффициент β_j в логистической регрессии означает: при увеличении x_j на 1 единицу (остальные фиксированы) - log-odds меняется на β_j. Это не интуитивно. Более естественная интерпретация - через **Odds Ratio (OR)**: exp(β_j) показывает, во сколько раз умножаются шансы на единицу изменения предиктора.

**OR != Relative Risk (RR).** Odds Ratio всегда дальше от 1, чем Relative Risk, и при частых событиях (p > 0.10) разница существенна. Классическая ошибка в медицинских публикациях: интерпретировать OR как RR. Пример: OR = 3.0 при baseline p = 0.5 означает RR = 1.5, не 3.0. Доверительный интервал для OR через delta method или bootstrap - стандарт в clinical reporting.

MLE и binary cross-entropy: одна функция под двумя именами

Логистическая регрессия оценивает параметры через **максимальное правдоподобие (MLE)**. Правдоподобие для бинарных данных - произведение p_i^y_i * (1-p_i)^(1-y_i) по всем наблюдениям. Log-правдоподобие записывается как сумма, и именно эту сумму максимизируют. Взятая с минусом, она совпадает с **binary cross-entropy** - той же функцией потерь, что минимизируют нейронные сети при классификации.

**Связь с нейросетями**: sklearn LogisticRegression использует LBFGS (quasi-Newton). PyTorch/JAX - SGD или Adam. Для n < 10K объектов LBFGS сходится быстрее и точнее. При n > 100K - SGD с mini-batch работает лучше из-за памяти. Это та же причина, по которой фреймворки глубокого обучения используют Adam, а не L-BFGS.

Оценка качества: за пределами accuracy

**Accuracy** - самая вводящая в заблуждение метрика при **class imbalance**. Если 99% примеров negative (fraud detection: 99% транзакций - честные), модель которая предсказывает всегда 0 даёт 99% accuracy и 0% пользы. Правильные инструменты оценки строятся на confusion matrix и вероятностных threshold.

**Calibration vs Discrimination.** AUC-ROC измеряет ranking ability (discrimination) - умение ранжировать positive выше negative. Calibration - насколько p=0.7 действительно означает 70% шанс. Модели могут иметь высокий AUC но плохую calibration (нейросети печально известны этим). Platt scaling и isotonic regression - два классических метода пост-обучения для calibration. В credit scoring calibration критична: p=0.15 означает 15% реальный дефолт.

Регуляризация: Ridge (L2) и Lasso (L1)

Без регуляризации логистическая регрессия склонна к overfitting при большом числе features - особенно при мультиколлинеарности. В sklearn параметр **C = 1/λ**: чем меньше C, тем сильнее штраф за большие коэффициенты. По умолчанию C=1.0 (умеренная L2-регуляризация). Выбор типа регуляризации определяет поведение модели при sparse data.

**В production** почти всегда нужна регуляризация. Особенно при: 1. n < 1000 и много features 2. high-cardinality categorical features после one-hot 3. NLP features (vocabulary size >> n). Пример: spam filter с 50K word features и 10K emails - без L1 регуляризации модель переобучится и половина коэффициентов будет статистически ненадёжной.

Где логистическая регрессия живёт прямо сейчас

**Логистическая регрессия в production (2026)** Несмотря на бум нейросетей - логистическая регрессия остаётся ядром множества критических production систем из-за интерпретируемости, скорости и регуляторных требований • **Credit scoring (FICO, банки)**: Предсказание P(дефолт) по финансовой истории заявителя - Регуляторы (Basel III, GDPR) требуют объяснимости. Odds ratios - единственный способ объяснить клиенту отказ. В США Fair Credit Reporting Act прямо требует human-readable reasons. • **Spam detection (Gmail baseline)**: P(spam | features) по header + body features - Первое поколение Gmail spam filter - логистическая регрессия с L1 на bag-of-words. До сих пор используется как fast baseline и interpretability layer поверх BERT-based систем. • **Medical diagnosis (FDA-cleared models)**: P(рак | imaging features) или P(сепсис | vital signs) - Большинство FDA-cleared AI-моделей в диагностике - интерпретируемые модели (LR, decision trees), а не black-box нейросети. SOFA score в реанимациях - weighted logistic regression. • **Ad CTR prediction (feature engineering layer)**: P(click | user, ad, context) в real-time bidding - Google, Meta - LR over billions of binary features с L1-regularization. Нейросети добавляются поверх LR как deep component в DLRM архитектуре, но LR остаётся memorization layer. • **Churn prediction (SaaS)**: P(отписка | usage patterns) по пользовательским метрикам - Salesforce Einstein, HubSpot - LR с feature importance для Customer Success teams. OR для каждого feature объясняет команде почему конкретный клиент в зоне риска. • **A/B тесты с binary outcome**: Анализ conversion rate с контролем covariates - Logistic regression с treatment как predictor - правильный способ A/B анализа при бинарном исходе (вместо chi-square). CUPED для variance reduction - расширение той же идеи.

**Финальный кадр**: в 2026 году, когда каждый стартап добавляет LLM, 95% продакшн-решений по бинарной классификации в regulated industries - это по-прежнему логистическая регрессия. Не потому что нейросети хуже, а потому что регуляторы требуют объяснить каждое решение. OR = 0.30 для 'has_default' объясняет клиенту отказ в кредите. 128-слойный трансформер - нет.

Практика: катастрофа Challenger на реальных данных

Проблема: почему OLS не работает для вероятностей

Классическая **линейная регрессия (OLS)** оптимизирована для непрерывного отклика Y ∈ (-∞, +∞). Когда Y бинарный - 0 или 1 - возникает фундаментальное противоречие. Модель Ŷ = Xβ может предсказать ...

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

Logit link: элегантное решение

Нужна функция-связка (link function), которая отображает линейный предиктор (-∞, +∞) в вероятность (0, 1). **Логистическая функция (sigmoid)** σ(z) = 1/(1+e^(-z)) делает именно это: монотонно возра...

Что является ключевой идеей раздела «Logit link: элегантное решение»?

Интерпретация коэффициентов через Odds Ratios

Коэффициент β_j в логистической регрессии означает: при увеличении x_j на 1 единицу (остальные фиксированы) - log-odds меняется на β_j. Это не интуитивно. Более естественная интерпретация - через *...

Что является ключевой идеей раздела «Интерпретация коэффициентов через Odds Ratios»?

Задача: предсказать P(одобрение кредита) по возрасту заявителя. Обучили OLS на данных банка: P(кредит | возраст) = -0.005 * возраст + 0.80 Предсказания: возраст = 25 лет -> P = -0.005*25 + 0.80 = 0.675 OK возраст = 55 лет -> P = -0.005*55 + 0.80 = 0.525 OK возраст = 5 лет -> P = -0.005*5 + 0.80 = 0.775 OK (но 5-летний за кредитом?) возраст = 80 лет -> P = -0.005*80 + 0.80 = 0.400 OK возраст = 200 лет -> P = -0.005*200 + 0.80 = -0.20 !!! При достаточно большом или малом X - вероятность выходит за [0, 1]. Ошибки 2-го рода: гетероскедастичность (Var(Y) = p(1-p) зависит от X), нарушение нормальности остатков. OLS для бинарного Y - broken by design.

Odds (шансы) - отношение вероятности успеха к вероятности неудачи: odds = p / (1 - p) Logit - натуральный логарифм odds: logit(p) = log(p / (1-p)) Sigmoid - обратное преобразование из logit в p: sigma(z) = 1 / (1 + e^(-z)) Примеры: p = 0.01 -> odds = 0.0101 -> logit = -4.60 p = 0.25 -> odds = 0.333 -> logit = -1.099 p = 0.50 -> odds = 1.000 -> logit = 0.000 p = 0.75 -> odds = 3.000 -> logit = +1.099 p = 0.99 -> odds = 99.0 -> logit = +4.605 Модель логистической регрессии: log(p_i / (1-p_i)) = beta_0 + beta_1*x_1 + ... + beta_k*x_k эквивалентно: p_i = sigma(beta_0 + beta_1*x_1 + ... + beta_k*x_k) = 1 / (1 + exp(-(beta_0 + beta_1*x_1 + ... + beta_k*x_k))) На уровне log-odds модель линейна - это и есть GLM с logit link.

FeatureКоэффициент βOdds Ratio exp(β)Интерпретация
Доход (+1 тыс. руб.)+0.301.35Каждая тысяча дохода увеличивает шансы одобрения на 35%
Прошлые дефолты (+1)-1.200.30Один прошлый дефолт снижает шансы одобрения на 70%
Срок кредита (+1 год)-0.080.92Каждый дополнительный год срока снижает шансы на 8%
Наличие залога (0/1)+1.504.48Залог увеличивает шансы одобрения в 4.5 раза
Возраст (+1 год)+0.021.02Каждый год возраста добавляет 2% к шансам (слабый эффект)

Log-likelihood логистической регрессии: l(beta) = sum_i [ y_i * log(p_i) + (1 - y_i) * log(1 - p_i) ] где p_i = sigma(X_i @ beta) Binary Cross-Entropy (BCE) в PyTorch/TensorFlow: BCE = -1/n * sum_i [ y_i * log(p_i) + (1 - y_i) * log(1 - p_i) ] Разница только в знаке и нормировке на n: l(beta) = -n * BCE Максимизировать log-likelihood = минимизировать BCE. PyTorch's BCEWithLogitsLoss делает именно это - и одновременно обеспечивает численную стабильность (sigmoid + log объединены через log-sum-exp trick). Важное следствие: нейросеть с sigmoid на выходе и BCE loss при линейном слое - это в точности логистическая регрессия. GLM и нейронные сети - одна семья.

Confusion matrix для threshold t: Predict 1 if p >= t, else 0 Actual 0 Actual 1 Pred 0: TN FN Pred 1: FP TP TPR (Recall/Sensitivity) = TP / (TP + FN) - из всех реальных 1, сколько поймали FPR (Fall-out) = FP / (FP + TN) - из всех реальных 0, сколько зря назвали 1 ROC-кривая: TPR(t) vs FPR(t) для всех t in [0,1] AUC-ROC = P(score(pos) > score(neg)) = вероятность что модель даст более высокий score случайному positive примеру, чем случайному negative Числовой пример: Две модели: AUC_A = 0.72, AUC_B = 0.91 Модель B: при случайной паре (fraud, честная) - в 91% случаев правильно ставит fraud выше честной. AUC-PR (Precision-Recall) - лучше при severe imbalance: Precision = TP / (TP + FP) - из предсказанных 1, сколько правда 1 Recall = TP / (TP + FN) PR-AUC = mean precision при разных recall levels

МетрикаФормулаКогда использоватьГлавный питфолл
Accuracy(TP+TN) / totalBalanced classes99% neg -> 99% accuracy при нулевой пользе
AUC-ROCP(score_pos > score_neg)Общий случай, сравнение моделейНе учитывает calibration вероятностей
PR-AUCIntegral of P-R curveSevere class imbalance (fraud, rare disease)Зависит от prevalence класса
Log-loss-mean[y*log(p) + (1-y)*log(1-p)]Проверка calibration, production monitoringЧувствителен к extreme probabilities
F1-score2*P*R / (P+R)Единое число для imbalanced classificationbeta=1 не всегда правильный trade-off

Penalized log-likelihood: L2 (Ridge): maximize l(beta) - lambda * sum(beta_j^2) L1 (Lasso): maximize l(beta) - lambda * sum(|beta_j|) L2 (sklearn: penalty='l2', C=...) - Ridge: - Сжимает все коэффициенты к нулю, но не обнуляет - Хорошо при мультиколлинеарности (выбирает все коррелированные features) - Аналитически дифференцируема - лучше для LBFGS L1 (sklearn: penalty='l1', solver='saga') - Lasso: - Обнуляет коэффициенты нерелевантных features - Автоматический feature selection - Лучше при sparse data: NLP bag-of-words, ad click logs Elastic Net (penalty='elasticnet', l1_ratio=0.5): - Комбинация: lambda1*|beta| + lambda2*beta^2 - Выбирает среди коррелированных групп AND обнуляет лишние Практика: C=10: слабая регуляризация, trust data C=1.0: дефолт, умеренный C=0.1: сильная, при overfitting или малом n C=0.01: очень сильная, когда features >> n

Упражнения

  1. Датасет: 99.5% транзакций - честные, 0.5% - мошенничество. Модель предсказывает всегда 0. Accuracy = 99.5%. Заказчик говорит: 'Отличный результат!' Как объяснить проблему и какие метрики использовать? — Accuracy при severe imbalance - directly high для degenerate модели. 99.5% accuracy = 0% recall для fraud. Бесполезно. Precision = TP/(TP+FP) = 0/0 (undefined при 0 predicted positives). Recall = TP/(TP+FN) = 0. F1 = 0. ROC-AUC тоже может вводить в заблуждение при severe imbalance - большой TN pool раздувает знаменатель FPR. Правильные метрики: PR-AUC (нечувствителен к prevalence в том же смысле), Precision@k, Average Precision, или бизнес-метрики: cost matrix с реальными ценами FP/FN. Практика: в fraud detection FN стоит дорого (пропустили мошенника), FP умеренно (заблокировали честного). Cost-sensitive threshold выбирается из этого соотношения.
  2. Почему binary cross-entropy в нейросетях математически совпадает с log-likelihood логистической регрессии? Что это говорит об архитектуре нейросети с sigmoid на выходе? — BCE = -1/n * sum[y*log(p) + (1-y)*log(1-p)]. Log-likelihood = sum[y*log(p) + (1-y)*log(1-p)]. BCE = -1/n * log-likelihood. Минимизация BCE = максимизация log-likelihood. Нейросеть с одним линейным слоем + sigmoid + BCE loss - это в точности логистическая регрессия. SGD на ней сойдётся к тому же решению, что LBFGS в sklearn (с достаточно малым lr и достаточным количеством эпох). Добавление hidden layers с нелинейными активациями позволяет нейросети выучить нелинейные decision boundaries. Логистическая регрессия ограничена линейным в пространстве feature - поэтому deep learning это обобщение, а не замена. Следствие для практики: если нейросеть не сходится лучше logistic regression - задача, возможно, линейно разделима, и усложнение архитектуры только добавляет variance.
  3. Feature 'доход' после StandardScaler имеет коэффициент beta = 0.8. Как правильно интерпретировать этот коэффициент? Что изменится в интерпретации по сравнению с нестандартизированным вариантом? — После StandardScaler единица изменения x_std = 1 соответствует одному стандартному отклонению исходного feature. Beta = 0.8 означает: рост дохода на 1 стандартное отклонение увеличивает log-odds на 0.8, OR = exp(0.8) = 2.23. В исходных единицах: beta_original = beta_std / std(x). Если std(доход) = 50 тыс. руб., то beta_original = 0.8/50000 = 0.000016 за рубль. Стандартизация нужна для сравнения важности features между собой (comparable scale) и для регуляризации (без неё features с большим std доминируют в L2 penalty). После стандартизации |beta_j| прямо сравним между features как мера относительной важности - это похоже на standardized coefficients в OLS. Без стандартизации сравнение коэффициентов бессмысленно.
  4. Как устроена multinomial логистическая регрессия для K > 2 классов? Чем отличаются стратегии softmax (multinomial) и One-vs-Rest (OvR)? — Softmax (multinomial): P(y=k|x) = exp(x @ beta_k) / sum_j exp(x @ beta_j). Одна модель, K наборов коэффициентов. Сумма вероятностей по классам = 1. Эквивалентно K-1 свободным параметрам (один класс reference). One-vs-Rest (OvR): K независимых бинарных логистических регрессий, каждая обучена '1 класс vs все остальные'. Вероятности из K моделей не суммируются в 1 - нужна нормировка или isotonic calibration. Когда использовать softmax: классы взаимоисключающи (MNIST - цифра одна из 10), данных достаточно. OvR: классы могут быть нонексклюзивны (multi-label), или нужна простота implementation. sklearn multi_class='multinomial' + solver='lbfgs' - правильный способ для softmax. multi_class='ovr' - K независимых LR. При K=2 оба эквивалентны. В нейросетях softmax + cross-entropy = multinomial logistic regression с нелинейными features. Последний слой трансформера перед softmax - это ровно это.

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

  • **OLS сломан для бинарного Y**: выдаёт вероятности за пределами [0,1] и нарушает гомоскедастичность. Logit link решает это элегантно.
  • **Logit = log(odds)**: логистическая регрессия линейна в пространстве log-odds, нелинейна в пространстве вероятностей. Ключевое уравнение: p = sigmoid(X @ beta).
  • **Odds Ratio = exp(beta_j)**: при росте x_j на 1 единицу шансы умножаются на OR. OR < 1 снижает шансы, OR > 1 увеличивает. Главный инструмент интерпретации в medical statistics и credit scoring.
  • **Binary cross-entropy = -log-likelihood**: нейросеть с sigmoid + BCE loss - это логистическая регрессия. Глубина добавляет нелинейность feature representation, не меняет loss structure.
  • **Accuracy бесполезна при imbalance**: использовать AUC-ROC (ranking quality), PR-AUC (precision-recall при severe imbalance), calibrated probabilities для risk scoring.
  • **C = 1/lambda**: регуляризация обязательна в production. L2 сжимает все коэффициенты, L1 обнуляет нерелевантные - автоматический feature selection при sparse data.
  • **Challenger (1986)**: данные были. Инструмент существовал. Правильный анализ на полных данных предсказал бы P(failure) > 0.99. Статистика - не абстракция, а engineering discipline с реальными ставками.

Связи с другими темами

Логистическая регрессия - пересечение GLM, теории принятия решений, оптимизации и modern ML. Эти связи объясняют почему модель 1958 года остаётся актуальной в 2026.

  • GLM framework (stat-37) — Логистическая регрессия - частный случай GLM с Bernoulli distribution и logit link. Понимание GLM открывает Poisson regression, Gamma regression и их production применения.
  • Проверка гипотез для коэффициентов (stat-05) — Wald test для H0: beta_j = 0, Likelihood Ratio Test для сравнения моделей, z-scores для significance коэффициентов. Те же идеи что в OLS, другое распределение.
  • Выбор модели: AIC/BIC (stat-41) — Как выбирать между LR с разными наборами features? AIC = -2*log-likelihood + 2k, BIC = -2*log-likelihood + k*log(n). Parsimony principle в действии.
  • Cross-validation (stat-42) — Оценка AUC через k-fold CV - стандартный pipeline. Nested CV для hyperparameter (C) tuning без data leakage.
  • Multiple testing при многих features (stat-19) — При 1000 features p-value без поправки Bonferroni / FDR даёт ложные значимые коэффициенты. LASSO регуляризация - альтернативный подход к sparse feature selection.

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

  • ml-10-logistic-regression
Логистическая регрессия: вероятность как прямая линия

0

1

Войти