Приведи пример модели с одновременно маленьким смещением и низкой дисперсией.

«Приведи пример модели с одновременно маленьким смещением и низкой дисперсией.» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

На практике моделью, которая при грамотной настройке стремится к низкому смещению (high bias) и низкой дисперсии (high variance), является ансамбль на основе градиентного бустинга, такой как XGBoost или LightGBM. Эти алгоритмы комбинируют силу последовательного исправления ошибок (низкое смещение) с мощными механизмами регуляризации (контроль дисперсии).

Пример с XGBoost для задачи классификации:

import xgboost as xgb
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score
import numpy as np

# Генерация синтетических данных
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Конфигурация XGBoost с акцентом на регуляризацию
model = xgb.XGBClassifier(
    n_estimators=150,
    learning_rate=0.05,           # Малый шаг для плавного обучения
    max_depth=4,                  # Ограничение глубины деревьев (борьба с дисперсией)
    min_child_weight=3,           # Минимальный вес в листе
    subsample=0.8,                # Бэггинг: обучение на 80% данных для каждого дерева
    colsample_bytree=0.8,         # Случайное подмножество признаков для дерева
    reg_alpha=0.5,                # L1-регуляризация
    reg_lambda=1.0,               # L2-регуляризация
    random_state=42,
    use_label_encoder=False,
    eval_metric='logloss'
)

# Оценка стабильности модели с помощью кросс-валидации (низкая дисперсия -> малый разброс scores)
cv_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
print(f"CV Accuracy: {cv_scores.mean():.4f} (+/- {cv_scores.std() * 2:.4f})")

# Обучение и оценка на тесте
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
test_accuracy = accuracy_score(y_test, y_pred)
print(f"Test Accuracy: {test_accuracy:.4f}")

# Анализ важности признаков (как признак низкого смещения - модель использует структуру данных)
import matplotlib.pyplot as plt
xgb.plot_importance(model, max_num_features=10)
plt.show()

Почему это работает:

  • Низкое смещение: Бустинг последовательно строит деревья, которые исправляют ошибки предыдущих, что позволяет очень точно аппроксимировать сложные зависимости в данных.
  • Низкая дисперсия: Параметры max_depth, subsample, colsample_bytree, reg_alpha/lambda жестко контролируют сложность отдельных деревьев и всего ансамбля, предотвращая переобучение на шум. Кросс-валидация с малым стандартным отклонением score подтверждает устойчивость модели.