Можно ли с помощью параметрического статистического теста определить переобучение модели?

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

Ответ

Нет, параметрические тесты (такие как t-тест, ANOVA, z-тест) не предназначены для прямой диагностики переобучения (overfitting). Их цель — проверка статистических гипотез о параметрах распределений (например, о равенстве средних в двух группах).

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

  1. Основной диагностический метод: Сравнение метрик.

    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.metrics import classification_report
    
    # Разделение данных
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
    
    # Обучение модели, склонной к переобучению (глубокие деревья, мало данных)
    model = RandomForestClassifier(n_estimators=200, max_depth=20, min_samples_leaf=1)
    model.fit(X_train, y_train)
    
    # Оценка
    y_train_pred = model.predict(X_train)
    y_test_pred = model.predict(X_test)
    
    print("=== ОТЧЕТ НА ОБУЧАЮЩЕЙ ВЫБОРКЕ ===")
    print(classification_report(y_train, y_train_pred))
    print("n=== ОТЧЕТ НА ТЕСТОВОЙ ВЫБОРКЕ ===")
    print(classification_report(y_test, y_test_pred))
    
    # Ключевой индикатор: высокая точность на train и низкая на test
    train_accuracy = model.score(X_train, y_train)
    test_accuracy = model.score(X_test, y_test)
    print(f"nTrain Accuracy: {train_accuracy:.4f}")
    print(f"Test Accuracy:  {test_accuracy:.4f}")
    print(f"Gap (Train - Test): {train_accuracy - test_accuracy:.4f}")
    # Gap > 0.05-0.1 часто указывает на переобучение
  2. Визуализация кривых обучения (Learning Curves): Самый наглядный способ.

    from sklearn.model_selection import learning_curve
    import matplotlib.pyplot as plt
    import numpy as np
    
    train_sizes, train_scores, test_scores = learning_curve(
        model, X, y, cv=5, n_jobs=-1,
        train_sizes=np.linspace(0.1, 1.0, 10)
    )
    
    train_mean = np.mean(train_scores, axis=1)
    test_mean = np.mean(test_scores, axis=1)
    
    plt.figure(figsize=(10,6))
    plt.plot(train_sizes, train_mean, 'o-', label='Training score')
    plt.plot(train_sizes, test_mean, 's-', label='Cross-validation score')
    plt.xlabel('Training examples')
    plt.ylabel('Score')
    plt.legend()
    plt.grid(True)
    plt.show()

    Интерпретация графика: Если кривая обучения (training score) остается высокой, а кривая валидации (validation score) выходит на низкое плато с большим разрывом между ними — это классический признак переобучения.

Роль статистических тестов: Они могут быть полезны косвенно, например, для проверки значимости различий в производительности двух разных моделей на тестовом наборе (с помощью парного t-теста на результатах кросс-валидации). Но для диагностики переобучения одной модели используются методы, описанные выше.