Очищення та покращення даних

Machine Learning для часових рядів у Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Дані бувають неохайні

  • Реальні дані часто «шумні»
  • Два найчастіші проблеми — це пропуски та викиди
  • Це трапляється через людські помилки, збої сенсорів, відмови БД тощо
  • Візуалізація «сирих» даних допомагає помітити ці проблеми
Machine Learning для часових рядів у Python

Як виглядають «неохайні» дані

Machine Learning для часових рядів у Python

Інтерполяція: заповнення пропусків у часі

  • Поширений підхід до пропусків — інтерполювати відсутні значення
  • У часових рядах можна використати час для інтерполяції
  • Тут інтерполяція — це використання відомих значень по обидва боки прогалини, щоб оцінити пропущене
Machine Learning для часових рядів у Python

Інтерполяція в Pandas

# Повертає булеві значення там, де є пропуски
missing = prices.isna()

# Лінійна інтерполяція в межах вікон із пропусками
prices_interp = prices.interpolate('linear')

# Побудуйте інтерпольовані дані червоним і дані з пропусками — чорним
ax = prices_interp.plot(c='r')
prices.plot(c='k', ax=ax, lw=2)
Machine Learning для часових рядів у Python

Візуалізація інтерпольованих даних

Machine Learning для часових рядів у Python

Перетворення даних ролінговим вікном

  • Ролінгові вікна також застосовують для перетворення даних
  • Ми вже робили це, щоб згладити дані
  • Також можна виконувати складніші перетворення
Machine Learning для часових рядів у Python

Стандартизація дисперсії через перетворення

  • Поширене перетворення — стандартизувати середнє та дисперсію в часі. Способів багато.
  • Тут ми перетворимо набір так, щоб кожна точка була % зміною від попереднього вікна.
  • Це робить моменти часу більш порівнюваними, якщо абсолютні значення сильно змінюються
Machine Learning для часових рядів у Python

Перетворення на % зміну в Pandas

def percent_change(values):
    """Обчислює % зміну між останнім значенням
    та середнім попередніх значень"""
    # Розділіть останнє та попередні значення
    previous_values = values[:-1]
    last_value = values[-1]

    # Обчисліть % різницю між останнім значенням
    # і середнім попередніх значень
    percent_change = (last_value - np.mean(previous_values)) \
    / np.mean(previous_values)
    return percent_change
Machine Learning для часових рядів у Python

Застосуємо це до наших даних

# Побудуйте «сирі» дані
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
ax = prices.plot(ax=axs[0])

# Обчисліть % зміну і побудуйте
ax = prices.rolling(window=20).aggregate(percent_change).plot(ax=axs[1])
ax.legend_.set_visible(False)

Machine Learning для часових рядів у Python

Пошук викидів у ваших даних

  • Викиди — це точки, що статистично суттєво відрізняються від набору.
  • Вони можуть погіршувати прогностичну силу моделі, зміщуючи її від «справжнього» значення
  • Рішення — видалити або замінити викиди на більш репрезентативні значення

Будьте дуже обережні: часто складно відрізнити легітимне екстремальне значення від аномалії

Machine Learning для часових рядів у Python

Нанесення порога на графік

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
for data, ax in zip([prices, prices_perc_change], axs):
    # Обчисліть середнє та стандартне відхилення
    this_mean = data.mean()
    this_std = data.std()

    # Побудуйте дані та поріг у 3 стандартні відхилення
    # навколо середнього
    data.plot(ax=ax)
    ax.axhline(this_mean + this_std * 3, ls='--', c='r')
    ax.axhline(this_mean - this_std * 3, ls='--', c='r')
Machine Learning для часових рядів у Python

Візуалізація порогів викидів

Machine Learning для часових рядів у Python

Заміна викидів за порогом

# Центруйте дані, щоб середнє було 0
prices_outlier_centered = prices_outlier_perc - prices_outlier_perc.mean()

# Обчисліть стандартне відхилення
std = prices_outlier_perc.std()

# Використайте модуль значення кожної точки,
# щоб легше знаходити викиди
outliers = np.abs(prices_outlier_centered) > (std * 3)

# Замініть викиди на медіану
# Використаємо np.nanmean, бо поруч можуть бути NaN
prices_outlier_fixed = prices_outlier_centered.copy()
prices_outlier_fixed[outliers] = np.nanmedian(prices_outlier_fixed)

Machine Learning для часових рядів у Python

Візуалізуйте результати

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
prices_outlier_centered.plot(ax=axs[0])
prices_outlier_fixed.plot(ax=axs[1])

Machine Learning для часових рядів у Python

Давайте потренуємось!

Machine Learning для часових рядів у Python

Preparing Video For Download...