Ngoại lệ là các điểm dữ liệu cách xa hầu hết các điểm dữ liệu khác
Trong ví dụ về chuỗi thời gian này, tất cả các điểm bên ngoài dải màu xanh có thể được coi là ngoại lệ
Ở đây chúng ta sẽ sử dụng thư viện có tên là tsmoothie.
Đó là một thư viện python để làm mịn chuỗi thời gian và phát hiện ngoại lệ theo cách vector hóa.
Trên chuỗi thời gian trong hình. chúng ta có thể thấy rằng chúng ta có 4 ngoại lệ, chúng ta có thể lấy chúng bằng cách
import numpy as np
from tsmoothie.utils_func import sim_randomwalk
from tsmoothie.smoother import LowessSmoother
data = df['value'].values.reshape[1, -1]
# operate smoothing
smoother = LowessSmoother[smooth_fraction=0.1, iterations=1]
smoother.smooth[data]
# generate intervals
low, up = smoother.get_intervals['prediction_interval']
points = smoother.data[0]
up_points = up[0]
low_points = low[0]
for i in range[len[points]-1, 0, -1]:
current_point = points[i]
current_up = up_points[i]
current_low = low_points[i]
if current_point > current_up or current_point < current_low:
print[f'found an outlier value: {current_point}']
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Xét rằng khung dữ liệu df có một cột có tên là 'giá trị'.
Vì vậy, chúng tôi nhận được đầu ra này sau khi chạy mã.
Chào mừng bạn đến với GrabNGoInfo. Hướng dẫn này sẽ nói về cách thực hiện phát hiện bất thường chuỗi thời gian bằng mô hình Tiên tri Facebook [Meta] trong Python. Dị thường còn được gọi là ngoại lệ và chúng tôi sẽ sử dụng hai thuật ngữ này thay thế cho nhau trong hướng dẫn này. Sau phần hướng dẫn, bạn sẽ học
- Làm cách nào để đào tạo mô hình chuỗi thời gian bằng Tiên tri?
- Làm cách nào để đưa ra dự đoán bằng mô hình Tiên tri?
- Làm cách nào để xác định các ngoại lệ bằng cách sử dụng dự báo chuỗi thời gian của Nhà tiên tri?
Tài nguyên cho bài đăng này
- Mã Python ở cuối bài. Nhấp vào đây để xem sổ ghi chép
- Các video hướng dẫn khác về phát hiện sự bất thường và chuỗi thời gian
- Các bài đăng trên blog khác về phát hiện bất thường và chuỗi thời gian
- Nếu bạn thích phiên bản video của hướng dẫn, hãy xem video bên dưới trên YouTube
Bắt đầu nào
Bước 0. Thuật toán phát hiện bất thường chuỗi thời gian
Ở bước 0, hãy nói về thuật toán phát hiện sự bất thường của chuỗi thời gian. Ở cấp độ cao, các ngoại lệ được phát hiện dựa trên khoảng thời gian dự đoán của chuỗi thời gian. Việc thực hiện bao gồm các bước sau
- Xây dựng mô hình dự báo chuỗi thời gian
- Đưa ra dự đoán về dữ liệu lịch sử bằng mô hình dự báo chuỗi thời gian
- So sánh các giá trị thực tế với các khoảng thời gian dự đoán. Giá trị ngoại lệ được định nghĩa là các điểm dữ liệu có giá trị thực tế nằm ngoài khoảng thời gian dự đoán
Bước 1. Cài đặt và nhập thư viện
Trong bước đầu tiên, chúng tôi sẽ cài đặt và nhập thư viện
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'6 là gói python để lấy dữ liệu chứng khoán từ Yahoo Finance.
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'7 là gói dành cho mô hình chuỗi thời gian. Sau khi cài đặt
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'6 và
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'7, chúng sẽ được nhập vào sổ ghi chép
Chúng tôi cũng nhập
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]0 và
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]1 để xử lý dữ liệu,
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]2 và
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]3 để trực quan hóa, và
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]4 và
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]5 để đánh giá hiệu suất mô hình
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'1
Bước 2. Kéo dữ liệu
Bước thứ hai lấy dữ liệu chứng khoán từ Yahoo Finance API. Dữ liệu hàng ngày trong hai năm từ đầu năm 2020 đến cuối năm 2021 được lấy cho phân tích này
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]
6 vì ngày 1 tháng 1 là ngày nghỉ lễ và không có dữ liệu về kho hàng vào ngày lễ và cuối tuần# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]
7 vì# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'
6 không bao gồm ngày kết thúc nên chúng tôi cần thêm một ngày vào ngày cuối cùng của ngày kết thúc dữ liệu
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'
Mục tiêu của mô hình chuỗi thời gian là dự đoán giá đóng cửa của cổ phiếu Google, vì vậy, mã đánh dấu của Google
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]9 được sử dụng để lấy dữ liệu
Nhà tiên tri yêu cầu ít nhất hai cột làm đầu vào. một
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'70 cột và một
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'71 cột
- Cột
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'
70 có thông tin về thời gian. Hiện tại, chúng tôi có ngày làm chỉ mục, vì vậy, chúng tôi đặt lại chỉ mục và đổi tên# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'
73 thành# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'
70 - Cột y có các giá trị chuỗi thời gian. Trong ví dụ này, vì chúng ta đang dự đoán giá đóng cửa của Google nên tên cột của giá được thay đổi thành
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'
71
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]
Sử dụng
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'76, chúng ta có thể thấy rằng tập dữ liệu có 505 bản ghi và không có giá trị nào bị thiếu
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'7
đầu ra
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'6
Tiếp theo, hãy hình dung giá đóng cửa của hai mã cổ phiếu bằng cách sử dụng
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]2 và thêm chú giải vào biểu đồ bằng cách sử dụng
# Pull close data from Yahoo Finance for the list of tickers ticker_list = ['GOOG'] data = yf.download[ticker_list, start=start_date, end=end_date][['Close']] # Change column names data = data.reset_index[] data.columns = ['ds', 'y'] # Take a look at the data data.head[]3. Chúng ta có thể thấy rằng giá của Google đã tăng lên rất nhiều kể từ cuối năm 2020 và tăng gần gấp đôi vào cuối năm 2021
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'9
Họ
Địa chỉ email.
Để trống trường này nếu bạn là người.Bước 3. Xây dựng mô hình chuỗi thời gian bằng tiên tri trong Python
Ở bước 3, chúng ta sẽ xây dựng mô hình chuỗi thời gian bằng Prophet trong Python
Lưu ý rằng chúng tôi đã không thực hiện phân tách thử nghiệm huấn luyện cho tập dữ liệu mô hình hóa. Điều này là do mục tiêu của mô hình không phải là dự đoán giá cổ phiếu trong tương lai, thay vào đó, mục tiêu là phù hợp với một mô hình dự đoán tốt về giá trong quá khứ. Do đó, chúng tôi sẽ sử dụng toàn bộ tập dữ liệu cho cả đào tạo và dự báo
- Khi bắt đầu mô hình nhà tiên tri,
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'
79 và# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'
60 được đặt rõ ràng thành True, sau đó khớp với dữ liệu đào tạo - _
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'
61 được đặt thành 0. 99, có nghĩa là khoảng bất định là 99%
Chúng tôi giữ mô hình đơn giản trong ví dụ này để tập trung vào quá trình phát hiện bất thường. Nếu bạn quan tâm đến việc xây dựng một mô hình phức tạp, vui lòng tham khảo hướng dẫn trước của tôi Dự báo chuỗi thời gian đa biến với tính thời vụ và hiệu ứng ngày lễ bằng cách sử dụng tiên tri trong Python
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'3
Bước 4. Đưa ra dự đoán bằng cách sử dụng nhà tiên tri trong Python
Sau khi xây dựng mô hình, ở bước 4, chúng ta sử dụng mô hình để đưa ra dự đoán trên tập dữ liệu. Biểu đồ dự báo cho thấy rằng các dự đoán nói chung phù hợp với các giá trị thực tế
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'4
Chúng tôi cũng có thể kiểm tra biểu đồ thành phần để biết xu hướng, tính thời vụ hàng tuần và tính thời vụ hàng năm
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'5
Bước 5. Kiểm tra hiệu suất mô hình chuỗi thời gian
Ở bước 5, chúng ta sẽ kiểm tra hiệu suất của mô hình chuỗi thời gian. Khung dữ liệu dự báo không bao gồm các giá trị thực tế, vì vậy chúng tôi cần hợp nhất khung dữ liệu dự báo với khung dữ liệu thực tế để so sánh các giá trị thực tế với các giá trị dự đoán. Hai chỉ số hiệu suất được bao gồm
- MAE [Lỗi tuyệt đối trung bình] tổng hợp sự khác biệt tuyệt đối giữa thực tế và dự đoán và được chia cho số lượng dự đoán
- MAPE [Lỗi tỷ lệ phần trăm trung bình tuyệt đối] tính tổng chênh lệch tỷ lệ phần trăm tuyệt đối giữa thực tế và dự đoán và được chia cho số lượng dự đoán. MAPE không phụ thuộc vào độ lớn của dữ liệu, vì vậy nó có thể được sử dụng để so sánh các dự báo khác nhau. Nhưng nó không xác định khi giá trị thực tế bằng không
Để biết thêm các chỉ số đánh giá hiệu suất theo chuỗi thời gian, chẳng hạn như MSE [Lỗi bình phương trung bình], RMSE [Lỗi bình phương trung bình gốc], MDAPE [Lỗi tỷ lệ phần trăm tuyệt đối trung bình] và SMAPE [Lỗi tỷ lệ phần trăm trung bình trung bình đối xứng], vui lòng tham khảo chuỗi thời gian hướng dẫn trước đây của tôi
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'6
Sai số tuyệt đối trung bình [MAE] của mô hình là 31 đô la, nghĩa là trung bình, dự báo sai lệch 31 đô la. Cho rằng giá của Google là hàng nghìn, dự đoán không tệ
Lỗi phần trăm tuyệt đối trung bình [MAPE] cho mô hình cơ sở là 1. 7%, nghĩa là trung bình, dự báo sai lệch 1. 7% giá cổ phiếu
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'0
Bước 6. Xác định sự bất thường
Ở bước 6, chúng ta sẽ xác định các điểm bất thường của chuỗi thời gian bằng cách kiểm tra xem giá trị thực có nằm ngoài khoảng bất định hay không. Nếu giá trị thực tế nhỏ hơn giới hạn dưới hoặc lớn hơn giới hạn trên của khoảng không chắc chắn, thì chỉ báo bất thường được đặt thành 1, nếu không, nó được đặt thành 0
Sử dụng
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'62, chúng tôi có thể thấy rằng có 6 giá trị ngoại lệ trong số 505 điểm dữ liệu
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'1
đầu ra
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'2
Sau khi in ra các điểm bất thường, chúng ta có thể thấy rằng tất cả các điểm bất thường đều thấp hơn giới hạn dưới của khoảng bất định
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'3
Trong phần trực quan hóa, tất cả các dấu chấm là giá trị thực và đường màu đen biểu thị giá trị dự đoán. Các chấm màu cam là ngoại lệ
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'4
Đặt tất cả các mã lại với nhau
# Data start date start_date = '2020-01-02' # Data end date. yfinance excludes the end date, so we need to add one day to the last day of data end_date = '2022-01-01'5
Tóm lược
Trong hướng dẫn này, chúng ta đã thảo luận cách phát hiện bất thường chuỗi thời gian bằng Prophet trong Python. Bạn đã học
- Làm cách nào để đào tạo mô hình chuỗi thời gian bằng Tiên tri?
- Làm cách nào để đưa ra dự đoán bằng mô hình Tiên tri?
- Làm cách nào để xác định các ngoại lệ bằng cách sử dụng dự báo chuỗi thời gian của Nhà tiên tri?
Để biết thêm thông tin về khoa học dữ liệu và máy học, vui lòng xem kênh YouTube và Trang phương tiện của tôi