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

Какие знаешь проблемы мультиколлинеарности при градиентном спуске?

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

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

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

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

Мультиколлинеарность при градиентном спуске

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

Основные проблемы

1. Нестабильная матрица Гессиана

При мультиколлинеарности матрица Гессиана (H) становится плохо обусловленной:

import numpy as np
from numpy.linalg import cond

# Идеальный случай
X_good = np.array([[1, 2], [2, 4.1], [3, 6.2]])
print(cond(X_good.T @ X_good))  # ~100-200

# С мультиколлинеарностью
X_bad = np.array([[1, 2], [2, 4], [3, 6]])
print(cond(X_bad.T @ X_bad))  # очень большое число (близко к бесконечности)

Число обусловленности кондиционирования показывает, насколько чувствительна система к небольшим изменениям входных данных.

2. Медленная сходимость градиентного спуска

Градиентный спуск двигается очень медленно в направлениях с высокой мультиколлинеарностью:

import matplotlib.pyplot as plt
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler

# Данные с мультиколлинеарностью
X = np.array([[1, 1.001], [2, 2.002], [3, 3.001], [4, 3.999], [5, 5.001]])
y = np.array([2, 4, 6, 8, 10])

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

model = SGDRegressor(max_iter=1000, learning_rate=optimal)
model.fit(X_scaled, y)

# Без масштабирования и регуляризации может потребоваться много итераций
print(model.n_iter_)  # много итераций для сходимости

3. Неустойчивые веса коэффициентов

Микроскопические изменения в данных приводят к огромным изменениям в весах модели:

from sklearn.linear_model import LinearRegression

# Мультиколлинеарные признаки
X1 = np.array([[1, 2], [2, 4], [3, 6], [4, 8], [5, 10]])
y = np.array([2, 4, 6, 8, 10])

model1 = LinearRegression()
model1.fit(X1, y)
print("Коэффициенты 1:", model1.coef_)  # [a, b]

# Слегка изменённые данные
X2 = np.array([[1, 2.01], [2, 4.01], [3, 6.01], [4, 8.01], [5, 10.01]])
model2 = LinearRegression()
model2.fit(X2, y)
print("Коэффициенты 2:", model2.coef_)  # сильно отличаются от [a, b]

4. Проблемы с интерпретацией

Невозможно надёжно определить влияние отдельных признаков:

from sklearn.linear_model import LogisticRegression

# X1 и X2 почти идентичны
X = np.array([[1, 1.001], [2, 2.001], [3, 3.001], [4, 4.001]])
y = np.array([0, 1, 1, 1])

model = LogisticRegression()
model.fit(X, y)
print("Коэффициенты:", model.coef_[0])
# Один коэффициент может быть очень положительный, другой очень отрицательный
# Хотя они должны быть похожи по величине

Диагностика мультиколлинеарности

Матрица корреляции:

import pandas as pd

df = pd.DataFrame(X, columns=[feature_1, feature_2])
corr_matrix = df.corr()
print(corr_matrix)
# Высокие значения (>0.9 или <-0.9) указывают на мультиколлинеарность

Variance Inflation Factor (VIF):

from statsmodels.stats.outliers_influence import variance_inflation_factor

vif_data = pd.DataFrame()
vif_data["feature"] = df.columns
vif_data["VIF"] = [variance_inflation_factor(X, i) for i in range(X.shape[1])]
print(vif_data)
# VIF > 10 обычно указывает на проблему

Решения

1. Регуляризация (Ridge, Lasso, Elastic Net)

from sklearn.linear_model import Ridge, Lasso

# Ridge добавляет штраф на сумму квадратов коэффициентов
ridge = Ridge(alpha=1.0)
ridge.fit(X, y)

# Lasso может обнулить коэффициенты
lasso = Lasso(alpha=0.1)
lasso.fit(X, y)

2. Отбор признаков

from sklearn.feature_selection import SelectKBest

# Оставляем только самые значимые признаки
selector = SelectKBest(k=1)
X_selected = selector.fit_transform(X, y)

3. PCA (Principal Component Analysis)

from sklearn.decomposition import PCA

# Преобразуем корреллированные признаки в некоррелированные компоненты
pca = PCA(n_components=1)
X_pca = pca.fit_transform(X)

4. Увеличение learning rate с осторожностью

model = SGDRegressor(learning_rate=0.01, max_iter=2000)
model.fit(X_scaled, y)

Практическое значение

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

Какие знаешь проблемы мультиколлинеарности при градиентном спуске? | PrepBro