Как настроить валидацию модели при предобработке данных?

Ответ

Ключевой принцип — валидация должна имитировать условия применения модели на новых, невиданных данных. Основные методы:

1. Разделение на обучающую и валидационную выборки (Hold-out) Используется для быстрой оценки.

from sklearn.model_selection import train_test_split

# Стандартное разбиение 80/20 или 70/30
X_train, X_val, y_train, y_val = train_test_split(
    X, y,
    test_size=0.2,
    random_state=42,  # для воспроизводимости
    stratify=y        # сохраняет распределение классов (для классификации)
)

2. Кросс-валидация (K-Fold) Более надежная оценка, особенно на небольших наборах данных.

from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier()
scores = cross_val_score(
    model, X, y,
    cv=5,                      # количество фолдов (обычно 5 или 10)
    scoring='accuracy'         # метрика оценки
)
print(f"Средняя точность: {scores.mean():.3f} (±{scores.std():.3f})")

3. Стратифицированная кросс-валидация (Stratified K-Fold) Важно для несбалансированных данных в задачах классификации, чтобы в каждом фолде сохранялась пропорция классов.

from sklearn.model_selection import StratifiedKFold

cv_strategy = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=cv_strategy)

Критически важное правило: Все этапы предобработки (масштабирование, кодирование категориальных признаков, импутация пропусков) должны обучаться только на тренировочном фолде, а затем применяться к валидационному. Используйте Pipeline для автоматизации и предотвращения утечки данных.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('model', RandomForestClassifier())
])
# Теперь кросс-валидация безопасна
scores = cross_val_score(pipeline, X, y, cv=5)