Estacionariedade e estabilidade

Machine Learning para dados de séries temporais em Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Estacionariedade

  • Séries temporais estacionárias não mudam suas propriedades estatísticas ao longo do tempo
  • Ex.: média, desvio padrão, tendências
  • A maioria das séries é em parte não estacionária
Machine Learning para dados de séries temporais em Python

Machine Learning para dados de séries temporais em Python

Estabilidade do modelo

  • Dados não estacionários geram variabilidade no modelo
  • As propriedades estatísticas que o modelo encontra podem mudar com os dados
  • Além disso, teremos menos certeza sobre os valores corretos dos parâmetros
  • Como quantificar isso?
Machine Learning para dados de séries temporais em Python

Validação cruzada para quantificar a estabilidade dos parâmetros

  • Uma abordagem: usar validação cruzada
  • Calcular os parâmetros do modelo em cada iteração
  • Avaliar a estabilidade dos parâmetros em todos os splits de CV
Machine Learning para dados de séries temporais em Python

Bootstrap da média

  • Bootstrapping é uma forma comum de avaliar variabilidade
  • O bootstrap:
    1. Pegue uma amostra aleatória de dados com reposição
    2. Calcule a média da amostra
    3. Repita muitas vezes (milhares)
    4. Calcule os percentis do resultado (geralmente 2,5 e 97,5)

O resultado é um intervalo de confiança de 95% da média de cada coeficiente.

Machine Learning para dados de séries temporais em Python

Bootstrap da média

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 para dados de séries temporais em Python

Plotando os coeficientes com 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 para dados de séries temporais em Python

Avaliando a estabilidade do desempenho do modelo

  • Com TimeSeriesSplit, dá para plotar o score do modelo ao longo do tempo
  • Útil para achar períodos que prejudicam o score
  • Também ajuda a encontrar sinais não estacionários
Machine Learning para dados de séries temporais em Python

Desempenho do modelo ao longo do tempo

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 para dados de séries temporais em Python

Visualizando scores do modelo como série temporal

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 para dados de séries temporais em Python

Visualizando os scores do modelo

Machine Learning para dados de séries temporais em Python

Janelas fixas com validação cruzada em séries temporais

# 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 para dados de séries temporais em Python

Sinais não estacionários

Machine Learning para dados de séries temporais em Python

Vamos praticar!

Machine Learning para dados de séries temporais em Python

Preparing Video For Download...