Stacjonarność i stabilność

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Stacjonarność

  • Stacjonarne szeregi czasowe nie zmieniają swoich właściwości statystycznych w czasie.
  • Np. średnia, odchylenie standardowe, trendy.
  • Większość szeregów czasowych jest w pewnym stopniu niestacjonarna.
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Stabilność modelu

  • Dane niestacjonarne powodują zmienność modelu.
  • Właściwości statystyczne wykryte przez model mogą zmieniać się wraz z danymi.
  • Jesteśmy mniej pewni prawidłowych wartości parametrów modelu.
  • Jak to skwantyfikować?
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Kroswalidacja do oceny stabilności parametrów

  • Jedno podejście: kroswalidacja.
  • Obliczanie parametrów modelu w każdej iteracji.
  • Ocena stabilności parametrów we wszystkich podziałach CV.
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Bootstrapping średniej

  • Bootstrapping to popularny sposób oceny zmienności.
  • Metoda bootstrapowa:
    1. Losowa próba danych ze zwracaniem.
    2. Obliczenie średniej z próby.
    3. Powtórzenie procesu wiele razy (tysiące).
    4. Obliczenie percentyli wyników (zazwyczaj 2,5 i 97,5).

Wynikiem jest 95% przedział ufności dla średniej każdego współczynnika.

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Bootstrapping średniej

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)
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Wizualizacja bootstrapowanych współczynników

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

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Ocena stabilności wydajności modelu

  • Przy TimeSeriesSplit można wykreślić wynik modelu w czasie.
  • Pomaga to zidentyfikować okresy obniżające wynik.
  • Przydatne również do wykrywania niestacjonarnych sygnałów.
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Wydajność modelu w czasie

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)
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Wizualizacja wyników modelu jako szeregu czasowego

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')
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Wizualizacja wyników modelu

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Stałe okna w kroswalidacji szeregów czasowych

# 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)
Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Sygnały niestacjonarne

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Czas na ćwiczenia!

Uczenie maszynowe dla danych szeregów czasowych w Pythonie

Preparing Video For Download...