Как правильно разделить датасет на обучающую и тестовую выборки?

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

Ответ

Корректное разделение критично для оценки модели. Основные методы:

  • train_test_split: Базовый метод для случайного разделения.

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(
        X, y,
        test_size=0.2,          # 80% train, 20% test
        random_state=42,        # для воспроизводимости
        stratify=y              # сохраняет распределение классов (важно при дисбалансе)
    )
  • Временные ряды (TimeSeriesSplit): Для данных с временной зависимостью нельзя перемешивать. Разделение идет по времени.

    from sklearn.model_selection import TimeSeriesSplit
    tscv = TimeSeriesSplit(n_splits=5)
    for train_index, test_index in tscv.split(X):
        X_train, X_test = X[train_index], X[test_index]
  • Кросс-валидация (KFold, StratifiedKFold): Лучше при малом объеме данных. StratifiedKFold стратифицирует разбиения.

    from sklearn.model_selection import StratifiedKFold
    skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

Ключевой принцип: Тестовая выборка должна имитировать "будущие" данные, которые модель не видела при обучении.