Stationäritet och stabilitet

Maskininlärning för tidsseriedata i Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Stationäritet

  • Stationära tidsserier förändrar inte sina statistiska egenskaper över tid
  • T.ex. medelvärde, standardavvikelse och trender
  • De flesta tidsserier är icke-stationära i viss mån
Maskininlärning för tidsseriedata i Python

Maskininlärning för tidsseriedata i Python

Modellstabilitet

  • Icke-stationära data skapar variabilitet i modellen
  • De statistiska egenskaper modellen hittar kan förändras med data
  • Vi blir även mer osäkra på korrekta värden för modellparametrarna
  • Hur kan vi kvantifiera detta?
Maskininlärning för tidsseriedata i Python

Korsvalidering för att kvantifiera parameterstabilitet

  • Ett tillvägagångssätt: använd korsvalidering
  • Beräkna modellparametrar för varje iteration
  • Bedöm parameterstabiliteten över alla CV-uppdelningar
Maskininlärning för tidsseriedata i Python

Bootstrapping av medelvärdet

  • Bootstrapping är ett vanligt sätt att mäta variabilitet
  • Bootstrap-metoden:
    1. Ta ett slumpmässigt urval av data med återläggning
    2. Beräkna medelvärdet av urvalet
    3. Upprepa processen många gånger (1000-tals)
    4. Beräkna percentilerna för resultatet (vanligtvis 2,5 och 97,5)

Resultatet är ett 95-procentigt konfidensintervall för medelvärdet av varje koefficient.

Maskininlärning för tidsseriedata i Python

Bootstrapping av medelvärdet

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)
Maskininlärning för tidsseriedata i Python

Visualisera bootstrappade koefficienter

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

Maskininlärning för tidsseriedata i Python

Bedöm modellprestationens stabilitet

  • Med TimeSeriesSplit kan man plotta modellens poäng över tid
  • Det är användbart för att hitta tidsperioder som försämrar poängen
  • Också användbart för att identifiera icke-stationära signaler
Maskininlärning för tidsseriedata i Python

Modellprestanda över tid

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)
Maskininlärning för tidsseriedata i Python

Visualisera modellpoäng som en tidsserie

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')
Maskininlärning för tidsseriedata i Python

Visualisera modellpoäng

Maskininlärning för tidsseriedata i Python

Fasta fönster med tidsseriekorsvalidering

# 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)
Maskininlärning för tidsseriedata i Python

Icke-stationära signaler

Maskininlärning för tidsseriedata i Python

Nu kör vi en övning!

Maskininlärning för tidsseriedata i Python

Preparing Video For Download...