← Назад к вопросам

Что такое робастная регрессия?

2.0 Middle🔥 191 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Робастная регрессия в машинном обучении

Робастная регрессия — это метод линейной регрессии, который устойчив к выбросам (outliers) и аномальным значениям в данных. Вместо минимизации суммы квадратов ошибок (как в OLS), она использует функции потерь, которые меньше чувствительны к экстремальным значениям.

Проблема обычной регрессии

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, HuberRegressor

X = np.array([[1], [2], [3], [4], [5], [10]])
y = np.array([2, 3.5, 4, 5.5, 7, 50])  # 50 — выброс

lr = LinearRegression()
lr.fit(X, y)
y_pred_lr = lr.predict(X)

print(f"OLS коэффициент: {lr.coef_[0]:.4f}")
print(f"OLS MSE: {np.mean((y - y_pred_lr)**2):.4f}")

Типы робастной регрессии

1. Huber Regressor

from sklearn.linear_model import HuberRegressor

huber = HuberRegressor(epsilon=1.35, max_iter=100)
huber.fit(X, y)
y_pred_huber = huber.predict(X)

print(f"Huber коэффициент: {huber.coef_[0]:.4f}")
print(f"Huber MSE: {np.mean((y - y_pred_huber)**2):.4f}")

2. RANSACRegressor (Random Sample Consensus)

from sklearn.linear_model import RANSACRegressor

ransac = RANSACRegressor(random_state=0, min_samples=3)
ransac.fit(X, y)
y_pred_ransac = ransac.predict(X)

print(f"RANSAC коэффициент: {ransac.estimator_.coef_[0]:.4f}")
print(f"Выбросы: {~ransac.inliers_mask_}")

3. TheilSenRegressor

from sklearn.linear_model import TheilSenRegressor

theilsen = TheilSenRegressor(random_state=0)
theilsen.fit(X, y)
y_pred_theilsen = theilsen.predict(X)

print(f"Theil-Sen коэффициент: {theilsen.coef_[0]:.4f}")

4. Регрессия с весами

lr_weighted = LinearRegression()
weights = np.ones(len(X))
weights[5] = 0.1  # выброс получает малый вес
lr_weighted.fit(X, y, sample_weight=weights)
y_pred_weighted = lr_weighted.predict(X)

print(f"Weighted коэффициент: {lr_weighted.coef_[0]:.4f}")

Сравнение методов

from sklearn.metrics import mean_absolute_error, mean_squared_error

methods = {
    'OLS': y_pred_lr,
    'Huber': y_pred_huber,
    'RANSAC': y_pred_ransac,
    'Theil-Sen': y_pred_theilsen,
    'Weighted': y_pred_weighted
}

print("Сравнение методов:")
for name, y_pred in methods.items():
    mse = mean_squared_error(y, y_pred)
    mae = mean_absolute_error(y, y_pred)
    print(f"{name}: MSE={mse:.4f}, MAE={mae:.4f}")

Функции потерь в робастной регрессии

  1. Квадратичная (OLS): очень чувствительна к выбросам (квадрат ошибки)
  2. Абсолютная (MAE/L1): менее чувствительна, но не гладкая
  3. Huber: гладкая комбинация (MSE для малых, MAE для больших ошибок)
  4. Log-Cosh: гладкая и дифференцируемая везде

Параметр epsilon в Huber:

  • < 1.35: более чувствителен к выбросам
  • 1.35: менее чувствителен

Практический пример: прогноз цен с выбросами

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

data = pd.DataFrame({
    'square_meters': [100, 120, 150, 180, 200, 250, 300, 500],
    'price': [300000, 350000, 400000, 480000, 550000, 700000, 900000, 50000000]
})

X = data[['square_meters']].values
y = data['price'].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

models = {
    'OLS': LinearRegression(),
    'Huber': HuberRegressor(epsilon=1.35),
    'RANSAC': RANSACRegressor(random_state=42),
    'Theil-Sen': TheilSenRegressor(random_state=42)
}

for name, model in models.items():
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    r2 = r2_score(y_test, y_pred)
    print(f"{name}: R² = {r2:.4f}")

Преимущества и недостатки

Преимущества

  • Устойчивость к выбросам: малочувствительны к аномалиям
  • Лучшая генерализация: модель не переучивается на шум
  • Применимы к реальным данным: в которых всегда есть ошибки

Недостатки

  • Медленнее OLS: требуют итеративных алгоритмов
  • Сложнее интерпретировать: нет стандартных доверительных интервалов
  • Требуют подбора параметров: epsilon, max_iterations и др.

Когда использовать робастную регрессию

  • Есть выбросы в данных: ошибочные измерения, аномалии
  • Неправильное распределение ошибок: не нормальное (гауссово)
  • Необходимо доверие к результатам: выбросы не должны портить модель
  • Неизвестное качество данных: некоторые значения могут быть ненадёжны

Когда использовать OLS

  • Данные чистые: нет выбросов
  • Нужна интерпретируемость: стандартные ошибки, доверительные интервалы
  • Небольшой размер выборки: робастные методы нужны для больших данных

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