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 Show
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 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 Ở đâ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'])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-learningNhư 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
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] 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() 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)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ố 8Bộ 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): 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 0MAPE 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 1Hã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 2tậ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 3mô 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 4câ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 5Tă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 6Sự đá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 7MAPE 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 9Tậ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'])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'])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'])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'])3MAP 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'])4Trự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
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. . |