Очистка и улучшение данных

Машинное обучение для данных временных рядов на Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Данные бывают «грязными»

  • Реальные данные часто бывают «грязными»
  • Две наиболее распространённые проблемы — пропущенные значения и выбросы
  • Они возникают из-за ошибок человека, сбоев датчиков, отказов базы данных и т. д.
  • Визуализация исходных данных помогает обнаружить эти проблемы
Машинное обучение для данных временных рядов на Python

Как выглядят «грязные» данные

Машинное обучение для данных временных рядов на Python

Интерполяция: заполнение пропусков с помощью времени

  • Распространённый способ работы с пропущенными значениями — интерполяция
  • Для временных рядов в качестве основы интерполяции можно использовать время.
  • Интерполяция означает, что по известным значениям по обе стороны от пропуска делаются предположения о недостающих точках.
Машинное обучение для данных временных рядов на Python

Интерполяция в Pandas

# Return a boolean that notes where missing values are
missing = prices.isna()

# Interpolate linearly within missing windows
prices_interp = prices.interpolate('linear')

# Plot the interpolated data in red and the data w/ missing values in black
ax = prices_interp.plot(c='r')
prices.plot(c='k', ax=ax, lw=2)
Машинное обучение для данных временных рядов на Python

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

Машинное обучение для данных временных рядов на Python

Преобразование данных с помощью скользящего окна

  • Скользящие окна можно использовать для преобразования данных
  • Мы уже применяли это для сглаживания данных
  • Однако с их помощью можно выполнять и более сложные преобразования
Машинное обучение для данных временных рядов на Python

Преобразование данных для стандартизации дисперсии

  • Стандартизация среднего и дисперсии по времени — распространённое преобразование данных. Способов для этого существует много.
  • Здесь мы покажем, как представить каждую точку как % изменения относительно предыдущего окна.
  • Это делает временны́е точки более сопоставимыми, если абсолютные значения сильно меняются.
Машинное обучение для данных временных рядов на Python

Преобразование в процентное изменение с помощью Pandas

def percent_change(values):
    """Calculates the % change between the last value 
    and the mean of previous values"""
    # Separate the last value and all previous values into variables
    previous_values = values[:-1]
    last_value = values[-1]

    # Calculate the % difference between the last value 
    # and the mean of earlier values
    percent_change = (last_value - np.mean(previous_values)) \
    / np.mean(previous_values)
    return percent_change
Машинное обучение для данных временных рядов на Python

Применяем преобразование к нашим данным

# Plot the raw data
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
ax = prices.plot(ax=axs[0])

# Calculate % change and plot
ax = prices.rolling(window=20).aggregate(percent_change).plot(ax=axs[1])
ax.legend_.set_visible(False)

Машинное обучение для данных временных рядов на Python

Поиск выбросов в данных

  • Выбросы — это точки данных, которые статистически значительно отличаются от остального набора.
  • Они могут снижать предсказательную силу модели, смещая её от «истинного» значения.
  • Одно из решений — удалить или заменить выбросы более репрезентативным значением.

Будьте осторожны — нередко сложно определить, является ли значение реально экстремальным или это аномалия.

Машинное обучение для данных временных рядов на Python

Нанесение порогового значения на график

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
for data, ax in zip([prices, prices_perc_change], axs):
    # Calculate the mean / standard deviation for the data
    this_mean = data.mean()
    this_std = data.std()

    # Plot the data, with a window that is 3 standard deviations 
    # around the mean
    data.plot(ax=ax)
    ax.axhline(this_mean + this_std * 3, ls='--', c='r')
    ax.axhline(this_mean - this_std * 3, ls='--', c='r')
Машинное обучение для данных временных рядов на Python

Визуализация пороговых значений для выбросов

Машинное обучение для данных временных рядов на Python

Замена выбросов по пороговому значению

# Center the data so the mean is 0
prices_outlier_centered = prices_outlier_perc - prices_outlier_perc.mean()

# Calculate standard deviation
std = prices_outlier_perc.std()

# Use the absolute value of each datapoint 
# to make it easier to find outliers
outliers = np.abs(prices_outlier_centered) > (std * 3)

# Replace outliers with the median value
# We'll use np.nanmean since there may be nans around the outliers
prices_outlier_fixed = prices_outlier_centered.copy()
prices_outlier_fixed[outliers] = np.nanmedian(prices_outlier_fixed)

Машинное обучение для данных временных рядов на Python

Визуализация результатов

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

Машинное обучение для данных временных рядов на Python

Давайте потренируемся!

Машинное обучение для данных временных рядов на Python

Preparing Video For Download...