AI พร้อม Python - การวิเคราะห์ข้อมูลอนุกรมเวลา
การคาดการณ์ลำดับถัดไปในลำดับอินพุตที่กำหนดเป็นอีกแนวคิดที่สำคัญในการเรียนรู้ของเครื่อง บทนี้ให้คำอธิบายโดยละเอียดเกี่ยวกับการวิเคราะห์ข้อมูลอนุกรมเวลา
บทนำ
ข้อมูลอนุกรมเวลาหมายถึงข้อมูลที่อยู่ในชุดของช่วงเวลาเฉพาะ หากเราต้องการสร้างการคาดคะเนลำดับในแมชชีนเลิร์นนิงเราต้องจัดการกับข้อมูลและเวลาตามลำดับ ข้อมูลอนุกรมเป็นนามธรรมของข้อมูลตามลำดับ การจัดลำดับข้อมูลเป็นคุณลักษณะที่สำคัญของข้อมูลแบบลำดับ
แนวคิดพื้นฐานของการวิเคราะห์ลำดับหรือการวิเคราะห์อนุกรมเวลา
การวิเคราะห์ลำดับหรือการวิเคราะห์อนุกรมเวลาคือการทำนายลำดับถัดไปในลำดับอินพุตที่กำหนดตามที่สังเกตก่อนหน้านี้ การทำนายอาจเป็นอะไรก็ได้ที่อาจเกิดขึ้นถัดไป: สัญลักษณ์ตัวเลขสภาพอากาศในวันถัดไปคำพูดถัดไปเป็นต้นการวิเคราะห์ลำดับมีประโยชน์มากในการใช้งานเช่นการวิเคราะห์ตลาดหุ้นการพยากรณ์อากาศและคำแนะนำผลิตภัณฑ์
Example
พิจารณาตัวอย่างต่อไปนี้เพื่อทำความเข้าใจการทำนายตามลำดับ ที่นี่A,B,C,D คือค่าที่กำหนดและคุณต้องทำนายค่า E โดยใช้แบบจำลองการทำนายลำดับ
การติดตั้งแพ็คเกจที่เป็นประโยชน์
สำหรับการวิเคราะห์ข้อมูลอนุกรมเวลาโดยใช้ Python เราจำเป็นต้องติดตั้งแพ็คเกจต่อไปนี้ -
หมีแพนด้า
Pandas เป็นไลบรารีที่ได้รับอนุญาต BSD แบบโอเพนซอร์สซึ่งมีประสิทธิภาพสูงใช้งานง่ายโครงสร้างข้อมูลและเครื่องมือวิเคราะห์ข้อมูลสำหรับ Python คุณสามารถติดตั้ง Pandas ด้วยความช่วยเหลือของคำสั่งต่อไปนี้ -
pip install pandas
หากคุณใช้ Anaconda และต้องการติดตั้งโดยใช้ไฟล์ conda ผู้จัดการแพ็คเกจจากนั้นคุณสามารถใช้คำสั่งต่อไปนี้ -
conda install -c anaconda pandas
อืม
เป็นไลบรารีที่ได้รับอนุญาต BSD แบบโอเพนซอร์สซึ่งประกอบด้วยอัลกอริทึมและโมเดลที่เรียบง่ายเพื่อเรียนรู้ Hidden Markov Models (HMM) ใน Python คุณสามารถติดตั้งได้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้ -
pip install hmmlearn
หากคุณใช้ Anaconda และต้องการติดตั้งโดยใช้ไฟล์ conda ผู้จัดการแพ็คเกจจากนั้นคุณสามารถใช้คำสั่งต่อไปนี้ -
conda install -c omnia hmmlearn
PyStruct
เป็นห้องสมุดการเรียนรู้และการทำนายที่มีโครงสร้าง อัลกอริทึมการเรียนรู้ที่ใช้ใน PyStruct มีชื่อเช่นฟิลด์สุ่มตามเงื่อนไข (CRF), Maximum-Margin Markov Random Networks (M3N) หรือเครื่องเวกเตอร์สนับสนุนโครงสร้าง คุณสามารถติดตั้งได้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้ -
pip install pystruct
CVXOPT
ใช้สำหรับการเพิ่มประสิทธิภาพนูนตามภาษาโปรแกรม Python นอกจากนี้ยังเป็นชุดซอฟต์แวร์ฟรี คุณสามารถติดตั้งได้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้ -
pip install cvxopt
หากคุณใช้ Anaconda และต้องการติดตั้งโดยใช้ไฟล์ conda ผู้จัดการแพ็คเกจจากนั้นคุณสามารถใช้คำสั่งต่อไปนี้ -
conda install -c anaconda cvdoxt
หมีแพนด้า: การจัดการการแบ่งส่วนและการแยกข้อมูลสถิติจากข้อมูลอนุกรมเวลา
Pandas เป็นเครื่องมือที่มีประโยชน์มากหากคุณต้องทำงานกับข้อมูลอนุกรมเวลา ด้วยความช่วยเหลือของ Pandas คุณสามารถทำสิ่งต่อไปนี้ -
สร้างช่วงวันที่โดยใช้ไฟล์ pd.date_range แพ็คเกจ
จัดทำดัชนีแพนด้าด้วยวันที่โดยใช้ pd.Series แพ็คเกจ
ทำการสุ่มตัวอย่างซ้ำโดยใช้ไฟล์ ts.resample แพ็คเกจ
เปลี่ยนความถี่
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้คุณจัดการและแบ่งส่วนข้อมูลอนุกรมเวลาโดยใช้ Pandas โปรดทราบว่าที่นี่เรากำลังใช้ข้อมูล Monthly Arctic Oscillation ซึ่งสามารถดาวน์โหลดได้จากmonth.ao.index.b50.current.asciiและสามารถแปลงเป็นรูปแบบข้อความสำหรับการใช้งานของเราได้
การจัดการข้อมูลอนุกรมเวลา
สำหรับการจัดการข้อมูลอนุกรมเวลาคุณจะต้องทำตามขั้นตอนต่อไปนี้ -
ขั้นตอนแรกเกี่ยวข้องกับการนำเข้าแพ็คเกจต่อไปนี้ -
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
จากนั้นกำหนดฟังก์ชันที่จะอ่านข้อมูลจากไฟล์อินพุตดังที่แสดงในโค้ดที่ระบุด้านล่าง -
def read_data(input_file):
input_data = np.loadtxt(input_file, delimiter = None)
ตอนนี้แปลงข้อมูลนี้เป็นอนุกรมเวลา สำหรับสิ่งนี้ให้สร้างช่วงวันที่ของอนุกรมเวลาของเรา ในตัวอย่างนี้เราเก็บข้อมูลหนึ่งเดือนเป็นความถี่ ไฟล์ของเรามีข้อมูลซึ่งเริ่มตั้งแต่เดือนมกราคม 1950
dates = pd.date_range('1950-01', periods = input_data.shape[0], freq = 'M')
ในขั้นตอนนี้เราสร้างข้อมูลอนุกรมเวลาด้วยความช่วยเหลือของ Pandas Series ดังที่แสดงด้านล่าง -
output = pd.Series(input_data[:, index], index = dates)
return output
if __name__=='__main__':
ป้อนเส้นทางของไฟล์อินพุตดังที่แสดงไว้ที่นี่ -
input_file = "/Users/admin/AO.txt"
ตอนนี้แปลงคอลัมน์เป็นรูปแบบไทม์ซีรีย์ดังที่แสดงไว้ที่นี่ -
timeseries = read_data(input_file)
สุดท้ายลงจุดและแสดงภาพข้อมูลโดยใช้คำสั่งที่แสดง -
plt.figure()
timeseries.plot()
plt.show()
คุณจะสังเกตเห็นแปลงดังที่แสดงในภาพต่อไปนี้ -
การแบ่งข้อมูลอนุกรมเวลา
Slicing เกี่ยวข้องกับการดึงข้อมูลเฉพาะบางส่วนของอนุกรมเวลา ในตัวอย่างนี้เรากำลังแบ่งส่วนข้อมูลในช่วงปี 1980 ถึง 1990 เท่านั้นสังเกตโค้ดต่อไปนี้ที่ทำงานนี้ -
timeseries['1980':'1990'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0xa0e4b00>
plt.show()
เมื่อคุณรันโค้ดสำหรับการแบ่งส่วนข้อมูลอนุกรมเวลาคุณสามารถสังเกตกราฟต่อไปนี้ดังแสดงในภาพที่นี่ -
การดึงข้อมูลสถิติจากข้อมูลอนุกรมเวลา
คุณจะต้องดึงข้อมูลสถิติบางส่วนออกจากข้อมูลที่กำหนดในกรณีที่คุณจำเป็นต้องสรุปข้อสรุปที่สำคัญบางอย่าง ค่าเฉลี่ยความแปรปรวนสหสัมพันธ์ค่าสูงสุดและค่าต่ำสุดเป็นสถิติดังกล่าว คุณสามารถใช้รหัสต่อไปนี้หากคุณต้องการดึงสถิติดังกล่าวจากข้อมูลอนุกรมเวลาที่กำหนด -
ค่าเฉลี่ย
คุณสามารถใช้ไฟล์ mean() ฟังก์ชันสำหรับค้นหาค่าเฉลี่ยดังที่แสดงไว้ที่นี่ -
timeseries.mean()
จากนั้นผลลัพธ์ที่คุณจะสังเกตเห็นจากตัวอย่างที่กล่าวถึงคือ -
-0.11143128165238671
ขีดสุด
คุณสามารถใช้ไฟล์ max() ฟังก์ชันสำหรับการค้นหาค่าสูงสุดดังที่แสดงไว้ที่นี่ -
timeseries.max()
จากนั้นผลลัพธ์ที่คุณจะสังเกตเห็นจากตัวอย่างที่กล่าวถึงคือ -
3.4952999999999999
ขั้นต่ำ
คุณสามารถใช้ฟังก์ชัน min () เพื่อค้นหาค่าต่ำสุดดังที่แสดงไว้ที่นี่ -
timeseries.min()
จากนั้นผลลัพธ์ที่คุณจะสังเกตเห็นจากตัวอย่างที่กล่าวถึงคือ -
-4.2656999999999998
รับทุกอย่างพร้อมกัน
หากคุณต้องการคำนวณสถิติทั้งหมดในแต่ละครั้งคุณสามารถใช้ไฟล์ describe() ฟังก์ชันดังแสดงที่นี่ -
timeseries.describe()
จากนั้นผลลัพธ์ที่คุณจะสังเกตเห็นจากตัวอย่างที่กล่าวถึงคือ -
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
การสุ่มตัวอย่างซ้ำ
คุณสามารถสุ่มตัวอย่างข้อมูลตามความถี่เวลาอื่นได้ พารามิเตอร์สองตัวสำหรับการสุ่มตัวอย่างซ้ำคือ -
- ระยะเวลา
- Method
การสุ่มตัวอย่างซ้ำด้วยค่าเฉลี่ย ()
คุณสามารถใช้รหัสต่อไปนี้เพื่อสุ่มตัวอย่างข้อมูลด้วยวิธี mean () ซึ่งเป็นวิธีเริ่มต้น -
timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()
จากนั้นคุณสามารถสังเกตกราฟต่อไปนี้เป็นผลลัพธ์ของการสุ่มตัวอย่างใหม่โดยใช้ค่าเฉลี่ย () -
สุ่มตัวอย่างซ้ำด้วยค่ามัธยฐาน ()
คุณสามารถใช้รหัสต่อไปนี้เพื่อสุ่มตัวอย่างข้อมูลโดยใช้ไฟล์ median()วิธีการ -
timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()
จากนั้นคุณสามารถสังเกตกราฟต่อไปนี้เป็นผลลัพธ์ของการสุ่มตัวอย่างซ้ำด้วยค่ามัธยฐาน () -
ค่าเฉลี่ยการหมุน
คุณสามารถใช้รหัสต่อไปนี้เพื่อคำนวณค่าเฉลี่ยการเคลื่อนที่ (เคลื่อนที่) -
timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()
จากนั้นคุณสามารถสังเกตกราฟต่อไปนี้เป็นผลลัพธ์ของค่าเฉลี่ยการหมุน (เคลื่อนที่) -
การวิเคราะห์ข้อมูลตามลำดับโดย Hidden Markov Model (HMM)
HMM เป็นแบบจำลองทางสถิติที่ใช้กันอย่างแพร่หลายสำหรับข้อมูลที่มีความต่อเนื่องและความสามารถในการขยายเช่นการวิเคราะห์ตลาดหุ้นแบบอนุกรมเวลาการตรวจสุขภาพและการรู้จำเสียง ส่วนนี้จะอธิบายรายละเอียดเกี่ยวกับการวิเคราะห์ข้อมูลตามลำดับโดยใช้ Hidden Markov Model (HMM)
แบบจำลอง Markov ที่ซ่อนอยู่ (HMM)
HMM เป็นแบบจำลองสุ่มซึ่งสร้างขึ้นจากแนวคิดของห่วงโซ่ Markov โดยอาศัยสมมติฐานที่ว่าความน่าจะเป็นของสถิติในอนาคตขึ้นอยู่กับสถานะของกระบวนการปัจจุบันเท่านั้นแทนที่จะเป็นสถานะใด ๆ ที่นำหน้า ตัวอย่างเช่นเมื่อทอยเหรียญเราไม่สามารถพูดได้ว่าผลของการโยนครั้งที่ห้าจะเป็นหัว เนื่องจากเหรียญไม่มีหน่วยความจำใด ๆ และผลลัพธ์ถัดไปไม่ได้ขึ้นอยู่กับผลลัพธ์ก่อนหน้านี้
ในทางคณิตศาสตร์ HMM ประกอบด้วยตัวแปรต่อไปนี้ -
รัฐ (S)
เป็นชุดของสถานะที่ซ่อนอยู่หรือสถานะแฝงที่มีอยู่ใน HMM แสดงโดย S.
สัญลักษณ์เอาต์พุต (O)
เป็นชุดของสัญลักษณ์เอาต์พุตที่เป็นไปได้ที่มีอยู่ใน HMM แสดงโดย O.
เมทริกซ์ความน่าจะเป็นของการเปลี่ยนสถานะ (A)
มันเป็นความน่าจะเป็นของการเปลี่ยนสถานะจากสถานะหนึ่งไปเป็นอีกสถานะหนึ่ง แสดงโดย A.
เมทริกซ์ความน่าจะเป็นการปล่อยการสังเกต (B)
เป็นความน่าจะเป็นของการเปล่ง / สังเกตสัญลักษณ์ในสถานะหนึ่ง ๆ แสดงโดย B.
เมทริกซ์ความน่าจะเป็นก่อนหน้า (Π)
เป็นความน่าจะเป็นของการเริ่มต้นที่สถานะใดสถานะหนึ่งจากสถานะต่างๆของระบบ แสดงโดยΠ
ดังนั้น HMM อาจถูกกำหนดเป็น = (S,O,A,B,),
ที่ไหน
- S = {s1,s2,…,sN} เป็นชุดของ N สถานะที่เป็นไปได้
- O = {o1,o2,…,oM} เป็นชุดของสัญลักษณ์การสังเกตที่เป็นไปได้ M
- A คือไฟล์ NN เมทริกซ์ความน่าจะเป็นของการเปลี่ยนสถานะ (TPM)
- B คือไฟล์ NM การสังเกตหรือเมทริกซ์ความน่าจะเป็นการปล่อย (EPM)
- πคือเวกเตอร์การแจกแจงความน่าจะเป็นสถานะเริ่มต้น N มิติ
ตัวอย่าง: การวิเคราะห์ข้อมูลตลาดหุ้น
ในตัวอย่างนี้เราจะวิเคราะห์ข้อมูลของตลาดหุ้นทีละขั้นตอนเพื่อให้เข้าใจว่า HMM ทำงานอย่างไรกับข้อมูลลำดับหรืออนุกรมเวลา โปรดทราบว่าเรากำลังใช้ตัวอย่างนี้ใน Python
นำเข้าแพ็คเกจที่จำเป็นดังแสดงด้านล่าง -
import datetime
import warnings
ตอนนี้ใช้ข้อมูลตลาดหุ้นจาก matpotlib.finance แพคเกจดังแสดงที่นี่ -
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
โหลดข้อมูลจากวันที่เริ่มต้นและวันที่สิ้นสุดเช่นระหว่างวันที่ระบุสองวันดังที่แสดงไว้ที่นี่ -
start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)
ในขั้นตอนนี้เราจะแยกคำพูดปิดทุกวัน สำหรับสิ่งนี้ให้ใช้คำสั่งต่อไปนี้ -
closing_quotes = np.array([quote[2] for quote in quotes])
ตอนนี้เราจะแยกปริมาณการซื้อขายหุ้นทุกวัน สำหรับสิ่งนี้ให้ใช้คำสั่งต่อไปนี้ -
volumes = np.array([quote[5] for quote in quotes])[1:]
ที่นี่ให้หาเปอร์เซ็นต์ความแตกต่างของราคาปิดหุ้นโดยใช้รหัสที่แสดงด้านล่าง -
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])
ในขั้นตอนนี้ให้สร้างและฝึก HMM Gaussian สำหรับสิ่งนี้ให้ใช้รหัสต่อไปนี้ -
hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
warnings.simplefilter('ignore')
hmm.fit(training_data)
ตอนนี้สร้างข้อมูลโดยใช้แบบจำลอง HMM โดยใช้คำสั่งที่แสดง -
num_samples = 300
samples, _ = hmm.sample(num_samples)
สุดท้ายในขั้นตอนนี้เราจะวางแผนและแสดงภาพเปอร์เซ็นต์ความแตกต่างและปริมาณของหุ้นที่ซื้อขายเป็นผลลัพธ์ในรูปแบบของกราฟ
ใช้รหัสต่อไปนี้เพื่อลงจุดและแสดงภาพเปอร์เซ็นต์ความแตกต่าง -
plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')
ใช้รหัสต่อไปนี้เพื่อลงจุดและแสดงภาพปริมาณหุ้นที่ซื้อขาย -
plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()