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

Как защитить модель линейной регрессии от влияния шума?

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

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

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

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

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

Проблема шума и переобучения

Линейная регрессия имеет низкий bias, но может иметь высокий variance, особенно при большом количестве признаков. Шум усиливает эту проблему.

1. Регуляризация (главный метод)

Регуляризация добавляет штраф за сложность модели:

Ridge регрессия (L2-регуляризация)

from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score

# Подбор оптимального параметра alpha
alphas = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]
best_alpha = None
best_score = -float("inf")

for alpha in alphas:
    model = Ridge(alpha=alpha)
    scores = cross_val_score(model, X_train, y_train, cv=5, scoring="neg_mean_squared_error")
    if scores.mean() > best_score:
        best_score = scores.mean()
        best_alpha = alpha

print(f"Оптимальный alpha: {best_alpha}")
model_ridge = Ridge(alpha=best_alpha)
model_ridge.fit(X_train, y_train)
y_pred = model_ridge.predict(X_test)

Lasso регрессия (L1-регуляризация)

Автоматически отбирает важные признаки:

from sklearn.linear_model import Lasso, LassoCV

model_lasso = LassoCV(cv=5, random_state=42)
model_lasso.fit(X_train, y_train)

print(f"Выбранный alpha: {model_lasso.alpha_}")
print(f"Ненулевые коэффициенты: {sum(model_lasso.coef_ != 0)}")

Elastic Net (сочетание Ridge и Lasso)

from sklearn.linear_model import ElasticNetCV

model = ElasticNetCV(l1_ratio=[0.1, 0.5, 0.9], cv=5, random_state=42)
model.fit(X_train, y_train)
print(f"l1_ratio: {model.l1_ratio_}, alpha: {model.alpha_}")

2. Обработка выбросов

Шум часто проявляется как выбросы. Robust методы менее чувствительны:

from sklearn.linear_model import HuberRegressor

model_huber = HuberRegressor(epsilon=1.2, max_iter=1000)
model_huber.fit(X_train, y_train)
y_pred = model_huber.predict(X_test)

from sklearn.linear_model import RANSACRegressor
model_ransac = RANSACRegressor(random_state=42)
model_ransac.fit(X_train, y_train)
print(f"Выбросы обнаружено: {sum(~model_ransac.inliers_)}")

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

from sklearn.preprocessing import StandardScaler, RobustScaler

# Стандартизация признаков
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Робастная нормализация для шумных данных
robust_scaler = RobustScaler()
X_train_scaled = robust_scaler.fit_transform(X_train)

4. Feature engineering и отбор признаков

from sklearn.feature_selection import SelectKBest, f_regression
from sklearn.pipeline import Pipeline

selection = SelectKBest(f_regression, k=10)
X_train_selected = selection.fit_transform(X_train, y_train)

pipeline = Pipeline([
    ("scaler", StandardScaler()),
    ("selection", SelectKBest(f_regression, k=10)),
    ("model", Ridge(alpha=1.0))
])

pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)

5. Кросс-валидация и мониторинг

from sklearn.model_selection import cross_validate

scores = cross_validate(
    Ridge(alpha=1.0),
    X_train, y_train,
    cv=5,
    scoring=["neg_mean_squared_error", "r2"],
    return_train_score=True
)

print(f"Train MSE: {-scores['train_neg_mean_squared_error'].mean():.4f}")
print(f"Test MSE: {-scores['test_neg_mean_squared_error'].mean():.4f}")
print(f"Train R2: {scores['train_r2'].mean():.4f}")
print(f"Test R2: {scores['test_r2'].mean():.4f}")

6. Ансамбли моделей

Множество моделей более устойчивы к шуму:

from sklearn.ensemble import BaggingRegressor

model = BaggingRegressor(
    estimator=Ridge(alpha=1.0),
    n_estimators=50,
    random_state=42
)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

Итоговая стратегия

  1. Используйте регуляризацию (Ridge или Lasso)
  2. Нормализуйте признаки перед обучением
  3. Отбирайте важные признаки (feature selection)
  4. Обрабатывайте выбросы (visual inspection, robust методы)
  5. Проверяйте переобучение через cross-validation
  6. Используйте ансамбли для стабильности

Сочетание этих методов обеспечивает высокую устойчивость модели к шуму и лучшее обобщение на новые данные.