В этом параграфе мы рассмотрим линейные модели — один из краеугольных камней машинного обучения. Несмотря на простоту, они лежат в основе многих более сложных алгоритмов. Это мощный инструмент анализа и интерпретации данных.
Мы начнём с линейной регрессии, изучим её в матричной форме, а также выведем нормальные уравнения, которые позволяют получить аналитическое решение. Затем перейдём к логистической регрессии — модели классификации, которая также основана на линейной гипотезе, но использует вероятностную интерпретацию.
Ключевой частью этого раздела станет регуляризация. Мы подробно разберем, как гребневая (англ. ridge) и лассо-регрессия (англ. lasso) помогают бороться с переобучением и мультиколлинеарностью, и проанализируем их геометрический смысл.
Линейная регрессия в матричном виде
Линейные модели лежат в основе многих алгоритмов машинного обучения. В простейшем случае задача регрессии заключается в том, чтобы аппроксимировать зависимость между входами (признаки) и целевыми значениями при помощи линейной функции:
где:
- — матрица признаков (каждая строка — объект, каждый столбец — признак);
- — вектор весов, который необходимо подобрать;
- — вектор предсказанных значений целевой переменной.
Для настройки параметров мы минимизируем среднеквадратичную ошибку (MSE):
Множитель удобен для дальнейшего дифференцирования. Эта задача имеет чёткую геометрическую интерпретацию: мы ищем такую точку в подпространстве (множество всех линейных комбинаций столбцов матрицы в пространстве размерности ), которая находится на минимальном расстоянии от вектора по евклидовой метрике. То есть — это ортогональная проекция на подпространство, натянутое на столбцы матрицы .
Из линейной алгебры известно, что проекция вектора на подпространство задаётся таким , для которого вектор ошибки ортогонален подпространству. Это означает, что вектор ошибок ортогонален признаковому пространству — их скалярное произведение равно нулю:
Это условие называется нормальными уравнениями, и оно описывает необходимое условие экстремума для задачи наименьших квадратов. Оно также возникает напрямую при взятии градиента от функции потерь:
Чтобы найти минимум этой функции, нужно приравнять градиент к нулю. Попробуем расписать подробнее произведение внутри скобок с учётом свойств транспонированных матриц:
Теперь мы можем найти градиент от для каждого слагаемого:
- , так как не зависит от .
Следовательно:
Приравнивая градиент к нулю, получаем:
Это и есть нормальные уравнения — система линейных уравнений относительно . Если матрица невырождена (то есть обратима), то решение имеет аналитический вид:
Это решение интуитивно понятно: оно минимизирует евклидову ошибку между предсказанием и истинными значениями , находя проекцию на пространство столбцов . Мы касались этого в одном из предыдущих разделов. Ниже представлена уже знакомая вам иллюстрация геометрического смысла МНК — проекция вектора целевой переменной на пространство столбцов матрицы признаков.
Иллюстрация геометрического смысла МНК. Расстояние — это не что иное как ошибка
Однако здесь же возникает и важный вопрос устойчивости: если признаки скоррелированы или плохо масштабированы, то может оказаться плохо обусловленной или даже сингулярной. Мы ещё вернёмся к этому в разделе про регуляризацию и препроцессинг.
Реализация в Python
Воспользуемся библиотекой scikit-learn:
1import numpy as np
2from sklearn.linear_model import LinearRegression
3
4# Данные
5np.random.seed(42)
6m = 30 # Количество объектов
7X = 2 * np.random.rand(m, 1)
8y = 3 * X[:, 0] + 2 + np.random.randn(m) * 0.5 # Линейная зависимость + шум
9
10# Обучение линейной регрессии
11model = LinearRegression()
12model.fit(X, y)
13
14# Предсказания
15X_grid = np.linspace(0, 2, 100).reshape(-1, 1)
16y_pred = model.predict(X_grid)
17
18# Извлечение параметров регрессионной прямой
19intercept = model.intercept_
20coef = model.coef_
21
22(intercept, coef[0]) # Свободный член и коэффициент наклона
Логистическая регрессия
В задачах классификации чаще применяется логистическая регрессия. Она сохраняет линейную зависимость прогноза от признаков, но предсказывает не класс, а вероятность принадлежности к положительному классу:
Здесь — сигмоидальная функция активации, обеспечивающая значения на выходе от до . График ниже иллюстрирует, как сигмоида превращает линейное предсказание в вероятность принадлежности к классу . Центральная точка соответствует границе между классами.
Сигмоида
Таким образом, логистическая регрессия позволяет интерпретировать линейное предсказание как логарифм отношения правдоподобий двух классов:
Это делает логистическую регрессию дискриминативной вероятностной моделью — она напрямую моделирует и аппроксимирует логарифм отношения правдоподобий двух классов.
Геометрически логистическая регрессия ищет гиперплоскость, разделяющую пространство признаков на области, где вероятность принадлежности к каждому из классов превышает 0.5. В двумерном случае эта гиперплоскость превращается в прямую, а значение соответствует границе принятия решения. На рисунке ниже показано, как модель оценивает вероятности для каждого региона и как эта граница проходит между классами.
Гиперплоскость — это граница, где . Чем дальше точка от границы, тем ближе вероятность к или
Функция потерь в логистической регрессии — это логарифмическая функция правдоподобия (log-loss):
В отличие от линейной регрессии, здесь нет аналитического решения. Оптимальное значение параметров ищется итеративно — с помощью градиентного спуска.
Эта функция потерь штрафует модель сильнее, когда уверенное предсказание оказывается неверным, и почти не штрафует, если высокая уверенность соответствует правильному ответу. На графике ниже показано, как log-loss меняется в зависимости от линейного отклика для случаев (красная линия) и (синяя линия).
Логарифмическая функция потерь сильно штрафует ошибки, особенно если модель уверена, но ошибается. Это делает обучение логистической регрессии чувствительным к уверенности в предсказаниях
Логистическая регрессия особенно интересна тем, что, несмотря на простоту, она демонстрирует высокую эффективность и полную математическую прозрачность в задачах бинарной классификации. Более того, она легко обобщается на многоклассовый случай (через softmax — функцию, обобщающую сигмоиду для многоклассового случая) и формирует фундамент для многих других моделей, включая нейросети.
Реализация в Python
Реализуем логистическую регрессию с помощью библиотеки scikit-learn:
1from sklearn.linear_model import LogisticRegression
2
3# Генерация данных для бинарной классификации
4np.random.seed(1)
5n = 100
6X_class0 = np.random.randn(n // 2, 2) + [1, 1]
7X_class1 = np.random.randn(n // 2, 2) + [4, 4]
8X = np.vstack((X_class0, X_class1))
9y = np.array([0] * (n // 2) + [1] * (n // 2))
10
11# Обучение логистической регрессии
12log_reg = LogisticRegression()
13log_reg.fit(X, y)
14
15# Выводим предсказания классов и вероятностей для первых 5 точек
16predicted_classes = log_reg.predict(X[:5])
17predicted_probs = log_reg.predict_proba(X[:5])
В линейной и логистической регрессии мы видим одну общую структуру: модель линейна по параметрам, и от её устойчивости и обобщающей способности напрямую зависит качество предсказаний. В следующем разделе мы рассмотрим, как добавление регуляризации позволяет улучшить поведение модели, особенно в условиях переобучения, мультиколлинеарности и плохой обусловленности матрицы .
Гребневая и лассо-регуляризация как ограничения на нормы весов
Регуляризация — это один из ключевых приёмов для борьбы с переобучением и улучшения устойчивости линейных моделей.
Как мы уже видели, решение задачи линейной регрессии через нормальные уравнения включает в себя обращение матрицы . Однако если признаки скоррелированы или в разных масштабах, эта матрица может быть плохо обусловленной или даже вырожденной. В таких случаях модель становится чувствительной к шуму в данных и плохо обобщается на новых примерах.
Регуляризация позволяет справиться с этими проблемами, добавляя штраф за избыточную сложность модели. Это означает введение дополнительного слагаемого в функцию потерь, которое зависит от нормы вектора весов . Два наиболее популярных вида регуляризации — гребневая (Ridge) и лассо (Lasso) — отличаются типом нормы, которую они используют.
Гребневая регрессия (Ridge)
В гребневой регрессии к исходной функции потерь MSE добавляется штраф на квадрат евклидовой нормы весов (-норма):
Здесь — гиперпараметр регуляризации, который контролирует баланс между точностью на обучающей выборке и «простотой» модели:
- при мы возвращаемся к обычной линейной регрессии;
- при больших значениях веса стремятся к нулю.
Это можно интерпретировать двумя способами.
Способ №1 — с точки зрения требований к модели. Мы полагаем, что «хорошая» модель не должна иметь слишком большие значения коэффициентов , и наказываем отклонения от этой гипотезы.
Пример
Допустим, у нас есть модель с одним признаком . Если , то при изменении на единицу прогноз изменится на . Это умеренно. Но если , то то же самое изменение приведёт к скачку прогноза на !
А если — это, например, рост человека в метрах, и он изменился с до , то модель с выдаст рост прогноза на , что совершенно неадекватно.
Поэтому регуляризация ограничивает рост весов и заставляет модель вести себя более сдержанно: не реагировать бурно на незначительные флуктуации входа.
Способ №2 — С точки зрения устойчивости: регуляризация стабилизирует обращение , добавляя к нему диагональный сдвиг .
Оптимальное значение параметров в гребневой регрессии можно получить аналитически:
Такое решение всегда существует даже тогда, когда вырождена, так как матрица в скобках положительно определена. При этом, в отличие от обычной линейной регрессии, веса не обязательно обеспечивают точную ортогональную проекцию на пространство столбцов — проекция становится сдвинутой в сторону меньших весов.
Лассо-регрессия (Lasso)
В лассо-регрессии вместо квадрата нормы применяется сумма модулей весов, то есть -норма:
\mathcal{L}{\mathrm{lasso}}(w) = \frac{1}{2} |Xw - y|^2 + \lambda |w|1 = \frac{1}{2} \sum^{m} (x_i^\top w - y_i)^2 + \lambda \sum^{n} |w_j|
Такой вид регуляризации поощряет разрежённость весов: при достаточно большом многие компоненты становятся точно нулевыми. Это делает лассо особенно полезным, когда мы хотим не просто построить модель, но и отобрать важные признаки.
Однако в отличие от гребневой регрессии, для лассо не существует аналитического решения — задача становится выпуклой, но негладкой (из-за негладкости функции модуля).
Геометрическая интерпретация
Гребневую и лассо-регрессии можно наглядно сравнить с помощью их регуляризационных ограничений.
- В гребневой мы ограничиваем в -норме: множество допустимых решений представляет собой гиперсферу (2D — окружность, в 3D — сфера).
- В лассо ограничиваем в -норме: множество решений — ромбообразное тело (в 2D — ромб, в 3D — октаэдр).
На рисунке ниже показана геометрическая интерпретация регуляризации.
- Слева (гребневая): ограничение на веса задаётся -нормой: (на рисунке для примера ) — красная окружность.
- Справа (лассо): ограничение на веса задаётся -нормой: (на рисунке ) — зелёный ромб.
Линии уровня MSE представляют собой эллипсы, так как MSE — это квадратичная функция. В точке касания с наименьшей линией уровня и границы допустимых весов находится решение.
Геометрическая интерпретация регуляризации.
В результате оптимум в случае лассо при малых значениях весов чаще оказывается на границе, где некоторые координаты обнуляются — то есть в углах ромба. Поскольку градиенты функции потерь (MSE) направлены к центру, модель выберет в качестве оптимума первый же внешний эллипс, коснувшийся линии ограничения на норму весов.
Часто именно острые углы ромба, расположенные на осях координат, перехватывают градиенты — и оптимум «прилипает» к ним. Поэтому зануление весов происходит естественным образом.
В случае гребневой регрессии область ограничений — круг, у которого нет геометрически выделенных направлений: граница гладкая и симметричная. В результате точка касания линии уровня и области допустимых значений почти никогда не совпадают с осями. Все компоненты остаются ненулевыми, но становятся малыми, распределёнными в направлении градиента.
Существует также гибридный подход — `Elastic Net`, который комбинирует оба штрафа:
Он наследует свойства обоих методов: устойчивость гребневой регрессии и разрежённость лассо.
В линейных моделях регуляризация выступает как средство контроля сложности: она не только уменьшает переобучение, но и улучшает интерпретируемость, снижает чувствительность к шуму, делает решение устойчивым даже при мультиколлинеарности признаков.
Реализация в Python
Ниже — пример регуляризации, реализованный с помощью библиотеки scikit-learn:
1import numpy as np
2from sklearn.linear_model import Ridge, Lasso, ElasticNet
3from sklearn.preprocessing import StandardScaler
4
5# Синтетические данные
6np.random.seed(42)
7n_samples, n_features = 100, 10
8X = np.random.randn(n_samples, n_features)
9true_w = np.array([5, -3, 0, 0, 2, 0, 0, 0, 0, 1])
10y = X @ true_w + np.random.randn(n_samples) * 0.5
11
12# Масштабирование признаков
13scaler = StandardScaler()
14X_scaled = scaler.fit_transform(X)
15
16# Ridge-регрессия
17ridge = Ridge(alpha=1.0) # Обозначение модели
18ridge.fit(X_scaled, y) # Обучение модели
19y_ridge_pred = ridge.predict(X_scaled) # Предсказание
20
21# Lasso-регрессия
22lasso = Lasso(alpha=0.1)
23lasso.fit(X_scaled, y)
24y_lasso_pred = lasso.predict(X_scaled)
25
26# Elastic Net
27elastic = ElasticNet(alpha=0.1, l1_ratio=0.5)
28elastic.fit(X_scaled, y)
29y_elastic_pred = elastic.predict(X_scaled)
Итак, мы увидели, что линейные и логистические регрессии дают интерпретируемые решения, а регуляризация контролирует сложность и повышает устойчивость модели.
Однако, когда классы неразделимы линейно или граница сложной формы, возможностей линейной гиперплоскости недостаточно. В следующем параграфе мы перейдём к методу опорных векторов (SVM) — линейному по параметрам, но способному строить максимальный зазор и при помощи ядрового трюка формировать нелинейные разделяющие поверхности в исходном пространстве признаков.
