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

Что такое bias и variance модели?

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

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

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

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

Bias и Variance в Machine Learning

Bias и Variance описывают два типа ошибок модели. Их баланс определяет способность модели обобщаться на новые данные.

Определения

Bias (смещение) — ошибка от неправильных предположений модели.

  • Модель слишком простая, не может захватить сложность данных
  • Систематическая ошибка

Variance (дисперсия) — чувствительность модели к флуктуациям в обучающих данных.

  • Модель слишком сложная, переучилась на деталях
  • Высокая чувствительность к шуму

Визуальная аналогия: стрельба в мишень

Высокий Bias, Низкий Variance    Низкий Bias, Низкий Variance
┌─────────────────────┐           ┌─────────────────────┐
│    O O O O          │           │        ●●●          │
│    O O O            │           │        ●●●          │
│    O                │           │        ●●●          │
│  ●  (center)        │           │  ●  (center)        │
└─────────────────────┘           └─────────────────────┘
  Все попадания рядом              Попадают около центра
  но в неправильном месте

Низкий Bias, Высокий Variance    Высокий Bias, Высокий Variance
┌─────────────────────┐           ┌─────────────────────┐
│ O   O  O            │           │  O  O        O      │
│   O      O    O     │           │     O   O O         │
│  O  O                │           │ O        O O        │
│     ●  (center)      │           │ ●   O              │
└─────────────────────┘           └─────────────────────┘
  Разброс большой                  Разброс большой и
  но центр правильный              центр неправильный

Пример: полиномиальная регрессия

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# Генерируем данные
np.random.seed(42)
X = np.linspace(0, 10, 100).reshape(-1, 1)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, 100)

fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# Model 1: Polynomial degree = 1 (Linear)
# Высокий Bias, Низкий Variance
poly = PolynomialFeatures(degree=1)
X_poly = poly.fit_transform(X)
model = LinearRegression().fit(X_poly, y)
y_pred = model.predict(X_poly)

axes[0, 0].scatter(X, y, alpha=0.5)
axes[0, 0].plot(X, y_pred, 'r-', linewidth=2)
axes[0, 0].set_title('Degree=1: High Bias, Low Variance')
axes[0, 0].text(0.5, 0.05, 'Underfitting', transform=axes[0, 0].transAxes)

# Model 2: Polynomial degree = 3
# Баланс
poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(X)
model = LinearRegression().fit(X_poly, y)
y_pred = model.predict(X_poly)

axes[0, 1].scatter(X, y, alpha=0.5)
axes[0, 1].plot(X, y_pred, 'r-', linewidth=2)
axes[0, 1].set_title('Degree=3: Balanced')

# Model 3: Polynomial degree = 10
# Низкий Bias, Высокий Variance
poly = PolynomialFeatures(degree=10)
X_poly = poly.fit_transform(X)
model = LinearRegression().fit(X_poly, y)
y_pred = model.predict(X_poly)

axes[1, 0].scatter(X, y, alpha=0.5)
axes[1, 0].plot(X, y_pred, 'r-', linewidth=2)
axes[1, 0].set_title('Degree=10: Low Bias, High Variance')
axes[1, 0].text(0.5, 0.05, 'Overfitting', transform=axes[1, 0].transAxes)

plt.tight_layout()
plt.show()

Bias-Variance Decomposition

Ошибка модели разлагается на:

Total Error = Bias² + Variance + Irreducible Error

Где:

  • Bias² — квадрат смещения
  • Variance — дисперсия
  • Irreducible Error — шум в данных (неустранимо)
def bias_variance_tradeoff():
    """
    Демонстрация trade-off
    """
    complexity = np.linspace(0, 10, 100)
    
    bias = 1 / (1 + complexity)  # уменьшается с ростом complexity
    variance = complexity / 10    # растёт с ростом complexity
    total_error = bias**2 + variance
    
    plt.figure(figsize=(10, 6))
    plt.plot(complexity, bias**2, label='Bias²', linewidth=2)
    plt.plot(complexity, variance, label='Variance', linewidth=2)
    plt.plot(complexity, total_error, label='Total Error', 
             linewidth=2, linestyle='--', color='red')
    
    plt.xlabel('Model Complexity →')
    plt.ylabel('Error →')
    plt.legend()
    plt.title('Bias-Variance Tradeoff')
    plt.grid(alpha=0.3)
    plt.show()

Практические примеры

High Bias, Low Variance (Underfitting)

# Линейная регрессия для нелинейных данных
model = LinearRegression()
model.fit(X_train, y_train)

print(f"Train error: 0.8")
print(f"Test error: 0.79")  # близко к train
# Модель слишком простая

Low Bias, High Variance (Overfitting)

# Decision Tree без ограничений
model = DecisionTreeRegressor()  # max_depth=None
model.fit(X_train, y_train)

print(f"Train error: 0.01")
print(f"Test error: 0.7")   # гораздо хуже train
# Модель переучилась на шум

Balanced

# Decision Tree с ограничением глубины
model = DecisionTreeRegressor(max_depth=5)
model.fit(X_train, y_train)

print(f"Train error: 0.15")
print(f"Test error: 0.16")  # близко друг к другу
# Хороший баланс

Как контролировать Bias-Variance

# 1. Больше данных → уменьшает variance
model.fit(X_train_large, y_train_large)

# 2. Регуляризация (L1, L2) → уменьшает variance
model = Ridge(alpha=1.0)  # L2 регуляризация

# 3. Упрощение модели → увеличивает bias, но уменьшает variance
model = LinearRegression()  # проще чем polynomial

# 4. Feature selection → уменьшает variance
# Используй только важные признаки

# 5. Ensemble methods (Bagging) → уменьшает variance
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators=100)  # усреднение

# 6. Cross-validation → оценивает обобщение
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5)

Learning Curves

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)
)

plt.plot(train_sizes, train_scores.mean(axis=1), label='Train')
plt.plot(train_sizes, val_scores.mean(axis=1), label='Validation')
plt.xlabel('Training Set Size')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

# High Bias: обе кривые низкие и плоские
# High Variance: gap между кривыми большой

Таблица: как диагностировать

ProblemTrain ErrorTest ErrorGapРешение
High BiasHighHighМаленькийУвеличь complexity
High VarianceLowHighБольшойБольше данных, регуляризация
BalancedMediumMediumМаленький

Резюме

  • Bias: ошибка от неправильных предположений (underfitting)
  • Variance: ошибка от переучивания (overfitting)
  • Trade-off: не можешь иметь обе низкие одновременно
  • Цель: найти оптимальный баланс
  • Инструменты: регуляризация, ensemble, cross-validation