Làm sạch và cải thiện dữ liệu của bạn

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Dữ liệu thường lộn xộn

  • Dữ liệu ngoài đời thực thường lộn xộn
  • Hai vấn đề phổ biến nhất là thiếu dữ liệu và giá trị ngoại lai
  • Thường do lỗi con người, cảm biến hỏng, lỗi cơ sở dữ liệu, v.v.
  • Trực quan hóa dữ liệu thô giúp bạn dễ phát hiện các vấn đề này
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Dữ liệu lộn xộn trông như thế nào

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Nội suy: dùng thời gian để điền dữ liệu thiếu

  • Cách thường dùng để xử lý dữ liệu thiếu là nội suy các giá trị bị thiếu
  • Với dữ liệu chuỗi thời gian, bạn có thể dùng thời gian để hỗ trợ nội suy.
  • Ở đây, nội suy nghĩa là dùng các giá trị đã biết ở hai phía của khoảng trống để ước lượng phần bị thiếu.
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Nội suy trong 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)
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Trực quan hóa dữ liệu đã nội suy

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Dùng cửa sổ trượt để biến đổi dữ liệu

  • Một cách dùng cửa sổ trượt khác là để biến đổi dữ liệu
  • Bạn đã làm điều này một lần để làm mượt dữ liệu
  • Ta cũng có thể dùng nó cho các biến đổi phức tạp hơn
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Biến đổi để chuẩn hóa phương sai

  • Một biến đổi phổ biến là chuẩn hóa trung bình và phương sai theo thời gian. Có nhiều cách để làm.
  • Ở đây, ta sẽ chuyển đổi dữ liệu sao cho mỗi điểm là % thay đổi so với một cửa sổ trước đó.
  • Cách này giúp các mốc thời gian so sánh được với nhau khi giá trị tuyệt đối dao động mạnh
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Biến đổi sang phần trăm thay đổi với 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
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Áp dụng vào dữ liệu của chúng ta

# 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)

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Tìm giá trị ngoại lai trong dữ liệu

  • Giá trị ngoại lai là các điểm dữ liệu khác biệt đáng kể về mặt thống kê so với tập dữ liệu.
  • Chúng có thể làm giảm sức mạnh dự báo của mô hình, khiến mô hình lệch khỏi giá trị "thật"
  • Một cách là loại bỏ hoặc thay thế ngoại lai bằng giá trị đại diện hơn

Hãy thật cẩn trọng khi làm việc này - thường khó phân biệt đâu là giá trị cực trị hợp lệ và đâu là bất thường

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Vẽ ngưỡng trên dữ liệu

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')
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Trực quan hóa ngưỡng ngoại lai

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Thay thế ngoại lai bằng ngưỡng

# 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)

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Trực quan hóa kết quả

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 cho Dữ liệu Chuỗi thời gian bằng Python

Cùng luyện tập nào!

Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Preparing Video For Download...