🧠 1️⃣ Переобучение и недообучение: что это и чем грозит
Переобучение (overfitting)
Это ситуация, когда модель слишком хорошо "запоминает" обучающие данные, включая шум и случайности, вместо того чтобы научиться общим закономерностям.
📉На обучающей выборке — отличные результаты,
📉 На новых данных (тест) — плохие.
Признаки:
➖Высокая точность на train
➖Низкая точность на test/val
Как распознать?
➖ Accuracy на train ≈ 99%, на test — 60%.
➖ Модель слишком сложная (например, дерево с глубиной 100).
Последствия: плохая обобщающая способность, низкая надежность на практике.
Недообучение (underfitting)
Когда модель слишком простая, чтобы уловить зависимости в данных.
📉 Плохо работает даже на обучающих данных.
Признаки:
➖Низкая точность на train и test
➖Низкая сложность модели (линейная регрессия для сложной зависимости и т.п.)
Как распознать?
➖Низкие метрики и на train, и на test.
➖Модель слишком простая (например, линейная регрессия для нелинейных данных).
Последствия: модель ничего не "понимает" о задаче.
🧪2️⃣Разделение данных: Train / Validation / Test
➖Train (обучающая выборка)
Используется для обучения модели — на этих данных она "учится".
➖Validation (валидационная выборка)
Нужна для оценки модели в процессе настройки (например, подбора гиперпараметров).
Это помогает выбрать лучший вариант до того, как мы "увидим" тестовые данные.
➖Test (тестовая выборка)
Оценивает финальное качество модели. Мы не трогаем её до самого конца, чтобы получить честную оценку того, как модель будет работать в реальности.
from sklearn.model_selection import train_test_split
# Сначала разделим на train и temp (оставим 20% для валидации и теста)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.2, random_state=42)
# Потом делим temp пополам на val и test
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
👉 Важно: Test-данные нельзя использовать для обучения или настройки! Это «темная лошадка», которая показывает реальное качество модели.
💱 3️⃣Кросс-валидация: что это и как работает
Кросс-валидация — способ более надежно оценить качество модели, особенно когда данных немного.
Как работает:
➖Данные делятся на k частей (фолдов).
➖Модель обучается на k-1 фолдах, а тестируется на оставшемся.
➖Повторяем это k раз, каждый раз с новой тестовой частью.
➖Считаем среднее значение метрики — это финальная оценка.
from sklearn.model_selection import cross_validate, cross_val_score
from sklearn.linear_model import LogisticRegression
# Загрузка данных
x = ... # Фичи
y = ... # Целевая переменная
# Создаем модель
model = LogisticRegression(random_state=42)
# Оценка с кросс-валидацией (5 фолдов)
results = cross_validate(model, x, y, cv=5, scoring='precision')
# Вывод метрик на каждом фолде
print("Precision на каждом фолде:", results['test_score'])
# Краткая версия (только метрики)
scores = cross_val_score(model, x, y, cv=5, scoring='accuracy')
print("Средняя accuracy:", scores.mean())
Что важно:
— cv=5 — число фолдов (часто берут 5 или 10).
— scoring — метрика (accuracy, precision, recall, F1).
Какие значения можно передавать в scoring
Встроенные метрики (строки-идентификаторы):
- Для классификации: 'accuracy', 'precision', 'recall', 'f1', 'roc_auc'.
- Для регрессии: 'r2', 'neg_mean_squared_error', 'neg_mean_absolute_error'.
Пользовательские функции — если стандартные метрики не подходят.
Список или словарь метрик — в cross_validate (например, ['accuracy', 'precision'])
#Overfitting #Underfitting #CrossValidation #AI_in_Progress
