Что такое time series кросс-валидация?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 ДЛЯ:
- Прогноз цен акций
- Прогноз спроса
- Прогноз погоды
- Любые временные ряды
Обычная CV ДЛЯ:
- Классификация изображений
- NLP задачи
- Табличные данные без временной компоненты
Когда сомневаешься → используй Time Series CV!