Как обнаружить переобучение в неитеративных алгоритмах (например, дерево решений, случайный лес)?

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

Ответ

Переобучение (high variance) проявляется, когда модель слишком хорошо подстраивается под обучающие данные, включая шум. Методы детекции:

1. Валидационные кривые (Validation Curves): Сравнение производительности на тренировочном и валидационном наборах при изменении ключевого гиперпараметра (например, max_depth дерева).

from sklearn.model_selection import validation_curve
import matplotlib.pyplot as plt

depths = range(1, 20)
train_scores, val_scores = validation_curve(
    RandomForestClassifier(n_estimators=50),
    X, y, param_name='max_depth', param_range=depths, cv=5
)
# Переобучение: train_score высокий, val_score низкий/падает после оптимума
plt.plot(depths, train_scores.mean(axis=1), label='Train')
plt.plot(depths, val_scores.mean(axis=1), label='Validation')

2. Сравнение метрик на train/test: Явный сигнал — большая разница в accuracy/precision/recall.

train_accuracy = accuracy_score(y_train, model.predict(X_train))
test_accuracy = accuracy_score(y_test, model.predict(X_test))
print(f'Train Acc: {train_accuracy:.3f}, Test Acc: {test_accuracy:.3f}')
# Сигнал переобучения: Train Acc >> Test Acc (на 5-10% и более)

3. Анализ кривой обучения (Learning Curve): Показывает, как метрики меняются с увеличением размера обучающей выборки. При переобучении кривая валидации остается далеко от кривой обучения даже на больших данных.

Решение: Упрощение модели (уменьшение max_depth, увеличение min_samples_leaf), добавление регуляризации (в XGBoost/LightGBM — reg_alpha, reg_lambda), сбор большего количества данных.