Chuỗi thời gian cheat sheet python

Hướng dẫn thực hành và khuôn khổ để sử dụng bất kỳ mô hình scikit-learning nào cho dự báo chuỗi thời gian trong Python

Ảnh của Yu Wang trên BaptGiới thiệu

Có nhiều cái gọi là mô hình truyền thống để dự báo chuỗi thời gian, chẳng hạn như họ mô hình SARIMAX, làm mịn theo cấp số nhân hoặc BATS và TBATS

Tuy nhiên, rất ít lần chúng tôi đề cập đến các mô hình học máy phổ biến nhất cho hồi quy, chẳng hạn như cây quyết định, rừng ngẫu nhiên, tăng cường độ dốc hoặc thậm chí là bộ hồi quy vectơ hỗ trợ. Chúng tôi thấy các mô hình này được áp dụng rộng rãi trong các bài toán hồi quy điển hình, nhưng không phải để dự báo chuỗi thời gian

Do đó lý do của bài viết này. Ở đây, chúng tôi thiết kế một khung để đóng khung vấn đề chuỗi thời gian dưới dạng vấn đề học tập có giám sát, cho phép chúng tôi sử dụng bất kỳ mô hình nào chúng tôi muốn từ thư viện yêu thích của mình. scikit-học

Đến cuối bài viết này, bạn sẽ có các công cụ và kiến ​​thức để áp dụng bất kỳ mô hình học máy nào cho dự báo chuỗi thời gian cùng với các mô hình thống kê được đề cập ở trên

Bắt đầu nào

Mã nguồn đầy đủ có sẵn trên GitHub

Tìm hiểu các kỹ thuật phân tích chuỗi thời gian mới nhất với cheat sheet chuỗi thời gian miễn phí của tôi bằng Python. Triển khai các kỹ thuật thống kê và học sâu, tất cả đều bằng Python và TensorFlow

Chuẩn bị tập dữ liệu

Đầu tiên, chúng tôi nhập tất cả các thư viện cần thiết để hoàn thành hướng dẫn của chúng tôi

import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

Ở đây, chúng tôi sử dụng thư viện statsmodels để nhập tập dữ liệu, đó là nồng độ CO2 hàng tuần từ 1958 đến 2001

data = sm.datasets.co2.load_pandas().data

Bước đầu tiên tốt là trực quan hóa dữ liệu của chúng tôi bằng khối mã sau

fig, ax = plt.subplots(figsize=(16, 11))ax.plot(data['co2'])
ax.set_xlabel('Time')
ax.set_ylabel('CO2 concentration (ppmw)')
fig.autofmt_xdate()
plt.tight_layout()

Nồng độ CO2 hàng tuần (ppmv) từ 1958 đến 2001. Chúng tôi nhận thấy rằng có một tính thời vụ rõ ràng trong dữ liệu, do các mùa (nồng độ CO2 vào mùa đông cao hơn vào mùa hè). Ngoài ra còn có một xu hướng tích cực rõ ràng và chúng tôi nhận thấy một số dữ liệu bị thiếu ở phần đầu của bộ dữ liệu. Hình ảnh của tác giả

Từ hình ảnh trên, chúng tôi nhận thấy xu hướng tích cực rõ ràng trong dữ liệu, vì nồng độ đang tăng theo thời gian. Chúng tôi cũng quan sát một mô hình theo mùa hàng năm. Điều này là do sự thay đổi của các mùa, trong đó nồng độ CO2 cao hơn trong mùa đông so với mùa hè. Cuối cùng, chúng tôi thấy một số dữ liệu bị thiếu ở đầu tập dữ liệu

Sau đó, hãy xử lý dữ liệu bị thiếu đó bằng phép nội suy. Chúng tôi sẽ chỉ cần thực hiện phép nội suy tuyến tính giữa hai điểm đã biết để điền vào các giá trị còn thiếu

data = data.interpolate()

Bây giờ chúng tôi không có dữ liệu bị thiếu, chúng tôi đã sẵn sàng để bắt đầu lập mô hình

Lập mô hình với scikit-learning

Như bạn sẽ thấy, thách thức lớn nhất trong dự báo chuỗi thời gian với scikit-learning là thiết lập vấn đề một cách chính xác

Có 3 cách khác nhau để chúng ta có thể định hình bài toán dự báo chuỗi thời gian dưới dạng bài toán học có giám sát

  1. Dự đoán bước thời gian tiếp theo bằng cách sử dụng quan sát trước đó
  2. Dự đoán bước thời gian tiếp theo bằng cách sử dụng một chuỗi các quan sát trong quá khứ
  3. Dự đoán một chuỗi các bước thời gian trong tương lai bằng cách sử dụng một chuỗi các quan sát trong quá khứ

Hãy khám phá chi tiết từng tình huống

Dự đoán bước thời gian tiếp theo bằng cách sử dụng quan sát trước đó

Đây là thiết lập cơ bản nhất. Mô hình đưa ra dự đoán cho bước thời gian tiếp theo, chỉ dựa trên quan sát trước đó, như thể hiện trong hình bên dưới

Với quan sát trước đó, mô hình được đào tạo để dự đoán bước thời gian tiếp theo. Hình ảnh của tác giả

Đây là một trường hợp sử dụng đơn giản với ít ứng dụng thực tế, vì một mô hình có thể sẽ không học được bất cứ điều gì từ lần quan sát trước đó. Tuy nhiên, nó đóng vai trò là điểm khởi đầu tốt để giúp chúng tôi hiểu các tình huống phức tạp hơn sau này

Vì vậy, tại thời điểm này, tập dữ liệu của chúng tôi trông như thế này

Hình ảnh của tác giả

Cái nào không hữu ích lắm. Phải, tất cả các giá trị nằm trong một cột, nhưng chúng ta cần định dạng tập dữ liệu sao cho quan sát hiện tại là một tính năng để dự đoán quan sát tiếp theo (mục tiêu)

Do đó, chúng tôi thêm một cột thứ hai chỉ đơn giản là dịch chuyển cột co2 sao cho giá trị trong năm 1958–03–29 hiện là công cụ dự báo cho giá trị trong năm 1958–04–05

df = data.copy()df['y'] = df['co2'].shift(-1)

Tập dữ liệu không được định dạng dưới dạng bài toán học có giám sát trong đó quan sát hiện tại là một đối tượng và quan sát tiếp theo là mục tiêu. Hình ảnh của tác giả

Như bạn có thể, tập dữ liệu của chúng tôi hiện được định dạng sao cho mỗi lần quan sát hiện tại là một yếu tố dự báo cho lần quan sát tiếp theo. Lưu ý rằng chúng tôi có một giá trị bị thiếu ở phần cuối của tập dữ liệu. Điều này là bình thường đối với lần quan sát được biết đến gần đây nhất. Chúng tôi sẽ xóa hàng này trong một bước trong tương lai

Hiện tại, hãy tách tập dữ liệu của chúng ta thành tập huấn luyện và tập kiểm tra để chạy các mô hình của chúng ta và đánh giá chúng. Ở đây, chúng tôi sử dụng dữ liệu của hai năm qua cho tập huấn luyện. Vì chúng tôi có dữ liệu hàng tuần và có 52 tuần trong một năm, điều đó có nghĩa là 104 mẫu cuối cùng được lưu giữ cho bộ thử nghiệm

train = df[:-104]
test = df[-104:]
test = test.drop(test.tail(1).index) # Drop last row

mô hình cơ sở

Tất nhiên, chúng tôi cần một mô hình cơ sở để xác định xem sử dụng các mô hình học máy có tốt hơn không. Ở đây, chúng ta dự đoán một cách ngây thơ rằng quan sát tiếp theo sẽ có cùng giá trị với quan sát hiện tại

Nói cách khác, chúng tôi chỉ cần đặt cột co2 làm dự đoán cơ sở của mình

test = test.copy()
test['baseline_pred'] = test['co2']

Dự đoán cơ sở chỉ đơn giản là lặp lại quan sát đã biết trong tương lai. Hình ảnh của tác giả

Tuyệt quá. Hoàn thành xong bước này, hãy chuyển sang các mô hình phức tạp hơn

cây quyết định

Ở đây, hãy áp dụng một hồi quy cây quyết định. Mô hình này có thể được thay thế bằng bất kỳ mô hình nào bạn muốn từ thư viện scikit-learning. Lưu ý rằng chúng tôi sử dụng trạng thái ngẫu nhiên để đảm bảo khả năng tái tạo

from sklearn.tree import DecisionTreeRegressorX_train = train['co2'].values.reshape(-1,1)
y_train = train['y'].values.reshape(-1,1)
X_test = test['co2'].values.reshape(-1,1)
# Initialize the model
dt_reg = DecisionTreeRegressor(random_state=42)
# Fit the model
dt_reg.fit(X=X_train, y=y_train)
# Make predictions
dt_pred = dt_reg.predict(X_test)
# Assign predictions to a new column in test
test['dt_pred'] = dt_pred

Bộ kiểm tra hiện có các dự đoán đến từ mô hình cây quyết định. Hình ảnh của tác giả

Lưu ý rằng chúng tôi giữ cho phần lập mô hình đơn giản. Chúng tôi không thực hiện bất kỳ điều chỉnh xác thực chéo hoặc siêu tham số nào, mặc dù những kỹ thuật đó có thể được áp dụng bình thường ở đây, giống như trong bất kỳ vấn đề hồi quy nào khác

Vui lòng áp dụng những kỹ thuật đó và xem liệu bạn có thể đạt được hiệu suất tốt hơn không

Tăng cường độ dốc

Để thử các mô hình khác nhau, bây giờ hãy áp dụng tăng cường độ dốc

________số 8

Bộ kiểm tra hiện có các dự đoán từ mô hình tăng cường độ dốc. Hình ảnh của tác giả

Tuyệt quá. Bây giờ chúng tôi có dự đoán từ hai mô hình học máy và đường cơ sở. Đã đến lúc đánh giá hiệu suất của từng phương pháp

Sự đánh giá

Ở đây, chúng tôi sử dụng sai số phần trăm tuyệt đối trung bình (MAPE). Đây là một thước đo lỗi đặc biệt mang tính thông tin, vì nó trả về một tỷ lệ phần trăm, rất dễ diễn giải. Đảm bảo chỉ áp dụng nó khi bạn không có giá trị gần bằng 0, đó là trường hợp ở đây

Thật không may, MAPE chưa được triển khai trong scikit-learning, vì vậy chúng tôi phải xác định chức năng bằng tay

def mape(y_true, y_pred):
return round(np.mean(np.abs((y_true - y_pred) / y_true)) * 100, 2)

Sau đó, chúng ta có thể đánh giá từng mô hình và tạo biểu đồ thanh sau

data = sm.datasets.co2.load_pandas().data
0

MAPE cho từng phương pháp dự báo. Ở đây, đường cơ sở mang lại hiệu suất tốt nhất vì nó có MAPE thấp nhất. Hình ảnh của tác giả

Nhìn vào hình trên, chúng ta thấy rằng đường cơ sở có hiệu suất tốt nhất, vì nó có MAPE thấp nhất. Điều này có ý nghĩa vì nồng độ CO2 dường như không thay đổi đáng kể từ tuần này sang tuần khác

Trong trường hợp này, việc sử dụng các mô hình học máy không mang lại cho chúng tôi bất kỳ giá trị gia tăng nào. Một lần nữa, điều này có thể là do mô hình chỉ học từ một quan sát để đưa ra dự đoán. Có thể tốt hơn nếu cung cấp cho nó một chuỗi làm đầu vào, để dự đoán bước thời gian tiếp theo

Điều này đưa chúng ta đến kịch bản tiếp theo

Dự đoán bước thời gian tiếp theo bằng cách sử dụng một chuỗi các quan sát trong quá khứ

Như chúng ta đã thấy trong ví dụ trước, việc sử dụng một lần quan sát để dự đoán bước thời gian tiếp theo không hiệu quả lắm. Bây giờ, hãy thử sử dụng một chuỗi làm đầu vào cho mô hình và dự đoán bước thời gian tiếp theo, như minh họa bên dưới

Lược đồ của một mô hình lấy chuỗi đầu vào để dự đoán bước thời gian tiếp theo. Hình ảnh của tác giả

Một lần nữa, chúng ta phải định dạng tập dữ liệu của mình sao cho chúng ta có một chuỗi các quan sát trong quá khứ đóng vai trò là yếu tố dự báo cho bước thời gian tiếp theo

Chúng ta có thể dễ dàng viết một hàm cộng các cột đã dịch chuyển để có được độ dài đầu vào mong muốn

data = sm.datasets.co2.load_pandas().data
1

Hãy sử dụng chức năng này để có đầu vào là 5 quan sát để dự đoán bước thời gian tiếp theo

data = sm.datasets.co2.load_pandas().data
2

tập dữ liệu kết quả. Như bạn có thể thấy, bây giờ chúng ta có 5 quan sát đóng vai trò là yếu tố dự báo cho bước thời gian tiếp theo. Hình ảnh của tác giả

Nhìn vào hình trên, chúng ta có thể thấy rằng tập dữ liệu của chúng ta được sắp xếp theo cách mà chúng ta có năm quan sát để dự đoán bước thời gian tiếp theo, được lưu trữ trong cột y

Điều này về cơ bản sẽ giải quyết phần khó nhất. Bây giờ, vấn đề đơn giản là áp dụng các mô hình khác nhau và xem mô hình nào hoạt động tốt nhất

Trước khi chuyển sang bước đó, trước tiên hãy chia dữ liệu của chúng tôi thành một tập huấn luyện và một tập kiểm tra

data = sm.datasets.co2.load_pandas().data
3

mô hình cơ sở

Một lần nữa, hãy xác định một mô hình cơ sở cho tình huống này. Ở đây, chúng ta sẽ chỉ dự đoán giá trị trung bình của chuỗi đầu vào

data = sm.datasets.co2.load_pandas().data
4

cây quyết định

Một lần nữa, hãy áp dụng một hồi quy cây quyết định. Điều này đơn giản như việc thực hiện trước đó

data = sm.datasets.co2.load_pandas().data
5

Tăng cường độ dốc

Để đảm bảo tính nhất quán, chúng ta cũng hãy thử tăng cường độ dốc

data = sm.datasets.co2.load_pandas().data
6

Sự đánh giá

Bây giờ chúng ta có thể đánh giá hiệu suất của từng mô hình. Một lần nữa, chúng tôi sử dụng MAPE và vẽ các kết quả trong biểu đồ thanh. Đây thực chất là mã giống như trước đây

data = sm.datasets.co2.load_pandas().data
7

MAPE cho các phương pháp dự báo khác nhau sử dụng năm quan sát để dự đoán bước thời gian tiếp theo. Chống lại, các mô hình học máy không vượt trội so với đường cơ sở. Hình ảnh của tác giả

Đáng ngạc nhiên, từ hình trên, chúng tôi thấy rằng các mô hình học máy không hoạt động tốt hơn so với đường cơ sở

Mặc dù điều chỉnh siêu tham số có khả năng làm tăng hiệu suất của các mô hình ML, nhưng tôi nghi ngờ rằng cửa sổ nhập liệu quá ngắn. Dữ liệu đầu vào trong năm tuần không đủ để mô hình bắt kịp xu hướng và các thành phần theo mùa, vì vậy chúng tôi có thể cần một khoảng thời gian dài hơn

Chúng tôi sẽ thử chính xác điều đó trong kịch bản tiếp theo

Dự đoán một chuỗi các bước thời gian trong tương lai bằng cách sử dụng một chuỗi các quan sát trong quá khứ

Kịch bản cuối cùng là sử dụng một chuỗi các quan sát để dự đoán một chuỗi các bước thời gian trong tương lai, như hình bên dưới

Giản đồ của một mô hình lấy một chuỗi đầu vào và dự đoán một chuỗi các bước thời gian trong tương lai. Hình ảnh của tác giả

Ở đây, mô hình của chúng tôi được yêu cầu đưa ra một chuỗi các dự đoán. Đây có thể được coi là một bài toán hồi quy đa đầu ra

Vì vậy, bước đầu tiên là định dạng tập dữ liệu của chúng tôi một cách thích hợp. Chúng tôi phát triển một hàm khác sử dụng phương pháp dịch chuyển để định dạng tập dữ liệu dưới dạng bài toán hồi quy nhiều đầu ra

data = sm.datasets.co2.load_pandas().data
8

Ở đây, chúng ta sẽ sử dụng chuỗi 26 quan sát để dự đoán 26 bước thời gian tiếp theo. Nói cách khác, chúng tôi nhập nửa năm để dự đoán nửa năm tới. Lưu ý rằng chuỗi đầu vào và đầu ra không cần phải có cùng độ dài. Đây là quyết định tùy tiện của tôi

data = sm.datasets.co2.load_pandas().data
9

Tập dữ liệu không được định dạng sao cho 26 quan sát là yếu tố dự báo cho 26 bước thời gian tiếp theo. Hình ảnh của tác giả

Như bạn có thể thấy, giờ đây chúng ta có một bộ dữ liệu trong đó 26 quan sát được sử dụng làm công cụ dự đoán cho 26 bước thời gian tiếp theo

Trước khi chuyển sang mô hình hóa, một lần nữa, chúng ta sẽ chia dữ liệu thành tập huấn luyện và tập kiểm tra. Ở đây, chúng tôi dành hai hàng cuối cùng cho bộ thử nghiệm, vì nó cung cấp cho chúng tôi 52 mẫu thử nghiệm

fig, ax = plt.subplots(figsize=(16, 11))ax.plot(data['co2'])
ax.set_xlabel('Time')
ax.set_ylabel('CO2 concentration (ppmw)')
fig.autofmt_xdate()
plt.tight_layout()
0

mô hình cơ sở

Là một mô hình cơ sở, chúng tôi sẽ chỉ lặp lại trình tự đầu vào. Nói cách khác, chúng tôi lấy chuỗi đầu vào và xuất chuỗi giống như các dự đoán cơ bản của chúng tôi

Đây là một dự đoán rất nhỏ, vì vậy chúng tôi sẽ thực hiện nó khi chúng tôi sẵn sàng đánh giá các mô hình

cây quyết định

Một lần nữa, hãy thử áp dụng cây quyết định. Lưu ý rằng cây quyết định có thể tạo ra nhiều dự đoán đầu ra, vì vậy chúng tôi không cần thực hiện thêm bất kỳ công việc nào ở đây

fig, ax = plt.subplots(figsize=(16, 11))ax.plot(data['co2'])
ax.set_xlabel('Time')
ax.set_ylabel('CO2 concentration (ppmw)')
fig.autofmt_xdate()
plt.tight_layout()
1

Tăng cường độ dốc

Bây giờ, tăng cường độ dốc cần thêm một chút công việc. Nó không thể xử lý một mục tiêu đa đầu ra. Cố gắng điều chỉnh mô hình tăng cường độ dốc ngay lập tức sẽ dẫn đến lỗi

Ở đây, chúng ta phải bọc mô hình sao cho dự đoán của nó được sử dụng làm đầu vào để cung cấp dự đoán tiếp theo. Điều này đạt được bằng cách sử dụng trình bao bọc RegressorChain từ scikit-learning

fig, ax = plt.subplots(figsize=(16, 11))ax.plot(data['co2'])
ax.set_xlabel('Time')
ax.set_ylabel('CO2 concentration (ppmw)')
fig.autofmt_xdate()
plt.tight_layout()
2

Điều này cho phép đào tạo mô hình và đưa ra dự đoán mà không gặp bất kỳ lỗi nào. Như tôi đã đề cập, đằng sau hậu trường, mô hình dự đoán bước thời gian tiếp theo và sử dụng dự đoán đó để đưa ra dự đoán tiếp theo. Hạn chế của phương pháp đó là nếu dự đoán đầu tiên sai, thì phần còn lại của chuỗi có thể sẽ sai.

Bây giờ hãy đánh giá từng mô hình

Sự đánh giá

Một lần nữa, chúng tôi sử dụng MAPE để đánh giá các phương pháp dự báo của mình

fig, ax = plt.subplots(figsize=(16, 11))ax.plot(data['co2'])
ax.set_xlabel('Time')
ax.set_ylabel('CO2 concentration (ppmw)')
fig.autofmt_xdate()
plt.tight_layout()
3

MAP của tất cả các mô hình hồi quy đa đầu ra. Ở đây, các mô hình ML vượt trội so với đường cơ sở, với cây quyết định là mô hình tốt nhất. Hình ảnh của tác giả

Từ hình trên, chúng ta có thể thấy rằng cuối cùng chúng ta đã quản lý để đào tạo các mô hình ML vượt trội hơn so với đường cơ sở. Ở đây, mô hình cây quyết định là mô hình vô địch vì nó đạt được MAPE thấp nhất

Chúng tôi tùy ý trực quan hóa các dự đoán trong năm qua

fig, ax = plt.subplots(figsize=(16, 11))ax.plot(data['co2'])
ax.set_xlabel('Time')
ax.set_ylabel('CO2 concentration (ppmw)')
fig.autofmt_xdate()
plt.tight_layout()
4

Trực quan hóa các dự đoán của từng mô hình cho năm ngoái. Rõ ràng, đường cơ sở bị lệch, trong khi cây quyết định và tăng cường độ dốc theo sát các giá trị thực tế hơn. Hình ảnh của tác giả

Hỗ trợ thêm cho MAPE, chúng ta có thể thấy rằng cây quyết định và tăng cường độ dốc tuân theo các giá trị thực chặt chẽ hơn so với dự đoán cơ sở

Trong bài viết này, chúng ta đã thấy cách đóng khung một vấn đề dự báo chuỗi thời gian dưới dạng một vấn đề hồi quy có thể được giải quyết bằng các mô hình hồi quy scikit-learning

Chúng tôi đã khám phá các tình huống sau

  1. Dự đoán bước thời gian tiếp theo bằng cách sử dụng quan sát trước đó
  2. Dự đoán bước thời gian tiếp theo bằng cách sử dụng một chuỗi các quan sát trong quá khứ
  3. Dự đoán một chuỗi các bước thời gian trong tương lai bằng cách sử dụng một chuỗi các quan sát trong quá khứ

Giờ đây, chúng tôi có một khung để đóng khung bất kỳ vấn đề dự báo chuỗi thời gian nào dưới dạng vấn đề học có giám sát, nơi bạn có thể áp dụng bất kỳ mô hình hồi quy nào từ scikit-learning

Tôi hy vọng bạn tìm thấy bài viết này hữu ích

Đảm bảo tải xuống bảng gian lận dự báo chuỗi thời gian rảnh của tôi bằng Python, bao gồm cả mô hình thống kê và mô hình học sâu

Python có tốt cho chuỗi thời gian không?

Python cung cấp nhiều thư viện và công cụ dễ sử dụng để thực hiện dự báo chuỗi thời gian bằng Python . Cụ thể, thư viện thống kê trong Python có các công cụ để xây dựng mô hình ARMA, mô hình ARIMA và mô hình SARIMA chỉ với một vài dòng mã.

Python hay R tốt hơn để phân tích chuỗi thời gian?

Python và R đều là ngôn ngữ lập trình cấp cao, mã nguồn mở, nằm trong số những ngôn ngữ phổ biến nhất cho khoa học dữ liệu và thống kê. Tuy nhiên, R có xu hướng phù hợp với phân tích thống kê truyền thống , trong khi Python lý tưởng cho các ứng dụng khoa học dữ liệu thông thường.

Thuật toán nào là tốt nhất cho dữ liệu chuỗi thời gian?

Phương pháp thống kê phổ biến nhất để dự báo chuỗi thời gian là họ ARIMA (Trung bình trượt tích hợp tự hồi quy) với các phương pháp AR, MA, ARMA, ARIMA, ARIMAX và SARIMAX.

Python xử lý dữ liệu chuỗi thời gian như thế nào?

Ngày và giờ trong Python .
từ datetime nhập datetime datetime(năm=2015, tháng=7, ngày=4) Hết[1]. .
từ trình phân tích cú pháp nhập dateutil date = trình phân tích cú pháp. ngày phân tích cú pháp ("ngày 4 tháng 7 năm 2015"). .
ngày. strftime('%A').
nhập numpy dưới dạng np date = np. mảng ('2015-07-04', dtype=np. .
ngày + np. sắp xếp(12).
np. datetime64('2015-07-04').
np. .