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

Машинное обучение для данных временных рядов на Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

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

  • Стационарные временны́е ряды не меняют статистических свойств со временем
  • Например: среднее, стандартное отклонение, тренды
  • Большинство временны́х рядов нестационарны в той или иной мере
Машинное обучение для данных временных рядов на Python

Машинное обучение для данных временных рядов на Python

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

  • Нестационарные данные приводят к нестабильности модели
  • Статистические свойства, которые находит модель, могут меняться вместе с данными
  • Кроме того, оценки параметров модели становятся менее определёнными
  • Как это измерить?
Машинное обучение для данных временных рядов на Python

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

  • Один из подходов — кросс-валидация
  • Параметры модели вычисляются на каждой итерации
  • Стабильность параметров оценивается по всем разбиениям
Машинное обучение для данных временных рядов на Python

Бутстрэпирование среднего

  • Бутстрэп — распространённый способ оценки вариабельности
  • Процедура бутстрэпа:
    1. Взять случайную выборку данных с возвращением
    2. Вычислить среднее выборки
    3. Повторить процедуру многократно (тысячи раз)
    4. Вычислить перцентили результата (обычно 2,5 и 97,5)

Результат — 95%-й доверительный интервал среднего каждого коэффициента.

Машинное обучение для данных временных рядов на Python

Бутстрэпирование среднего

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)
Машинное обучение для данных временных рядов на Python

Визуализация бутстрэпированных коэффициентов

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

Машинное обучение для данных временных рядов на Python

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

  • При использовании TimeSeriesSplit можно построить график качества модели во времени
  • Это помогает выявить периоды, которые ухудшают качество
  • Также полезно для обнаружения нестационарных сигналов
Машинное обучение для данных временных рядов на 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)
Машинное обучение для данных временных рядов на 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')
Машинное обучение для данных временных рядов на Python

Визуализация качества модели

Машинное обучение для данных временных рядов на 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)
Машинное обучение для данных временных рядов на Python

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

Машинное обучение для данных временных рядов на Python

Давайте потренируемся!

Машинное обучение для данных временных рядов на Python

Preparing Video For Download...