Комментарии (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 между кривыми большой
Таблица: как диагностировать
| Problem | Train Error | Test Error | Gap | Решение |
|---|---|---|---|---|
| High Bias | High | High | Маленький | Увеличь complexity |
| High Variance | Low | High | Большой | Больше данных, регуляризация |
| Balanced | Medium | Medium | Маленький | ✓ |
Резюме
- Bias: ошибка от неправильных предположений (underfitting)
- Variance: ошибка от переучивания (overfitting)
- Trade-off: не можешь иметь обе низкие одновременно
- Цель: найти оптимальный баланс
- Инструменты: регуляризация, ensemble, cross-validation