Линейная регрессия: математическая основа машинного обучения, Python-код

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

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

    Линейная регрессия — фундаментальная модель машинного обучения, которая при всей своей математической простоте обладает удивительной мощью для решения реальных задач. От прогнозирования цен на недвижимость до анализа биомедицинских данных — этот алгоритм становится отправной точкой для понимания более сложных моделей. Разберем не только теоретический базис и математический аппарат, но и покажем, как реализовать линейную регрессию на Python с нуля и с использованием популярных библиотек. 🔍 Готовы погрузиться в мир коэффициентов, градиентного спуска и метрических пространств?

Хотите освоить линейную регрессию и другие методы анализа данных на практике? Программа Профессия аналитик данных от Skypro погружает вас в реальные проекты с первого месяца обучения. Вы научитесь не просто писать код моделей, но и интерпретировать результаты, оптимизировать алгоритмы и применять аналитические методы для принятия бизнес-решений. Более 87% выпускников находят работу в течение 3 месяцев после окончания курса!

Сущность линейной регрессии в машинном обучении

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

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

Михаил Пронин, руководитель отдела аналитики

Однажды нашей команде поступил, казалось бы, простой запрос: спрогнозировать объемы продаж новой линейки товаров. Многие сразу предложили использовать сложные модели — нейронные сети, градиентный бустинг. Я предложил начать с линейной регрессии.

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

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

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

Основные преимущества линейной регрессии:

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

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

Характеристика Простая линейная регрессия Множественная линейная регрессия
Количество признаков Один признак Множество признаков
Математическая формула y = β₀ + β₁x + ε y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε
Геометрическая интерпретация Прямая линия Гиперплоскость в n-мерном пространстве
Сложность интерпретации Очень простая Умеренная
Вычислительная сложность O(n) O(n²p) или O(np²), где p — количество признаков
Пошаговый план для смены профессии

Математический аппарат и формулы линейной регрессии

Математическая формулировка линейной регрессии начинается с определения линейного уравнения, которое связывает входные и выходные переменные. Для простой линейной регрессии (с одним признаком) формула имеет вид:

y = β₀ + β₁x + ε

где:

  • y — зависимая (целевая) переменная;
  • x — независимая переменная (признак);
  • β₀ — свободный член (смещение, или bias);
  • β₁ — коэффициент наклона (вес признака);
  • ε — случайная ошибка модели.

Для множественной линейной регрессии, где используются несколько признаков, формула расширяется:

y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε

В векторной форме эта же формула записывается как:

y = Xβ + ε

где X — матрица признаков, β — вектор коэффициентов, включающий β₀.

Основная задача при обучении модели линейной регрессии — найти оптимальные значения коэффициентов β, которые минимизируют функцию потерь. Наиболее распространенной функцией потерь является среднеквадратическая ошибка (Mean Squared Error, MSE):

MSE = (1/n) * Σ(y_i – ŷ_i)²

где yi — фактическое значение, а ŷi — предсказанное значение для i-го наблюдения.

Для нахождения оптимальных коэффициентов существуют различные методы:

  1. Метод наименьших квадратов (МНК) — аналитический метод, дающий точное решение для минимизации MSE: β = (X^T X)^(-1) X^T y

  2. Градиентный спуск — итеративный метод, постепенно приближающийся к оптимальному решению путем обновления коэффициентов в направлении антиградиента функции потерь: β_j := β_j – α * (∂/∂β_j) MSE, где α — скорость обучения.

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

  • Пакетный градиентный спуск (использует все примеры для обновления)
  • Стохастический градиентный спуск (использует один случайный пример)
  • Мини-пакетный градиентный спуск (использует подмножество примеров)

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

  • Ridge-регрессия (L2-регуляризация): добавляет λΣβ²
  • Lasso-регрессия (L1-регуляризация): добавляет λΣ|β|
  • Elastic Net: комбинирует L1 и L2 регуляризацию

Нормализация данных перед применением линейной регрессии часто улучшает сходимость градиентного спуска и общую производительность модели. Распространенные методы нормализации включают стандартизацию (z-score) и масштабирование признаков в диапазон [0,1].

Оценка качества моделей линейной регрессии

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

Основные метрики качества для моделей линейной регрессии:

Метрика Формула Интерпретация Диапазон значений
Среднеквадратичная ошибка (MSE) (1/n) * Σ(yi – ŷi)² Среднее квадратов отклонений предсказанных значений от фактических [0, ∞) — чем меньше, тем лучше
Корень из среднеквадратичной ошибки (RMSE) √MSE Показывает среднюю величину ошибки в единицах измерения целевой переменной [0, ∞) — чем меньше, тем лучше
Средняя абсолютная ошибка (MAE) (1/n) * Σyi – ŷi Среднее абсолютных отклонений (менее чувствительна к выбросам, чем MSE) [0, ∞) — чем меньше, тем лучше
Коэффициент детерминации (R²) 1 – (Σ(yi – ŷi)² / Σ(y_i – y̅)²) Доля дисперсии зависимой переменной, объясняемая моделью (-∞, 1] — чем ближе к 1, тем лучше
Скорректированный R² (Adjusted R²) 1 – ((1 – R²)(n – 1) / (n – p – 1)) Учитывает количество предикторов в модели (-∞, 1] — чем ближе к 1, тем лучше

Коэффициент детерминации R² — одна из наиболее интерпретируемых метрик. Значение R² = 0.75 означает, что модель объясняет 75% вариации целевой переменной. Однако R² имеет недостаток: при добавлении новых признаков в модель он никогда не уменьшается, даже если эти признаки не улучшают предсказательную способность. Поэтому для моделей с множеством признаков рекомендуется использовать скорректированный R².

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

  • График остатков — позволяет выявить паттерны, указывающие на нарушение предположений линейной регрессии
  • Q-Q график — позволяет проверить нормальность распределения остатков
  • График предсказанных vs фактических значений — помогает увидеть области, где модель работает хорошо или плохо
  • Частичные графики зависимости — показывают влияние отдельных признаков на предсказание

Для проверки статистической значимости модели и отдельных коэффициентов используются следующие статистики и тесты:

  1. t-статистика и p-значения для коэффициентов — показывают, насколько надежно оценены коэффициенты
  2. F-статистика — проверяет общую значимость модели
  3. Информационные критерии (AIC, BIC) — позволяют сравнивать модели с разным числом параметров
  4. Тест Дарбина-Уотсона — проверяет автокорреляцию остатков
  5. VIF (Variance Inflation Factor) — выявляет мультиколлинеарность признаков

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

Анна Светлова, Data Scientist

Работая над проектом прогнозирования стоимости квартир в Москве, я столкнулась с интересным парадоксом: модель линейной регрессии показывала отличные метрики на обучающей выборке (R² около 0.89), но на тестовой выборке качество резко падало (R² около 0.65).

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

Но настоящий прорыв произошел, когда я обратила внимание на распределение остатков: оно имело выраженную правостороннюю асимметрию. Логарифмирование целевой переменной (стоимости) привело к более симметричному распределению остатков и улучшило R² на тестовой выборке до 0.82.

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

Реализация линейной регрессии на Python с библиотеками

Python предлагает несколько способов реализации линейной регрессии — от построения модели с нуля до использования специализированных библиотек. Рассмотрим различные подходы, начиная с самого фундаментального и заканчивая высокоуровневыми API. 🐍

Реализация линейной регрессии с нуля

Начнем с реализации простой линейной регрессии, используя только NumPy. Это поможет глубже понять алгоритмические аспекты метода:

Python
Скопировать код
import numpy as np
import matplotlib.pyplot as plt

# Генерируем синтетические данные
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# Добавляем столбец из единиц для свободного члена
X_b = np.c_[np.ones((100, 1)), X]

# Вычисляем оптимальные параметры с помощью нормального уравнения
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)

# Выводим найденные коэффициенты
print("Коэффициенты модели (свободный член, наклон):", theta_best.flatten())

# Делаем предсказания
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]
y_predict = X_new_b.dot(theta_best)

# Визуализируем результаты
plt.plot(X, y, "b.")
plt.plot(X_new, y_predict, "r-")
plt.xlabel("X")
plt.ylabel("y")
plt.title("Линейная регрессия с нуля")
plt.show()

Реализация градиентного спуска для линейной регрессии:

Python
Скопировать код
# Функция для вычисления градиента
def compute_gradient(X, y, theta):
m = len(y)
predictions = X.dot(theta)
error = predictions – y
gradient = (2/m) * X.T.dot(error)
return gradient

# Градиентный спуск
def gradient_descent(X, y, theta, learning_rate, n_iterations):
m = len(y)
cost_history = np.zeros(n_iterations)
theta_history = np.zeros((n_iterations, 2))

for it in range(n_iterations):
gradient = compute_gradient(X, y, theta)
theta = theta – learning_rate * gradient
theta_history[it, :] = theta.T
predictions = X.dot(theta)
cost = (1/m) * np.sum((predictions – y) ** 2)
cost_history[it] = cost

return theta, cost_history, theta_history

# Применяем градиентный спуск
theta_init = np.random.randn(2, 1)
learning_rate = 0.1
n_iterations = 1000
theta_final, cost_history, theta_history = gradient_descent(X_b, y, theta_init, learning_rate, n_iterations)

print("Коэффициенты (градиентный спуск):", theta_final.flatten())

Реализация с использованием Scikit-Learn

Scikit-Learn предоставляет высокоуровневый API для создания и обучения моделей машинного обучения, включая линейную регрессию:

Python
Скопировать код
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

# Разделяем данные на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создаем и обучаем модель
model = LinearRegression()
model.fit(X_train, y_train)

# Выводим коэффициенты
print("Свободный член:", model.intercept_)
print("Коэффициенты:", model.coef_)

# Делаем предсказания
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)

# Оцениваем качество модели
mse_train = mean_squared_error(y_train, y_pred_train)
r2_train = r2_score(y_train, y_pred_train)
mse_test = mean_squared_error(y_test, y_pred_test)
r2_test = r2_score(y_test, y_pred_test)

print(f"MSE (обучающая выборка): {mse_train:.4f}")
print(f"R² (обучающая выборка): {r2_train:.4f}")
print(f"MSE (тестовая выборка): {mse_test:.4f}")
print(f"R² (тестовая выборка): {r2_test:.4f}")

Регуляризованная линейная регрессия

Для борьбы с переобучением и мультиколлинеарностью можно использовать регуляризованные версии линейной регрессии:

Python
Скопировать код
from sklearn.linear_model import Ridge, Lasso, ElasticNet
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

# Создаем пайплайн с нормализацией данных и регуляризацией
ridge_pipe = Pipeline([
('scaler', StandardScaler()),
('ridge', Ridge())
])

# Настраиваем гиперпараметры с помощью поиска по сетке
param_grid = {'ridge__alpha': [0\.001, 0.01, 0.1, 1, 10, 100]}
grid_search = GridSearchCV(ridge_pipe, param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X, y)

# Выводим лучшие параметры
print("Лучшее значение alpha:", grid_search.best_params_)
print("Лучший MSE:", -grid_search.best_score_)

# Обучаем модель с оптимальным параметром
best_ridge = grid_search.best_estimator_
y_pred = best_ridge.predict(X_test)

Полная конвейерная обработка для реальных данных

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

Python
Скопировать код
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline

# Загрузим данные о недвижимости (предположим, что у нас есть файл housing.csv)
# data = pd.read_csv("housing.csv")
# Для примера создадим синтетические данные
data = pd.DataFrame({
'price': np.random.randn(100) * 100000 + 300000,
'area': np.random.randn(100) * 50 + 120,
'rooms': np.random.randint(1, 6, 100),
'location': np.random.choice(['downtown', 'suburb', 'rural'], 100)
})

# Разделим на признаки и целевую переменную
X = data.drop('price', axis=1)
y = data['price']

# Определим числовые и категориальные колонки
numeric_features = ['area', 'rooms']
categorical_features = ['location']

# Создадим преобразователи для разных типов данных
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])

categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# Объединим преобразователи в один препроцессор
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])

# Создадим полный пайплайн
full_pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('regressor', LinearRegression())
])

# Разделим данные на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Обучим модель
full_pipeline.fit(X_train, y_train)

# Оценим качество
y_pred = full_pipeline.predict(X_test)
print(f"R² на тестовой выборке: {r2_score(y_test, y_pred):.4f}")

Приведенные примеры демонстрируют гибкость Python-экосистемы для машинного обучения. От фундаментальных реализаций, позволяющих понять математические основы метода, до высокоуровневых API, обеспечивающих эффективную работу с реальными данными. Выбор подхода зависит от конкретной задачи, объема данных и необходимой гибкости.

Практические задачи и области применения метода

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

Финансы и экономика

  • Прогнозирование цен акций и активов — линейная регрессия используется для моделирования зависимости цены от различных экономических факторов
  • Оценка кредитных рисков — определение вероятности дефолта на основе финансовых показателей заемщика
  • Анализ факторов, влияющих на инфляцию — выявление ключевых экономических показателей и оценка их весов
  • Прогнозирование спроса — построение моделей зависимости спроса от сезонных факторов, маркетинговых активностей и экономических условий

Недвижимость и урбанистика

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

Здравоохранение

  • Прогнозирование длительности госпитализации — на основе диагноза, возраста, наличия сопутствующих заболеваний
  • Анализ факторов риска заболеваний — определение влияния различных показателей на вероятность развития заболевания
  • Фармакологические исследования — моделирование зависимости эффективности лекарства от дозировки и характеристик пациента

Маркетинг и электронная коммерция

  • Прогнозирование отклика на рекламные кампании — моделирование конверсии в зависимости от параметров рекламы
  • Оптимизация ценообразования — определение оптимальной цены для максимизации прибыли
  • Анализ поведения пользователей — моделирование времени пребывания на сайте в зависимости от различных факторов
  • Прогнозирование оттока клиентов — определение факторов, влияющих на уход клиентов

Энергетика и экология

  • Прогнозирование потребления энергии — моделирование энергопотребления в зависимости от времени года, температуры и других факторов
  • Оценка выбросов парниковых газов — анализ зависимости выбросов от различных промышленных процессов
  • **Прог

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что такое зависимая переменная в контексте линейной регрессии?
1 / 5

Загрузка...