Что такое регуляризация в машинном обучении?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое регуляризация в машинном обучении?
Регуляризация — это набор техник, которые снижают сложность модели и предотвращают переобучение. Вместо того чтобы полностью минимизировать ошибку на обучающих данных, мы добавляем штраф за сложность.
Основная идея
Без регуляризации:
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 одновременно
Вывод
Регуляризация — это баланс между подгонкой данных и обобщением. Правильно выбранная регуляризация может улучшить качество модели на новых данных намного больше, чем попытки идеально подогнать обучающий набор.