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

О чем говорит высокий variance bias-variance tradeoff

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

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

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

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

О чем говорит высокий variance в bias-variance tradeoff

Высокий variance — это критический сигнал о переобучении модели. Объясню, почему это важно и как это диагностировать.

Что такое variance в контексте bias-variance tradeoff

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

Можно представить это так: если мы обучим модель на 100 разных случайных подвыборках одного датасета, высокий variance означает, что полученные модели будут сильно отличаться друг от друга.

Высокий bias (недообучение):
- Модель слишком простая
- Предсказания практически идентичны для всех датасетов
- Но все они ошибочны

Высокий variance (переобучение):
- Модель слишком сложная
- Предсказания сильно отличаются для разных датасетов
- Модель "запомнила" шум в тренировочных данных

Как диагностировать высокий variance

Главный признак: большой разрыв между train и test метриками.

from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
import numpy as np

model = DecisionTreeClassifier(max_depth=20)  # Очень глубокое дерево

# Обучение на тренировочном наборе
train_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
print(f"Train accuracy: {train_scores.mean():.4f} ± {train_scores.std():.4f}")
# Output: Train accuracy: 0.9900 ± 0.0050

# Оценка на тестовом наборе
test_scores = cross_val_score(model, X_test, y_test, cv=5, scoring='accuracy')
print(f"Test accuracy: {test_scores.mean():.4f} ± {test_scores.std():.4f}")
# Output: Test accuracy: 0.7200 ± 0.1500

# Разрыв 27% между train и test — явный признак высокого variance

Характеристики моделей с высоким variance

1. Большой разрыв между train/val/test метриками

  • Train: 98% accuracy
  • Val: 72% accuracy
  • Test: 70% accuracy

2. Нестабильность на кросс-валидации

scores = cross_val_score(model, X, y, cv=10)
print(f"Scores: {scores}")  
# [0.95, 0.72, 0.88, 0.65, 0.91, 0.70, 0.93, 0.67, 0.89, 0.68]
# Высокая дисперсия scores — признак высокого variance

print(f"Mean: {scores.mean():.4f}, Std: {scores.std():.4f}")
# Mean: 0.7978, Std: 0.1037 — большое std означает высокий variance

3. Сложная модель на простых данных

# Пример: обучаем полином 15-й степени на 20 примерах
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

poly = PolynomialFeatures(degree=15)  # 15 параметров для 20 примеров!
X_poly = poly.fit_transform(X_train)
model = LinearRegression()
model.fit(X_poly, y_train)

# Модель запомнит даже шум в данных
# На новых данных — провал

Практические решения для снижения variance

1. Упростить модель (снизить complexity)

# Было
model = DecisionTreeClassifier(max_depth=20, min_samples_leaf=1)

# Стало
model = DecisionTreeClassifier(max_depth=5, min_samples_leaf=10)

2. Регуляризация (L1/L2)

from sklearn.linear_model import Ridge, Lasso

# Ridge (L2 регуляризация) штрафует за большие коэффициенты
model = Ridge(alpha=1.0)  # alpha выше = сильнее регуляризация
model.fit(X_train, y_train)

# Lasso (L1 регуляризация) обнуляет малозначимые коэффициенты
model = Lasso(alpha=0.1)
model.fit(X_train, y_train)

3. Увеличить объем тренировочных данных

# Больше данных = модель не может запомнить все закономерности
X_train_augmented = augment_data(X_train)  # data augmentation
model.fit(X_train_augmented, y_train_augmented)

4. Ансамбли (Bagging, Random Forest)

from sklearn.ensemble import RandomForestClassifier, BaggingClassifier

# Random Forest — множество деревьев на разных подвыборках
model = RandomForestClassifier(n_estimators=100, max_depth=5)
# Усреднение предсказаний снижает variance

# Bagging — общий подход
model = BaggingClassifier(
    estimator=DecisionTreeClassifier(max_depth=20),
    n_estimators=10,
    random_state=42
)

5. Cross-validation и early stopping

from sklearn.ensemble import GradientBoostingClassifier

model = GradientBoostingClassifier(
    n_estimators=1000,
    validation_fraction=0.1,  # 10% данных на валидацию
    n_iter_no_change=50  # Early stopping
)
# Модель остановится, если валидационная метрика не улучшается

Как выбрать правильный баланс

# Кривая learning curves показывает баланс bias-variance
from sklearn.model_selection import learning_curve

train_sizes, train_scores, val_scores = learning_curve(
    model, X, y, cv=5, train_sizes=np.linspace(0.1, 1.0, 10)
)

train_mean = np.mean(train_scores, axis=1)
val_mean = np.mean(val_scores, axis=1)

# Если gap между train и val большой — высокий variance
# Если обе кривые низкие — высокий bias
# Оптимум — когда обе кривые близко и высоко

Интерпретация результатов

  • Высокий variance = переобучение — модель слишком хитрая, запомнила шум
  • Высокий bias = недообучение — модель слишком простая, не видит закономерности
  • Оптимум — найти баланс между bias и variance

Итог

Высокий variance говорит о переобучении. Признаки:

  1. Большой разрыв между train/test метриками (>20%)
  2. Нестабильность на кросс-валидации
  3. Чрезмерно сложная модель

Решение: упростить модель, добавить регуляризацию, увеличить датасет или использовать ансамбли.

О чем говорит высокий variance bias-variance tradeoff | PrepBro