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

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

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

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

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

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

Bias-Variance Tradeoff: Что означает высокий bias?

Bias-variance tradeoff — это один из фундаментальных концептов в машинном обучении. Понимание этого компромисса критично для создания хороших моделей.

Определение Bias

Bias — это смещение модели, её неспособность правильно моделировать истинную зависимость между признаками и целевой переменной.

Математически:

Bias = E[ŷ] - y*

Где E[ŷ] — ожидаемое значение предсказаний модели, y* — истинное значение.

Визуальное объяснение

Цель (красная область): центр является истинным значением

Низкий Bias, Низкий Variance (идеал):
о о о о о  ← предсказания близки к истине, не разброс
о   о   о
  о о о о

Высокий Bias, Низкий Variance (систематическая ошибка):
     х х х х х  ← все предсказания смещены в одну сторону
     х   х   х
       х х х х  (целевое значение здесь, но модель предсказывает там)

Низкий Bias, Высокий Variance (переобучение):
о х о х х о  ← предсказания разбросаны
х о х о х х
о х х о о х  (в среднем около цели, но очень волатильны)

Высокий Bias, Высокий Variance (плохо):
     х х х х х х х х х
     х х х х х х х х х  ← сильно смещены И разбросаны
     х х х х х х х х х

Примеры высокого bias

Пример 1: Недообученная модель (Underfitting)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
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_true = np.sin(X).ravel() + 0.1 * np.random.randn(100)

# Модель 1: Низкой степени (высокий bias)
model_linear = Pipeline([
    ('poly', PolynomialFeatures(degree=1)),  # линейная модель
    ('lr', LinearRegression())
])
model_linear.fit(X, y_true)
y_pred_linear = model_linear.predict(X)

# Модель 2: Высокой степени (низкий bias, высокий variance)
model_high = Pipeline([
    ('poly', PolynomialFeatures(degree=20)),  # очень высокая степень
    ('lr', LinearRegression())
])
model_high.fit(X, y_true)
y_pred_high = model_high.predict(X)

# Вычисление MSE
from sklearn.metrics import mean_squared_error
mse_linear = mean_squared_error(y_true, y_pred_linear)
mse_high = mean_squared_error(y_true, y_pred_high)

print(f"MSE линейной модели (высокий bias): {mse_linear:.4f}")
print(f"MSE полиномиальной модели (низкий bias): {mse_high:.4f}")

# Визуализация
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.scatter(X, y_true, alpha=0.5, label='Истинные данные')
plt.plot(X, y_pred_linear, 'r-', linewidth=2, label='Линейная модель (высокий bias)')
plt.legend()
plt.title('Высокий Bias: Модель слишком простая')

plt.subplot(1, 2, 2)
plt.scatter(X, y_true, alpha=0.5, label='Истинные данные')
plt.plot(X, y_pred_high, 'g-', linewidth=1, label='Полином степени 20 (низкий bias)')
plt.legend()
plt.title('Низкий Bias: Модель чрезмерно сложная')

plt.tight_layout()
plt.show()

Причины высокого bias

1. Модель слишком простая

Не может захватить сложность истинной зависимости.

# Пример: линейная модель для нелинейных данных
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_circles

X, y = make_circles(n_samples=100, noise=0.1, factor=0.3)

model = LinearRegression()
model.fit(X, y)

# Линейная граница не может отделить две окружности
# Высокий bias, потому что модель предполагает линейную зависимость

2. Неправильный выбор признаков (Features)

import numpy as np
from sklearn.linear_model import LinearRegression

# Истинная формула: y = x^2 + noise
X = np.array([[1], [2], [3], [4], [5]])
y = X.ravel()**2 + np.random.randn(5) * 0.1

# Модель использует только линейные признаки
model = LinearRegression()
model.fit(X, y)

# Модель не может предсказать квадратичную зависимость
# BIAS: E[ŷ] будет сильно отличаться от y*

3. Недостаточное количество итераций обучения

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error

X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 5, 4, 5])

# Очень мало деревьев
model_few = GradientBoostingRegressor(n_estimators=1, learning_rate=0.1)
model_few.fit(X, y)

# Много деревьев
model_many = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1)
model_many.fit(X, y)

train_error_few = mean_squared_error(y, model_few.predict(X))
train_error_many = mean_squared_error(y, model_many.predict(X))

print(f"Train error (мало деревьев): {train_error_few:.4f}")  # высокий
print(f"Train error (много деревьев): {train_error_many:.4f}")  # низкий

Как выявить высокий bias?

Метод 1: Learning Curve

from sklearn.model_selection import learning_curve
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

X = np.linspace(0, 10, 200).reshape(-1, 1)
y = np.sin(X).ravel() + 0.1 * np.random.randn(200)

# Линейная модель
model = LinearRegression()
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)

plt.plot(train_sizes, train_mean, 'o-', label='Train')
plt.plot(train_sizes, val_mean, 'o-', label='Validation')
plt.axhline(y=train_mean[-1], color='r', linestyle='--', alpha=0.5)
plt.legend()
plt.title('High Bias: Train и Val ошибка сходятся на высоком уровне')
plt.xlabel('Training Set Size')
plt.ylabel('Score')
plt.show()

# Признак высокого bias:
# - Обе кривые (train и val) HIGH И БЛИЗКО друг к другу
# Если обе кривые низкие — это высокий bias

Метод 2: Проверка на обучающем наборе

from sklearn.metrics import mean_squared_error

# Если даже на обучающем наборе большая ошибка — это bias
train_error = mean_squared_error(y_train, model.predict(X_train))
if train_error > threshold:
    print("Высокий bias: модель плохо предсказывает даже обучающие данные")

Метод 3: Анализ остатков

import matplotlib.pyplot as plt

y_pred = model.predict(X)
residuals = y - y_pred

plt.scatter(y_pred, residuals)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('Predicted Values')
plt.ylabel('Residuals')
plt.title('Residual Plot')
plt.show()

# Высокий bias: остатки образуют систематический паттерн
# (не случайный разброс, а какая-то кривая)

Как снизить bias?

1. Сделать модель более сложной

from sklearn.preprocessing import PolynomialFeatures

# Вместо LinearRegression
model_simple = LinearRegression()

# Использовать полиномиальные признаки
poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(X)
model_complex = LinearRegression()
model_complex.fit(X_poly, y)

2. Добавить релевантные признаки

# Если y зависит от x^2, добавить признак x^2
X_with_features = np.column_stack([X, X**2, np.log(X)])
model.fit(X_with_features, y)

3. Использовать более гибкую модель

from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor

# Вместо LinearRegression
model_tree = DecisionTreeRegressor(max_depth=10)
model_rf = RandomForestRegressor(n_estimators=100)

4. Увеличить количество итераций обучения

from sklearn.ensemble import GradientBoostingRegressor

model = GradientBoostingRegressor(n_estimators=500)  # было 10

Bias-Variance Decomposition формула

Expected MSE = Bias² + Variance + IrreducibleError

Ошибка = (систематическое смещение)² + (нестабильность) + (шум)

Пример:

# Несколько наборов данных
biases = []
variances = []

for _ in range(100):
    # Генерируем новый набор данных с тем же распределением
    X_new = np.linspace(0, 10, 50).reshape(-1, 1)
    y_new = np.sin(X_new).ravel() + 0.1 * np.random.randn(50)
    
    model = LinearRegression()  # высокий bias
    model.fit(X_new, y_new)
    y_pred = model.predict(X_new)
    
    biases.append(np.mean(y_pred) - np.mean(np.sin(X_new)))  # bias
    variances.append(np.var(y_pred))  # variance

print(f"Средний bias: {np.mean(np.abs(biases)):.4f}")
print(f"Средний variance: {np.mean(variances):.4f}")

Bias vs Variance: Практическое руководство

ПроблемаПризнакРешение
Высокий BiasTrain ошибка высокаУсложнить модель, добавить признаки
Train и Val ошибка близки и оба высокиБольше итераций, больше данных
Недообучение (underfitting)Выбрать более гибкий алгоритм
Высокий VarianceVal ошибка >> Train ошибкаРегуляризация, меньше параметров
Переобучение (overfitting)Dropout, Early Stopping
Модель очень нестабильнаКросс-валидация, ансамбли

Вывод

Высокий bias означает:

  • Модель СИСТЕМАТИЧЕСКИ ошибается в одну сторону
  • Модель не может захватить сложность данных
  • Плохая производительность даже на обучающем наборе
  • Решение: сделать модель более гибкой

Высокий bias — проблема недообучения, когда модель слишком простая для задачи. Это противоположность переобучению (высокий variance), где модель слишком сложная. Идеальная модель балансирует между этими двумя экстремумами.

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