AI với Python - Phân tích dữ liệu chuỗi thời gian
Dự đoán tiếp theo trong một chuỗi đầu vào nhất định là một khái niệm quan trọng khác trong học máy. Chương này cung cấp cho bạn lời giải thích chi tiết về phân tích dữ liệu chuỗi thời gian.
Giới thiệu
Dữ liệu chuỗi thời gian có nghĩa là dữ liệu nằm trong một chuỗi các khoảng thời gian cụ thể. Nếu chúng ta muốn xây dựng dự đoán trình tự trong học máy, thì chúng ta phải xử lý dữ liệu tuần tự và thời gian. Dữ liệu chuỗi là một bản tóm tắt của dữ liệu tuần tự. Thứ tự dữ liệu là một tính năng quan trọng của dữ liệu tuần tự.
Khái niệm cơ bản về phân tích trình tự hoặc phân tích chuỗi thời gian
Phân tích trình tự hoặc phân tích chuỗi thời gian là dự đoán tiếp theo trong một trình tự đầu vào nhất định dựa trên những gì đã quan sát trước đó. Dự đoán có thể là bất cứ điều gì có thể xảy ra tiếp theo: một biểu tượng, một con số, thời tiết ngày hôm sau, thuật ngữ tiếp theo trong bài phát biểu, v.v. Phân tích trình tự có thể rất hữu ích trong các ứng dụng như phân tích thị trường chứng khoán, dự báo thời tiết và đề xuất sản phẩm.
Example
Hãy xem xét ví dụ sau để hiểu dự đoán chuỗi. ĐâyA,B,C,D là các giá trị đã cho và bạn phải dự đoán giá trị E sử dụng Mô hình Dự đoán Trình tự.
Cài đặt các gói hữu ích
Để phân tích dữ liệu chuỗi thời gian bằng Python, chúng ta cần cài đặt các gói sau:
Gấu trúc
Pandas là một thư viện mã nguồn mở được cấp phép BSD cung cấp các công cụ phân tích dữ liệu và hiệu suất cao, dễ sử dụng cấu trúc dữ liệu cho Python. Bạn có thể cài đặt Pandas với sự trợ giúp của lệnh sau:
pip install pandas
Nếu bạn đang sử dụng Anaconda và muốn cài đặt bằng cách sử dụng conda trình quản lý gói, sau đó bạn có thể sử dụng lệnh sau:
conda install -c anaconda pandas
hmmlearn
Nó là một thư viện mã nguồn mở được cấp phép BSD bao gồm các thuật toán và mô hình đơn giản để học Mô hình Markov ẩn (HMM) trong Python. Bạn có thể cài đặt nó với sự trợ giúp của lệnh sau:
pip install hmmlearn
Nếu bạn đang sử dụng Anaconda và muốn cài đặt bằng cách sử dụng conda trình quản lý gói, sau đó bạn có thể sử dụng lệnh sau:
conda install -c omnia hmmlearn
PyStruct
Nó là một thư viện dự đoán và học tập có cấu trúc. Các thuật toán học tập được thực hiện trong PyStruct có các tên như trường ngẫu nhiên có điều kiện (CRF), Mạng ngẫu nhiên Markov biên tối đa (M3N) hoặc máy vectơ hỗ trợ cấu trúc. Bạn có thể cài đặt nó với sự trợ giúp của lệnh sau:
pip install pystruct
CVXOPT
Nó được sử dụng để tối ưu hóa lồi dựa trên ngôn ngữ lập trình Python. Nó cũng là một gói phần mềm miễn phí. Bạn có thể cài đặt nó với sự trợ giúp của lệnh sau:
pip install cvxopt
Nếu bạn đang sử dụng Anaconda và muốn cài đặt bằng cách sử dụng conda trình quản lý gói, sau đó bạn có thể sử dụng lệnh sau:
conda install -c anaconda cvdoxt
Gấu trúc: Xử lý, cắt và trích xuất thống kê từ dữ liệu chuỗi thời gian
Pandas là một công cụ rất hữu ích nếu bạn phải làm việc với dữ liệu chuỗi thời gian. Với sự trợ giúp của Pandas, bạn có thể thực hiện những việc sau:
Tạo một phạm vi ngày bằng cách sử dụng pd.date_range gói hàng
Lập chỉ mục gấu trúc với ngày tháng bằng cách sử dụng pd.Series gói hàng
Thực hiện lấy mẫu lại bằng cách sử dụng ts.resample gói hàng
Thay đổi tần số
Thí dụ
Ví dụ sau cho thấy bạn xử lý và cắt dữ liệu chuỗi thời gian bằng cách sử dụng Pandas. Lưu ý rằng ở đây chúng tôi đang sử dụng dữ liệu Dao động Bắc Cực hàng tháng, dữ liệu này có thể được tải xuống từ month.ao.index.b50.current.ascii và có thể được chuyển đổi sang định dạng văn bản để chúng tôi sử dụng.
Xử lý dữ liệu chuỗi thời gian
Để xử lý dữ liệu chuỗi thời gian, bạn sẽ phải thực hiện các bước sau:
Bước đầu tiên liên quan đến việc nhập các gói sau:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
Tiếp theo, xác định một hàm sẽ đọc dữ liệu từ tệp đầu vào, như được hiển thị trong đoạn mã dưới đây -
def read_data(input_file):
input_data = np.loadtxt(input_file, delimiter = None)
Bây giờ, hãy chuyển đổi dữ liệu này thành chuỗi thời gian. Đối với điều này, hãy tạo phạm vi ngày trong chuỗi thời gian của chúng tôi. Trong ví dụ này, chúng tôi giữ một tháng làm tần suất dữ liệu. Tệp của chúng tôi có dữ liệu bắt đầu từ tháng 1 năm 1950.
dates = pd.date_range('1950-01', periods = input_data.shape[0], freq = 'M')
Trong bước này, chúng tôi tạo dữ liệu chuỗi thời gian với sự trợ giúp của Chuỗi Pandas, như được hiển thị bên dưới -
output = pd.Series(input_data[:, index], index = dates)
return output
if __name__=='__main__':
Nhập đường dẫn của tệp đầu vào như hình ở đây -
input_file = "/Users/admin/AO.txt"
Bây giờ, hãy chuyển đổi cột sang định dạng dấu thời gian, như được hiển thị ở đây -
timeseries = read_data(input_file)
Cuối cùng, vẽ và trực quan hóa dữ liệu, sử dụng các lệnh được hiển thị:
plt.figure()
timeseries.plot()
plt.show()
Bạn sẽ quan sát các ô như thể hiện trong các hình ảnh sau:
Cắt dữ liệu chuỗi thời gian
Cắt chỉ liên quan đến việc truy xuất một số phần của dữ liệu chuỗi thời gian. Là một phần của ví dụ, chúng tôi chỉ cắt dữ liệu từ năm 1980 đến 1990. Hãy quan sát đoạn mã sau thực hiện tác vụ này:
timeseries['1980':'1990'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0xa0e4b00>
plt.show()
Khi bạn chạy mã để cắt dữ liệu chuỗi thời gian, bạn có thể quan sát biểu đồ sau như được hiển thị trong hình ảnh ở đây:
Trích xuất thống kê từ dữ liệu chuỗi thời gian
Bạn sẽ phải trích xuất một số thống kê từ một dữ liệu nhất định, trong trường hợp bạn cần rút ra một số kết luận quan trọng. Giá trị trung bình, phương sai, tương quan, giá trị lớn nhất và giá trị nhỏ nhất là một số thống kê như vậy. Bạn có thể sử dụng mã sau nếu muốn trích xuất các thống kê như vậy từ dữ liệu chuỗi thời gian nhất định:
Nghĩa là
Bạn có thể dùng mean() để tìm giá trị trung bình, như được hiển thị ở đây -
timeseries.mean()
Sau đó, kết quả mà bạn sẽ quan sát cho ví dụ được thảo luận là:
-0.11143128165238671
Tối đa
Bạn có thể dùng max() , để tìm tối đa, như được hiển thị ở đây -
timeseries.max()
Sau đó, kết quả mà bạn sẽ quan sát cho ví dụ được thảo luận là:
3.4952999999999999
Tối thiểu
Bạn có thể sử dụng hàm min () để tìm giá trị tối thiểu, như được hiển thị ở đây -
timeseries.min()
Sau đó, kết quả mà bạn sẽ quan sát cho ví dụ được thảo luận là:
-4.2656999999999998
Nhận mọi thứ cùng một lúc
Nếu bạn muốn tính toán tất cả các thống kê cùng một lúc, bạn có thể sử dụng describe() chức năng như được hiển thị ở đây -
timeseries.describe()
Sau đó, kết quả mà bạn sẽ quan sát cho ví dụ được thảo luận là:
count 817.000000
mean -0.111431
std 1.003151
min -4.265700
25% -0.649430
50% -0.042744
75% 0.475720
max 3.495300
dtype: float64
Lấy mẫu lại
Bạn có thể lấy mẫu lại dữ liệu theo một tần suất thời gian khác. Hai tham số để thực hiện lấy mẫu lại là:
- Khoảng thời gian
- Method
Lấy mẫu lại với giá trị trung bình ()
Bạn có thể sử dụng đoạn mã sau để lấy mẫu lại dữ liệu bằng phương thức mean (), là phương thức mặc định -
timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()
Sau đó, bạn có thể quan sát biểu đồ sau là đầu ra của việc lấy mẫu lại bằng cách sử dụng mean () -
Lấy mẫu lại với trung vị ()
Bạn có thể sử dụng mã sau để lấy mẫu lại dữ liệu bằng cách sử dụng median()phương pháp -
timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()
Sau đó, bạn có thể quan sát biểu đồ sau là đầu ra của lấy mẫu lại với trung vị () -
Rolling Mean
Bạn có thể sử dụng mã sau để tính toán trung bình lăn (di chuyển):
timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()
Sau đó, bạn có thể quan sát biểu đồ sau khi đầu ra của giá trị trung bình lăn (di chuyển):
Phân tích dữ liệu tuần tự bằng mô hình Markov ẩn (HMM)
HMM là một mô hình thống kê được sử dụng rộng rãi cho dữ liệu có tính liên tục và khả năng mở rộng như phân tích thị trường chứng khoán theo chuỗi thời gian, kiểm tra sức khỏe và nhận dạng giọng nói. Phần này đề cập chi tiết đến việc phân tích dữ liệu tuần tự bằng Mô hình Markov ẩn (HMM).
Mô hình Markov ẩn (HMM)
HMM là một mô hình ngẫu nhiên được xây dựng dựa trên khái niệm chuỗi Markov dựa trên giả định rằng xác suất của các thống kê trong tương lai chỉ phụ thuộc vào trạng thái quy trình hiện tại thay vì bất kỳ trạng thái nào trước đó. Ví dụ, khi tung một đồng xu, chúng ta không thể nói rằng kết quả của lần tung thứ năm sẽ là một cái đầu. Điều này là do một đồng xu không có bất kỳ bộ nhớ nào và kết quả tiếp theo không phụ thuộc vào kết quả trước đó.
Về mặt toán học, HMM bao gồm các biến sau:
Kỳ (S)
Nó là một tập hợp các trạng thái ẩn hoặc tiềm ẩn trong HMM. Nó được ký hiệu là S.
Ký hiệu đầu ra (O)
Nó là một tập hợp các ký hiệu đầu ra có thể có trong HMM. Nó được ký hiệu là O.
Ma trận xác suất chuyển trạng thái (A)
Nó là xác suất thực hiện chuyển đổi từ trạng thái này sang từng trạng thái khác. Nó được ký hiệu là A.
Ma trận xác suất phát thải quan sát (B)
Nó là xác suất phát ra / quan sát một biểu tượng ở một trạng thái cụ thể. Nó được ký hiệu là B.
Ma trận xác suất trước (Π)
Nó là xác suất bắt đầu ở một trạng thái cụ thể từ các trạng thái khác nhau của hệ thống. Nó được ký hiệu là Π.
Do đó, HMM có thể được định nghĩa là = (S,O,A,B,),
Ở đâu,
- S = {s1,s2,…,sN} là tập hợp N trạng thái khả dĩ,
- O = {o1,o2,…,oM} là tập hợp M ký hiệu quan sát có thể có,
- A là một NN ma trận xác suất chuyển trạng thái (TPM),
- B là một NM quan sát hoặc Ma trận xác suất phát thải (EPM),
- π là một vectơ phân bố xác suất trạng thái ban đầu N chiều.
Ví dụ: Phân tích dữ liệu Thị trường chứng khoán
Trong ví dụ này, chúng ta sẽ phân tích từng bước dữ liệu của thị trường chứng khoán, để có được ý tưởng về cách HMM hoạt động với dữ liệu tuần tự hoặc chuỗi thời gian. Xin lưu ý rằng chúng tôi đang triển khai ví dụ này bằng Python.
Nhập các gói cần thiết như hình dưới đây -
import datetime
import warnings
Bây giờ, hãy sử dụng dữ liệu thị trường chứng khoán từ matpotlib.finance gói, như được hiển thị ở đây -
import numpy as np
from matplotlib import cm, pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator
try:
from matplotlib.finance import quotes_historical_yahoo_och1
except ImportError:
from matplotlib.finance import (
quotes_historical_yahoo as quotes_historical_yahoo_och1)
from hmmlearn.hmm import GaussianHMM
Tải dữ liệu từ ngày bắt đầu và ngày kết thúc, tức là giữa hai ngày cụ thể như được hiển thị ở đây -
start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)
Trong bước này, chúng tôi sẽ trích xuất các báo giá kết thúc mỗi ngày. Đối với điều này, hãy sử dụng lệnh sau:
closing_quotes = np.array([quote[2] for quote in quotes])
Bây giờ, chúng tôi sẽ trích xuất khối lượng cổ phiếu được giao dịch mỗi ngày. Đối với điều này, hãy sử dụng lệnh sau:
volumes = np.array([quote[5] for quote in quotes])[1:]
Tại đây, lấy phần trăm chênh lệch của giá cổ phiếu đóng cửa, sử dụng mã hiển thị bên dưới -
diff_percentages = 100.0 * np.diff(closing_quotes) / closing_quotes[:-]
dates = np.array([quote[0] for quote in quotes], dtype = np.int)[1:]
training_data = np.column_stack([diff_percentages, volumes])
Trong bước này, hãy tạo và đào tạo Gaussian HMM. Đối với điều này, hãy sử dụng mã sau:
hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
warnings.simplefilter('ignore')
hmm.fit(training_data)
Bây giờ, tạo dữ liệu bằng mô hình HMM, sử dụng các lệnh được hiển thị:
num_samples = 300
samples, _ = hmm.sample(num_samples)
Cuối cùng, trong bước này, chúng tôi vẽ và hình dung tỷ lệ phần trăm chênh lệch và khối lượng cổ phiếu được giao dịch dưới dạng sản lượng dưới dạng đồ thị.
Sử dụng đoạn mã sau để vẽ và hình dung tỷ lệ phần trăm chênh lệch -
plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')
Sử dụng đoạn mã sau để vẽ và hình dung khối lượng cổ phiếu được giao dịch -
plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()