Статистика
Логистическая регрессия: вероятность как прямая линия
Логистическая регрессия могла предотвратить катастрофу 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. Для вероятности это лишено смысла.
Предварительные знания
**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.30 | 1.35 | Каждая тысяча дохода увеличивает шансы одобрения на 35% |
| Прошлые дефолты (+1) | -1.20 | 0.30 | Один прошлый дефолт снижает шансы одобрения на 70% |
| Срок кредита (+1 год) | -0.08 | 0.92 | Каждый дополнительный год срока снижает шансы на 8% |
| Наличие залога (0/1) | +1.50 | 4.48 | Залог увеличивает шансы одобрения в 4.5 раза |
| Возраст (+1 год) | +0.02 | 1.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) / total | Balanced classes | 99% neg -> 99% accuracy при нулевой пользе |
| AUC-ROC | P(score_pos > score_neg) | Общий случай, сравнение моделей | Не учитывает calibration вероятностей |
| PR-AUC | Integral of P-R curve | Severe class imbalance (fraud, rare disease) | Зависит от prevalence класса |
| Log-loss | -mean[y*log(p) + (1-y)*log(1-p)] | Проверка calibration, production monitoring | Чувствителен к extreme probabilities |
| F1-score | 2*P*R / (P+R) | Единое число для imbalanced classification | beta=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
Упражнения
- Датасет: 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 выбирается из этого соотношения.
- Почему 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.
- 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. Без стандартизации сравнение коэффициентов бессмысленно.
- Как устроена 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.