[ad_1]
Chuỗi thời gian và cụ thể hơn là dự báo chuỗi thời gian là một vấn đề khoa học dữ liệu rất nổi tiếng trong giới chuyên gia cũng như người dùng doanh nghiệp.
Có một số phương pháp dự báo, có thể được nhóm lại thành phương pháp thống kê hoặc phương pháp học máy để hiểu biết và có cái nhìn tổng quan tốt hơn, nhưng trên thực tế, nhu cầu dự báo rất cao nên có rất nhiều lựa chọn khả thi.
Các phương pháp học máy được coi là phương pháp tiếp cận tiên tiến nhất trong dự báo chuỗi thời gian và ngày càng phổ biến, do thực tế là chúng có thể nắm bắt các mối quan hệ phi tuyến tính phức tạp trong dữ liệu và thường mang lại độ chính xác cao hơn trong dự báo (1). Một lĩnh vực học máy phổ biến là bối cảnh của mạng nơ-ron. Cụ thể đối với phân tích chuỗi thời gian, mạng nơ-ron hồi quy đã được phát triển và áp dụng để giải quyết các vấn đề dự báo (2).
Những người đam mê khoa học dữ liệu có thể thấy sự phức tạp đằng sau những mô hình như vậy là đáng sợ và là một trong số các bạn, tôi có thể nói rằng tôi cũng có cảm giác đó. Tuy nhiên, bài viết này nhằm mục đích chỉ ra rằng
bất chấp những phát triển mới nhất trong các phương pháp học máy, không nhất thiết phải theo đuổi ứng dụng phức tạp nhất khi tìm kiếm giải pháp cho một vấn đề cụ thể. Các phương pháp đã được thiết lập tốt được tăng cường bằng các kỹ thuật kỹ thuật tính năng mạnh mẽ vẫn có thể mang lại kết quả khả quan.
Cụ thể hơn, tôi áp dụng mô hình Perceptron đa lớp và chia sẻ mã và kết quả để bạn có thể có được trải nghiệm thực tế về kỹ thuật tính năng chuỗi thời gian và dự báo hiệu quả.
Những gì tôi muốn cung cấp cho các chuyên gia tự học có thể được tóm tắt trong các điểm sau:
- dự báo dựa trên vấn đề / dữ liệu thực tế
- cách thiết kế các tính năng chuỗi thời gian để nắm bắt các mô hình thời gian
- xây dựng một mô hình MLP có khả năng sử dụng các biến hỗn hợp: số thực và số nguyên (được coi là phân loại thông qua nhúng)
- sử dụng MLP để dự báo điểm
- sử dụng MLP để dự báo nhiều bước
- đánh giá tầm quan trọng của tính năng bằng phương pháp hoán vị tầm quan trọng của tính năng
- đào tạo lại mô hình cho một tập hợp con các tính năng được nhóm lại (nhiều nhóm, được đào tạo cho từng nhóm) để tinh chỉnh tầm quan trọng của tính năng trong các tính năng được nhóm lại
- đánh giá mô hình bằng cách so sánh với một
UnobservedComponents
người mẫu
Xin lưu ý rằng bài viết này giả định rằng bạn đã có kiến thức trước về một số thuật ngữ kỹ thuật quan trọng và không có ý định giải thích chúng chi tiết. Tìm các thuật ngữ quan trọng đó bên dưới, có cung cấp tài liệu tham khảo, có thể kiểm tra để rõ ràng hơn:
- Chuỗi thời gian (3)
- Sự dự đoán (4) — trong bối cảnh này, nó sẽ được sử dụng để phân biệt các đầu ra của mô hình trong giai đoạn đào tạo
- Dự báo (4) — trong bối cảnh này, nó sẽ được sử dụng để phân biệt các đầu ra của mô hình trong giai đoạn thử nghiệm
- Kỹ thuật tính năng (5)
- Tự tương quan (6)
- Tự tương quan một phần (6)
- MLP (Perceptron đa lớp) (7)
- Lớp đầu vào (7)
- Lớp ẩn (7)
- Lớp đầu ra (7)
- Nhúng (số 8)
- Mô hình không gian trạng thái (9)
- Mô hình thành phần không quan sát được (9)
- RMSE (Lỗi bình phương trung bình căn bậc hai) (10)
- Tính năng quan trọng (11)
- Tính năng hoán vị quan trọng (11)
Các gói thiết yếu được sử dụng trong quá trình phân tích là numpy
Và pandas
để thao tác dữ liệu, plotly
cho biểu đồ tương tác, statsmodels
cho thống kê và mô hình không gian trạng thái và cuối cùng, tensorflow
cho kiến trúc MLP.
Lưu ý: do hạn chế về mặt kỹ thuật, tôi sẽ cung cấp đoạn mã để vẽ đồ thị tương tác, nhưng các hình ảnh sẽ được trình bày tĩnh ở đây.
import opendatasets as od
import numpy as np
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import tensorflow as tffrom sklearn.preprocessing import StandardScaler
from sklearn.inspection import permutation_importance
import statsmodels.api as sm
from statsmodels.tsa.stattools import acf, pacf
import datetime
import warnings
warnings.filterwarnings('ignore')
Dữ liệu được tải tự động bằng cách sử dụng opendatasets
.
dataset_url = "https://www.kaggle.com/datasets/robikscube/hourly-energy-consumption/"
od.obtain(dataset_url)
df = pd.read_csv(".hourly-energy-consumption" + "AEP_hourly.csv", index_col=0)
df.sort_index(inplace = True)
Hãy nhớ rằng, việc dọn dẹp dữ liệu là bước đầu tiên thiết yếu để tiến hành phân tích. Nếu bạn quan tâm đến các chi tiết và mô hình không gian trạng thái, vui lòng tham khảo bài viết trước của tôi đây. ☚📰 Tóm lại, các bước sau đây đã được thực hiện:
- Xác định khoảng trống khi thiếu dấu thời gian cụ thể (chỉ xác định được các bước đơn lẻ)
- Thực hiện phép quy imputation (sử dụng giá trị trung bình của các bản ghi trước và sau)
- Xác định và loại bỏ các bản sao
- Đặt cột dấu thời gian làm chỉ mục cho khung dữ liệu
- Đặt tần suất chỉ mục khung dữ liệu thành hàng giờ vì đây là yêu cầu để xử lý thêm
Sau khi chuẩn bị dữ liệu, chúng ta hãy khám phá dữ liệu bằng cách rút 5 mẫu dấu thời gian ngẫu nhiên và so sánh chuỗi thời gian ở các thang đo khác nhau.
fig = make_subplots(rows=5, cols=4, shared_yaxes=True, horizontal_spacing=0.01, vertical_spacing=0.04)# drawing a random pattern of 5 indices with out repetition
pattern = sorted((x for x in np.random.selection(vary(0, len(df), 1), 5, substitute=False)))
# zoom x scales for plotting
durations = (9000, 3000, 720, 240)
colours = ("#E56399", "#F0B67F", "#DE6E4B", "#7FD1B9", "#7A6563")
# s for pattern datetime begin
for si, s in enumerate(pattern):
# p for interval size
for pi, p in enumerate(durations):
cdf = df.iloc(s:(s+p+1),:).copy()
fig.add_trace(go.Scatter(x=cdf.index,
y=cdf.AEP_MW.values,
marker=dict(shade=colours(si))),
row=si+1, col=pi+1)
fig.update_layout(
font=dict(household="Arial"),
margin=dict(b=8, l=8, r=8, t=8),
showlegend=False,
top=1000,
paper_bgcolor="#FFFFFF",
plot_bgcolor="#FFFFFF")
fig.update_xaxes(griddash="dot", gridcolor="#808080")
fig.update_yaxes(griddash="dot", gridcolor="#808080")
[ad_2]
Source link