Ответ
В машинном обучении ошибку обобщения модели можно декомпозировать на три фундаментальные составляющие. Понимание этого помогает диагностировать проблемы модели.
-
Смещение (Bias): Это систематическая ошибка, возникающая из-за слишком сильных упрощающих предположений, заложенных в алгоритм. Модель с высоким смещением недостаточно сложна, чтобы выучить паттерны в данных (недообучение).
- Пример: Попытка аппроксимировать квадратичную зависимость прямой линией (линейная регрессия на нелинейных данных). Модель будет ошибаться постоянно и на тренировочных, и на тестовых данных.
- Признаки: Низкая точность как на тренировочном, так и на валидационном наборе.
-
Дисперсия (Variance): Ошибка, вызванная чувствительностью модели к небольшим колебаниям в тренировочном наборе. Модель с высокой дисперсией слишком сложна и "заучивает" тренировочные данные, включая шум (переобучение).
- Пример: Дерево решений без ограничения глубины. Оно построит сложные правила, идеально разделяющие тренировочные точки, но будет делать много ошибок на новых данных.
- Признаки: Высокая точность на тренировочном наборе, но значительно более низкая на валидационном.
-
Неустранимая ошибка (Irreducible Error): Это шум, присущий самим данным. Его невозможно предсказать с помощью любых признаков, которыми мы располагаем. Это теоретический нижний предел ошибки для нашей задачи.
- Пример: Измерение роста человека с помощью сантиметровой ленты всегда имеет небольшую погрешность. Даже идеальная модель не сможет предсказать рост точнее, чем позволяет эта погрешность измерения.
Компромисс смещения и дисперсии (Bias-Variance Tradeoff): Задача — найти модель со оптимальной сложностью, которая минимизирует общую ошибку, балансируя между смещением и дисперсией.
Иллюстрация на Python с полиномиальной регрессией:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
# Генерируем нелинейные данные с шумом
np.random.seed(42)
X = np.random.uniform(-3, 3, 100)
y = 0.5 * X**2 + X + 2 + np.random.normal(0, 1, 100)
X = X.reshape(-1, 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
train_errors, test_errors = [], []
degrees = [1, 2, 10] # Низкое, оптимальное, высокое смещение
for degree in degrees:
poly = PolynomialFeatures(degree=degree)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
model = LinearRegression()
model.fit(X_train_poly, y_train)
train_errors.append(mean_squared_error(y_train, model.predict(X_train_poly)))
test_errors.append(mean_squared_error(y_test, model.predict(X_test_poly)))
# degree=1 (высокое смещение): обе ошибки высоки.
# degree=2 (оптимально): ошибки низкие и близки.
# degree=10 (высокая дисперсия): ошибка на обучении очень низкая, на тесте — высокая.