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

Что такое регуляризация в машинном обучении?

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

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

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

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

Что такое регуляризация в машинном обучении?

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

Основная идея

Без регуляризации:

Loss = Mean Squared Error

С регуляризацией:

Loss = MSE + λ * Complexity

где λ (lambda) — гиперпараметр, контролирующий баланс между точностью и простотой.

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

Штрафует сумму абсолютных значений коэффициентов.

# Loss = MSE + λ * sum(|weights|)

from sklearn.linear_model import Lasso

model = Lasso(alpha=0.01)  # alpha = lambda
model.fit(X_train, y_train)

# Результат: некоторые коэффициенты становятся ровно 0
# Это автоматический feature selection!
print(model.coef_)  # [1.5, 0.0, 2.3, 0.0, -0.8, ...]

Свойства:

  • Уменьшает некоторые коэффициенты ровно до нуля
  • Автоматически выбирает важные признаки
  • Создает sparse модель (много нулевых коэффициентов)

Когда использовать: много признаков, нужна интерпретируемость.

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

Штрафует сумму квадратов коэффициентов.

# Loss = MSE + λ * sum(weights^2)

from sklearn.linear_model import Ridge

model = Ridge(alpha=1.0)
model.fit(X_train, y_train)

# Результат: коэффициенты становятся меньше, но редко ровно 0
print(model.coef_)  # [0.15, 0.08, 0.23, 0.02, -0.01, ...]

Свойства:

  • Равномерно снижает все коэффициенты
  • Не выключает признаки полностью
  • Все признаки вносят небольшой вклад

Когда использовать: большинство признаков важны, много multicollinearity.

L1 vs L2: визуально

L1 (Lasso): Diamond shape -> приводит к углам (нули)
L2 (Ridge): Circle shape -> гладко снижает все

L1+L2 (Elastic Net): комбинация обоих

Elastic Net (L1 + L2)

from sklearn.linear_model import ElasticNet

model = ElasticNet(alpha=0.01, l1_ratio=0.5)  # 50% L1, 50% L2
model.fit(X_train, y_train)

# Loss = MSE + α * [l1_ratio * sum(|w|) + (1 - l1_ratio) * sum(w^2)]
  • l1_ratio=1.0: только L1 (Lasso)
  • l1_ratio=0.0: только L2 (Ridge)
  • l1_ratio=0.5: поровну

Регуляризация в других алгоритмах

XGBoost:

from xgboost import XGBClassifier

model = XGBClassifier(
    # Регуляризация листьев
    reg_alpha=0.1,    # L1 штраф за количество листьев
    reg_lambda=1.0,   # L2 штраф за веса листьев
    
    # Ограничение сложности дерева
    max_depth=5,      # Глубина
    min_child_weight=1,  # Минимальный вес в листе
    subsample=0.8,    # Sampling строк (80%)
    colsample_bytree=0.8,  # Sampling признаков (80%)
)

Нейросеть (Keras):

from tensorflow.keras import regularizers
from tensorflow.keras.layers import Dense

model.add(Dense(
    64,
    activation='relu',
    kernel_regularizer=regularizers.l2(0.01)  # L2 на веса
))

model.add(Dense(32, activation='relu', kernel_regularizer=regularizers.l1(0.01)))

# Или Elastic Net
model.add(Dense(
    16,
    activation='relu',
    kernel_regularizer=regularizers.L1L2(l1=0.01, l2=0.01)
))

Dropout (специальная регуляризация для нейросетей)

from tensorflow.keras.layers import Dropout

model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))  # Отключаем 50% нейронов случайно
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))

Early Stopping (форма регуляризации)

from sklearn.neural_network import MLPClassifier

model = MLPClassifier(
    hidden_layer_sizes=(100, 50),
    early_stopping=True,
    validation_fraction=0.2,  # 20% на валидацию
    n_iter_no_improve=10  # Стоп, если 10 итераций нет улучшения
)

model.fit(X_train, y_train)

Практический пример: выбор λ

from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
import numpy as np
import matplotlib.pyplot as plt

alphas = np.logspace(-3, 3, 100)
cv_scores = []

for alpha in alphas:
    model = Ridge(alpha=alpha)
    scores = cross_val_score(model, X, y, cv=5, scoring='r2')
    cv_scores.append(scores.mean())

best_alpha = alphas[np.argmax(cv_scores)]
print(f"Best lambda: {best_alpha:.4f}")

plt.plot(alphas, cv_scores)
plt.xlabel('Lambda')
plt.ylabel('CV R2 Score')
plt.xscale('log')
plt.show()

Как выбрать регуляризацию

L1 (Lasso) если:

  • Много признаков (feature selection)
  • Нужна интерпретируемость
  • Выборка маленькая

L2 (Ridge) если:

  • Все признаки примерно одинаково важны
  • Много multicollinearity
  • Нужна стабильность

Elastic Net если:

  • Хочешь комбинировать L1 и L2
  • Много correlated признаков

Dropout если:

  • Нейросеть переобучается
  • Много параметров

Early Stopping если:

  • Обучение идет слишком долго
  • Видишь divergence на валидации

Практический чек-лист

  • ✓ Начни с λ=0 (без регуляризации) как baseline
  • ✓ Постепенно увеличивай λ
  • ✓ Используй кросс-валидацию для выбора λ
  • ✓ Не переусложняй — простая модель часто лучше
  • ✓ Мониторь train и val loss одновременно

Вывод

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

Что такое регуляризация в машинном обучении? | PrepBro