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()