Собесов

DataLearn ML-101: Bias-variance tradeoff на пальцах

ML / Data ScienceОсновы MLЛёгкаяJunior

Условие

Объясните bias-variance tradeoff. Как он связан с переобучением и недообучением? Как поведут себя bias и variance при: (а) увеличении глубины дерева; (б) добавлении регуляризации в линейную модель; (в) усреднении прогноза нескольких моделей (bagging)?

Решение

Подход

Любая ошибка модели в точке x раскладывается:

E[(y - ŷ(x))²] = Bias[ŷ(x)]² + Var[ŷ(x)] + σ²_noise
  • Bias — систематическая ошибка модели: насколько среднее предсказание (по разным обучающим выборкам) отличается от истинного f(x).
  • Variance — насколько прогноз «болтается» от выборки к выборке.
  • Noise — несократимая ошибка из-за шума в данных.

Интуиция

  • Слишком простая модель (linear на нелинейных данных): высокий bias, низкая variance → недообучение.
  • Слишком сложная (глубокое дерево на 100 объектах): низкий bias, высокая variance → переобучение.
  • Сладкая точка — баланс.

По кейсам

(а) Глубина дерева ↑:

  • bias ↓ (модель ловит больше нелинейностей),
  • variance ↑ (каждое разбиение чувствительно к конкретным точкам).

(б) Регуляризация (L2/L1) сильнее:

  • bias ↑ (коэффициенты сжимаются — модель отходит от данных),
  • variance ↓ (меньше зависимость от случайных шумов).

(в) Bagging (усреднение N деревьев):

  • bias ≈ тот же (среднее несмещённых = несмещённое),
  • variance ↓ в ~N раз при независимости (для коррелированных деревьев меньше).
  • Random Forest = bagging + рандомизация фич → ещё меньшая корреляция между деревьями → ещё ниже variance.

Эмпирически

from sklearn.datasets import make_friedman1
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import cross_val_score
import numpy as np
 
X, y = make_friedman1(n_samples=500, noise=1.0, random_state=0)
 
for depth in [1, 2, 4, 6, 8, 12, None]:
    cv = cross_val_score(DecisionTreeRegressor(max_depth=depth, random_state=0),
                         X, y, scoring="neg_mean_squared_error", cv=5)
    print(f"depth={depth!s:>5}  CV MSE = {-cv.mean():.2f}  σ = {cv.std():.2f}")

Видно U-образную кривую: при малой глубине ошибка велика из-за bias, при большой — из-за variance.

Когда что важнее

  • Мало данных (n=100) → variance доминирует → проще модель, регуляризация.
  • Много данных (n=10⁶) → variance мала → можно сложную модель (deep learning).
  • Шум в y высок → variance растёт, помогают ансамбли и регуляризация.

Подводные камни

  1. «Сложнее = лучше» — мифу 30 лет, не сдаётся. Сложность без данных = variance.
  2. CV ≠ test set: CV даёт оценку ожидаемой ошибки, но variance оценить точнее на множестве независимых train-выборок.
  3. Bagging на сильно скоррелированных моделях не уменьшает variance — отсюда random feature subset в Random Forest.
  4. Boosting уменьшает bias (последовательно учится на ошибках), а не variance — поэтому переобучается при больших n_estimators.
  5. L1 vs L2: L2 (Ridge) сжимает все веса → плавно увеличивает bias; L1 (Lasso) обнуляет часть → даёт спарсификацию + bias.
  6. Bias-variance для классификации — формула другая (0-1 loss разложение не идентично), но интуиция та же.

Эталонный ответ

Error = Bias² + Variance + Noise. Переобучение = низкий bias, высокая variance. Недообучение = наоборот.

(а) Глубина дерева ↑: bias ↓, variance ↑. (б) Регуляризация ↑: bias ↑, variance ↓. (в) Bagging: bias почти не меняется, variance ↓ в N раз для некоррелированных моделей.

Цель ML — найти такой компромисс, чтобы суммарная ошибка минимальна (U-образная кривая по сложности).

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти