← Назад к вопросам

Что такое time series кросс-валидация?

2.0 Middle🔥 241 комментариев
#Временные ряды#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Time Series Кросс-валидация

Определение

Time Series Cross-Validation — метод разбиения данных для оценки моделей на временных рядах. Сохраняет временной порядок в отличие от стандартной CV.

Почему обычная CV не работает

ПЛОХО: обычная K-Fold CV
train_idx: [5, 23, 67, 12, 89, ...] (случайные дни)
test_idx: [3, 44, 78, 91, ...] (случайные дни)

ПРОБЛЕМА: обучаем на дне 89, тестируем на дне 3
Модель видит будущее → переобучение!

Walk-Forward Validation (правильная)

Fold 1: Train [1-20]     Test [21-30]
Fold 2: Train [1-40]     Test [41-50]
Fold 3: Train [1-60]     Test [61-70]
Fold 4: Train [1-80]     Test [81-90]
Fold 5: Train [1-100]    Test [101-110]

Времени порядок сохранен!
Обучаем на прошлом, тестируем на будущем

Реализация со sklearn

from sklearn.model_selection import TimeSeriesSplit

tscv = TimeSeriesSplit(n_splits=5)

for train_idx, test_idx in tscv.split(X):
    X_train, X_test = X[train_idx], X[test_idx]
    y_train, y_test = y[train_idx], y[test_idx]
    
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)
    print(f"Score: {score:.3f}")

Автоматически сохраняет временной порядок!

Варианты Time Series CV

1. Walk-Forward Validation (самая честная)

Каждая модель обучается на растущем окне истории, тестируется на следующем периоде. Максимально приближено к production использованию.

2. Sliding Window (Fixed-Size Window)

Train: [1-5]   Test: [6-7]
Train: [2-6]   Test: [7-8]
Train: [3-7]   Test: [8-9]

Размер окна фиксирован. Быстрее, но менее реалистично.

3. Out-of-Sample Test Set

Train (60%): [1-60]
Valid (20%): [61-80]
Test (20%): [81-100]

Самый простой, часто используется в practice.

Практический пример: Прогноз цены

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import TimeSeriesSplit

dates = pd.date_range('2023-01-01', periods=252)
price = np.random.cumsum(np.random.randn(252)) + 100

df = pd.DataFrame({
    'date': dates,
    'price': price,
    'lag_1': price.shift(1),
    'lag_5': price.shift(5),
})

X = df[['lag_1', 'lag_5']].fillna(method='bfill')
y = df['price']

tscv = TimeSeriesSplit(n_splits=5)
scores = []

for train_idx, test_idx in tscv.split(X):
    X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
    y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
    
    model = LinearRegression()
    model.fit(X_train, y_train)
    
    score = model.score(X_test, y_test)
    scores.append(score)
    
    print(f"Train: {train_idx[0]}-{train_idx[-1]}, "
          f"Test: {test_idx[0]}-{test_idx[-1]}, "
          f"Score: {score:.3f}")

print(f"Average Score: {np.mean(scores):.3f}")

Важные аспекты

1. Не перемешивай данные

ПЛОХО: shuffle=True
ХОРОШО: shuffle=False (по умолчанию)

2. Учитывай lag и autocorrelation

Если используешь lag_1, убедись что обучение и тестирование разделены достаточно.

3. Сезонность

Используй достаточно fold'ов чтобы покрыть несколько сезонов.

Time Series CV vs Обычная CV

Обычная K-Fold CV:

  • Хорошо для независимых данных
  • Утечка информации из будущего для временных рядов

Time Series CV:

  • Сохраняет временной порядок
  • Имитирует реальное использование
  • Немного медленнее на первых фолдах

Когда использовать

Time Series CV ДЛЯ:

  1. Прогноз цен акций
  2. Прогноз спроса
  3. Прогноз погоды
  4. Любые временные ряды

Обычная CV ДЛЯ:

  1. Классификация изображений
  2. NLP задачи
  3. Табличные данные без временной компоненты

Когда сомневаешься → используй Time Series CV!

Что такое time series кросс-валидация? | PrepBro