Stationariteit en stabiliteit

Machine Learning voor tijdreeksgegevens in Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Stationariteit

  • Stationaire tijdreeksen veranderen hun statistische eigenschappen niet in de tijd
  • Bijv. gemiddelde, standaarddeviatie, trends
  • De meeste tijdreeksen zijn in zekere mate niet-stationair
Machine Learning voor tijdreeksgegevens in Python

Machine Learning voor tijdreeksgegevens in Python

Modelstabiliteit

  • Niet-stationaire data zorgt voor variatie in ons model
  • De statistische eigenschappen die het model vindt, kunnen met de data veranderen
  • We zijn dan ook minder zeker van de juiste parameterwaarden
  • Hoe kwantificeren we dit?
Machine Learning voor tijdreeksgegevens in Python

Cross-validatie om parameterstabiliteit te meten

  • Eén aanpak: gebruik cross-validatie
  • Bereken modelparameters in elke iteratie
  • Beoordeel parameterstabiliteit over alle CV-splits
Machine Learning voor tijdreeksgegevens in Python

De bootstrap van het gemiddelde

  • Bootstrapping is een gangbare manier om variabiliteit te beoordelen
  • De bootstrap:
    1. Neem een willekeurige steekproef met teruglegging
    2. Bereken het gemiddelde van de steekproef
    3. Herhaal dit vaak (duizenden keren)
    4. Bereken de percentielen van het resultaat (meestal 2,5 en 97,5)

Het resultaat is een 95%-betrouwbaarheidsinterval van het gemiddelde van elke coëfficiënt.

Machine Learning voor tijdreeksgegevens in Python

De bootstrap van het gemiddelde

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 voor tijdreeksgegevens in Python

Bootstrapped coëfficiënten plotten

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 voor tijdreeksgegevens in Python

Stabiliteit van modelprestaties beoordelen

  • Met TimeSeriesSplit kun je de score van het model in de tijd plotten
  • Handig om tijdsperioden te vinden die de score schaden
  • Ook nuttig om niet-stationaire signalen te vinden
Machine Learning voor tijdreeksgegevens in Python

Modelprestaties in de tijd

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 voor tijdreeksgegevens in Python

Modelscores als tijdreeks visualiseren

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 voor tijdreeksgegevens in Python

Modelscores visualiseren

Machine Learning voor tijdreeksgegevens in Python

Vaste vensters met time series cross-validatie

# 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 voor tijdreeksgegevens in Python

Niet-stationaire signalen

Machine Learning voor tijdreeksgegevens in Python

Laten we oefenen!

Machine Learning voor tijdreeksgegevens in Python

Preparing Video For Download...