Стаціонарність і стабільність

Machine Learning для часових рядів у Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Стаціонарність

  • Стаціонарні часові ряди не змінюють свої статистичні властивості з часом
  • Напр., середнє, стандартне відхилення, тренди
  • Більшість часових рядів певною мірою нестаціонарні
Machine Learning для часових рядів у Python

Machine Learning для часових рядів у Python

Стабільність моделі

  • Нестаціонарність даних підвищує варіабельність моделі
  • Статистичні властивості, які знаходить модель, можуть змінюватися з даними
  • Крім того, ми менш упевнені в правильних значеннях параметрів моделі
  • Як це кількісно оцінити?
Machine Learning для часових рядів у Python

Крос-валідація для оцінки стабільності параметрів

  • Один підхід: використати крос-валідацію
  • Обчисліть параметри моделі на кожній ітерації
  • Оцініть стабільність параметрів у всіх розбиттях CV
Machine Learning для часових рядів у Python

Bootstrap для середнього

  • Bootstrap — поширений спосіб оцінити варіабельність
  • Bootstrap:
    1. Візьміть випадкову вибірку даних із поверненням
    2. Обчисліть середнє вибірки
    3. Повторіть багато разів (тисячі)
    4. Обчисліть перцентилі результату (зазвичай 2,5; 97,5)

Результат — 95% довірчий інтервал для середнього кожного коефіцієнта.

Machine Learning для часових рядів у Python

Bootstrap для середнього

from sklearn.utils import resample

# cv_coefficients has shape (n_cv_folds, n_coefficients)
n_boots = 100
bootstrap_means = np.zeros(n_boots, n_coefficients)
for ii in range(n_boots):
    # Generate random indices for our data with replacement, 
    # then take the sample mean
    random_sample = resample(cv_coefficients)
    bootstrap_means[ii] = random_sample.mean(axis=0)

# Compute the percentiles of choice for the bootstrapped means
percentiles = np.percentile(bootstrap_means, (2.5, 97.5), axis=0)
Machine Learning для часових рядів у Python

Візуалізація bootstrap-коефіцієнтів

fig, ax = plt.subplots()
ax.scatter(many_shifts.columns, percentiles[0], marker='_', s=200)
ax.scatter(many_shifts.columns, percentiles[1], marker='_', s=200)

Machine Learning для часових рядів у Python

Оцінка стабільності якості моделі

  • Якщо використовуєте TimeSeriesSplit, можна побудувати графік оцінки моделі в часі
  • Це допомагає знайти періоди, що занижують оцінку
  • Також корисно для виявлення нестаціонарних сигналів
Machine Learning для часових рядів у Python

Якість моделі в часі

def my_corrcoef(est, X, y):
    """Return the correlation coefficient 
    between model predictions and a validation set."""
    return np.corrcoef(y, est.predict(X))[1, 0]

# Grab the date of the first index of each validation set
first_indices = [data.index[tt[0]] for tr, tt in cv.split(X, y)]

# Calculate the CV scores and convert to a Pandas Series
cv_scores = cross_val_score(model, X, y, cv=cv, scoring=my_corrcoef)
cv_scores = pd.Series(cv_scores, index=first_indices)
Machine Learning для часових рядів у Python

Візуалізація оцінок моделі як часового ряду

fig, axs = plt.subplots(2, 1, figsize=(10, 5), sharex=True)

# Calculate a rolling mean of scores over time
cv_scores_mean = cv_scores.rolling(10, min_periods=1).mean()
cv_scores.plot(ax=axs[0])
axs[0].set(title='Validation scores (correlation)', ylim=[0, 1])

# Plot the raw data
data.plot(ax=axs[1])
axs[1].set(title='Validation data')
Machine Learning для часових рядів у Python

Візуалізація оцінок моделі

Machine Learning для часових рядів у Python

Фіксовані вікна в крос-валідації часових рядів

# Only keep the last 100 datapoints in the training data
window = 100

# Initialize the CV with this window size
cv = TimeSeriesSplit(n_splits=10, max_train_size=window)
Machine Learning для часових рядів у Python

Нестаціонарні сигнали

Machine Learning для часових рядів у Python

Давайте потренуємось!

Machine Learning для часових рядів у Python

Preparing Video For Download...