Xác thực chéo dữ liệu chuỗi thời gian

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

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Xác thực chéo với scikit-learn

# Lặp qua phương thức "split" cho ra chỉ số train/test
for tr, tt in cv.split(X, y):
    model.fit(X[tr], y[tr])
    model.score(X[tt], y[tt])
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Các loại xác thực chéo: KFold

  • Xác thực chéo KFold chia dữ liệu của bạn thành nhiều "fold" có kích thước bằng nhau
  • Đây là một trong những quy trình xác thực chéo phổ biến nhất

      from sklearn.model_selection import KFold
      cv = KFold(n_splits=5)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Trực quan hóa dự đoán của mô hình

fig, axs = plt.subplots(2, 1)

# Vẽ các chỉ số được chọn cho tập kiểm định ở mỗi vòng lặp
axs[0].scatter(tt, [0] * len(tt), marker='_', s=2, lw=40)
axs[0].set(ylim=[-.1, .1], title='Chỉ số tập kiểm định (màu = vòng lặp CV)', 
           xlabel='Chỉ số dữ liệu gốc')

# Vẽ dự đoán của mô hình ở mỗi vòng lặp
axs[1].plot(model.predict(X[tt]))
axs[1].set(title='Dự đoán trên tập kiểm định ở mỗi vòng lặp CV', 
           xlabel='Chỉ số dự đoán')
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Trực quan hóa hành vi CV kiểu KFold

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

Lưu ý về việc xáo trộn dữ liệu

  • Nhiều bộ lặp CV cho phép xáo trộn dữ liệu trong quy trình xác thực chéo.
  • Chỉ phù hợp khi dữ liệu là i.i.d., điều mà chuỗi thời gian thường không có.
  • Bạn không nên xáo trộn dữ liệu khi dự đoán với chuỗi thời gian.

      from sklearn.model_selection import ShuffleSplit
    
      cv = ShuffleSplit(n_splits=3)
      for tr, tt in cv.split(X, y):
          ...
    
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Trực quan hóa hành vi CV khi xáo trộn

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

Dùng bộ lặp CV cho chuỗi thời gian

  • Đến giờ, ta đã phá vỡ tính tuyến tính của thời gian trong xác thực chéo
  • Tuy nhiên, bạn thường không nên dùng điểm dữ liệu ở tương lai để dự đoán quá khứ
  • Cách tiếp cận: luôn dùng dữ liệu huấn luyện trong quá khứ để dự đoán tương lai
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Trực quan hóa bộ lặp xác thực chéo chuỗi thời gian

# Import và khởi tạo bộ lặp xác thực chéo
from sklearn.model_selection import TimeSeriesSplit
cv = TimeSeriesSplit(n_splits=10)

fig, ax = plt.subplots(figsize=(10, 5))
for ii, (tr, tt) in enumerate(cv.split(X, y)):
    # Vẽ chỉ số train và test
    l1 = ax.scatter(tr, [ii] * len(tr), c=[plt.cm.coolwarm(.1)], 
                    marker='_', lw=6)
    l2 = ax.scatter(tt, [ii] * len(tt), c=[plt.cm.coolwarm(.9)], 
                    marker='_', lw=6)
    ax.set(ylim=[10, -1], title='Hành vi TimeSeriesSplit', 
           xlabel='chỉ số dữ liệu', ylabel='vòng lặp CV')
    ax.legend([l1, l2], ['Train', 'Validation'])
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Trực quan hóa bộ lặp TimeSeriesSplit

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

Hàm chấm điểm tùy chỉnh trong scikit-learn

def myfunction(estimator, X, y):
    y_pred = estimator.predict(X)
    my_custom_score = my_custom_function(y_pred, y)
    return my_custom_score
Machine Learning cho Dữ liệu Chuỗi thời gian bằng Python

Hàm tương quan tùy chỉnh cho scikit-learn

def my_pearsonr(est, X, y):
    # Tạo dự đoán và chuyển thành vector
    y_pred = est.predict(X).squeeze()

    # Dùng hàm numpy "corrcoef" để tính ma trận tương quan
    my_corrcoef_matrix = np.corrcoef(y_pred, y.squeeze())

    # Trả về một giá trị tương quan từ ma trận
    my_corrcoef = my_corrcoef[1, 0]
    return my_corrcoef
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...