AI dengan Python - Menganalisis Data Rangkaian Waktu
Memprediksi yang berikutnya dalam urutan masukan tertentu adalah konsep penting lainnya dalam pembelajaran mesin. Bab ini memberi Anda penjelasan rinci tentang menganalisis data deret waktu.
pengantar
Data deret waktu berarti data yang berada dalam rangkaian interval waktu tertentu. Jika kita ingin membuat prediksi urutan dalam pembelajaran mesin, maka kita harus berurusan dengan data dan waktu berurutan. Data seri merupakan abstrak dari data sekuensial. Pengurutan data adalah fitur penting dari data sekuensial.
Konsep Dasar Analisis Urutan atau Analisis Rangkaian Waktu
Analisis urutan atau analisis deret waktu adalah untuk memprediksi berikutnya dalam urutan masukan yang diberikan berdasarkan pengamatan sebelumnya. Prediksi dapat berupa apa saja yang mungkin datang berikutnya: simbol, angka, cuaca hari berikutnya, istilah berikutnya dalam pidato, dll. Analisis urutan bisa sangat berguna dalam aplikasi seperti analisis pasar saham, prakiraan cuaca, dan rekomendasi produk.
Example
Pertimbangkan contoh berikut untuk memahami prediksi urutan. SiniA,B,C,D adalah nilai yang diberikan dan Anda harus memprediksi nilainya E menggunakan Model Prediksi Urutan.
Menginstal Paket Berguna
Untuk analisis data deret waktu menggunakan Python, kita perlu menginstal paket berikut -
Panda
Pandas adalah pustaka berlisensi BSD open source yang menyediakan kinerja tinggi, kemudahan penggunaan struktur data dan alat analisis data untuk Python. Anda dapat menginstal Pandas dengan bantuan perintah berikut -
pip install pandas
Jika Anda menggunakan Anaconda dan ingin menginstal dengan menggunakan file conda manajer paket, maka Anda dapat menggunakan perintah berikut -
conda install -c anaconda pandas
hmmpelajari
Ini adalah pustaka berlisensi BSD open source yang terdiri dari algoritme dan model sederhana untuk mempelajari Hidden Markov Model (HMM) dengan Python. Anda dapat menginstalnya dengan bantuan perintah berikut -
pip install hmmlearn
Jika Anda menggunakan Anaconda dan ingin menginstal dengan menggunakan file conda manajer paket, maka Anda dapat menggunakan perintah berikut -
conda install -c omnia hmmlearn
PyStruct
Ini adalah pembelajaran terstruktur dan perpustakaan prediksi. Algoritme pembelajaran yang diterapkan di PyStruct memiliki nama seperti bidang acak bersyarat (CRF), Jaringan Acak Markov Margin Maksimum (M3N), atau mesin vektor dukungan struktural. Anda dapat menginstalnya dengan bantuan perintah berikut -
pip install pystruct
CVXOPT
Ini digunakan untuk pengoptimalan konveks berdasarkan bahasa pemrograman Python. Ini juga merupakan paket perangkat lunak gratis. Anda dapat menginstalnya dengan bantuan perintah berikut -
pip install cvxopt
Jika Anda menggunakan Anaconda dan ingin menginstal dengan menggunakan file conda manajer paket, maka Anda dapat menggunakan perintah berikut -
conda install -c anaconda cvdoxt
Panda: Menangani, Mengiris, dan Mengekstrak Statistik dari Data Rangkaian Waktu
Panda adalah alat yang sangat berguna jika Anda harus bekerja dengan data deret waktu. Dengan bantuan Pandas, Anda dapat melakukan hal berikut -
Buat rentang tanggal dengan menggunakan pd.date_range paket
Buat indeks panda dengan kurma menggunakan pd.Series paket
Lakukan pengambilan sampel ulang dengan menggunakan ts.resample paket
Ubah frekuensinya
Contoh
Contoh berikut ini memperlihatkan Anda menangani dan memotong data deret waktu dengan menggunakan Pandas. Perhatikan bahwa di sini kita menggunakan data Monthly Arctic Oscillation, yang dapat diunduh dari bulanan.ao.index.b50.current.ascii dan dapat dikonversi ke format teks untuk kita gunakan.
Menangani data deret waktu
Untuk menangani data deret waktu, Anda harus melakukan langkah-langkah berikut -
Langkah pertama melibatkan mengimpor paket-paket berikut -
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
Selanjutnya, tentukan fungsi yang akan membaca data dari file input, seperti yang ditunjukkan pada kode yang diberikan di bawah ini -
def read_data(input_file):
input_data = np.loadtxt(input_file, delimiter = None)
Sekarang, ubah data ini menjadi deret waktu. Untuk ini, buat rentang tanggal deret waktu kami. Dalam contoh ini, kami menyimpan satu bulan sebagai frekuensi data. File kami memiliki data yang dimulai dari Januari 1950.
dates = pd.date_range('1950-01', periods = input_data.shape[0], freq = 'M')
Pada langkah ini, kami membuat data deret waktu dengan bantuan Seri Pandas, seperti yang ditunjukkan di bawah ini -
output = pd.Series(input_data[:, index], index = dates)
return output
if __name__=='__main__':
Masukkan jalur file input seperti yang ditunjukkan di sini -
input_file = "/Users/admin/AO.txt"
Sekarang, ubah kolom menjadi format deret waktu, seperti yang diperlihatkan di sini -
timeseries = read_data(input_file)
Terakhir, plot dan visualisasikan data menggunakan perintah yang ditunjukkan -
plt.figure()
timeseries.plot()
plt.show()
Anda akan mengamati plot seperti yang ditunjukkan pada gambar berikut -
Mengiris data deret waktu
Pemotongan melibatkan pengambilan hanya sebagian dari data deret waktu. Sebagai bagian dari contoh, kami memotong data hanya dari 1980 hingga 1990. Amati kode berikut yang melakukan tugas ini -
timeseries['1980':'1990'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0xa0e4b00>
plt.show()
Saat Anda menjalankan kode untuk memotong data deret waktu, Anda dapat mengamati grafik berikut seperti yang ditunjukkan pada gambar di sini -
Mengekstrak Statistik dari Data Rangkaian Waktu
Anda harus mengekstrak beberapa statistik dari data tertentu, jika Anda perlu menarik beberapa kesimpulan penting. Mean, varians, korelasi, nilai maksimum, dan nilai minimum adalah beberapa dari statistik tersebut. Anda dapat menggunakan kode berikut jika Anda ingin mengekstrak statistik tersebut dari data deret waktu tertentu -
Berarti
Anda dapat menggunakan mean() fungsi, untuk menemukan mean, seperti yang ditunjukkan di sini -
timeseries.mean()
Maka output yang akan Anda amati untuk contoh yang dibahas adalah -
-0.11143128165238671
Maksimum
Anda dapat menggunakan max() fungsi, untuk menemukan maksimum, seperti yang ditunjukkan di sini -
timeseries.max()
Maka output yang akan Anda amati untuk contoh yang dibahas adalah -
3.4952999999999999
Minimum
Anda dapat menggunakan fungsi min (), untuk menemukan minimum, seperti yang ditunjukkan di sini -
timeseries.min()
Maka output yang akan Anda amati untuk contoh yang dibahas adalah -
-4.2656999999999998
Mendapatkan semuanya sekaligus
Jika Anda ingin menghitung semua statistik dalam satu waktu, Anda dapat menggunakan describe() berfungsi seperti yang ditunjukkan di sini -
timeseries.describe()
Maka output yang akan Anda amati untuk contoh yang dibahas adalah -
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
Pengambilan sampel ulang
Anda dapat mengambil sampel ulang data ke frekuensi waktu yang berbeda. Dua parameter untuk melakukan pengambilan sampel ulang adalah -
- Jangka waktu
- Method
Pengambilan sampel ulang dengan mean ()
Anda dapat menggunakan kode berikut untuk mengambil sampel kembali data dengan metode mean (), yang merupakan metode default -
timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()
Kemudian, Anda dapat mengamati grafik berikut sebagai output dari resampling menggunakan mean () -
Pengambilan sampel ulang dengan median ()
Anda dapat menggunakan kode berikut untuk mengambil sampel kembali data menggunakan median()metode -
timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()
Kemudian, Anda dapat mengamati grafik berikut sebagai keluaran dari re-sampling dengan median () -
Rolling Mean
Anda dapat menggunakan kode berikut untuk menghitung rata-rata rolling (bergerak) -
timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()
Kemudian, Anda dapat mengamati grafik berikut sebagai output dari rata-rata rolling (bergerak) -
Menganalisis Data Sekuensial dengan Hidden Markov Model (HMM)
HMM merupakan model statistik yang banyak digunakan untuk data yang memiliki kelanjutan dan ekstensibilitas seperti analisis pasar saham time series, health checkup, dan speech recognition. Bagian ini membahas secara rinci dengan menganalisis data sekuensial menggunakan Hidden Markov Model (HMM).
Model Markov Tersembunyi (HMM)
HMM adalah model stokastik yang dibangun di atas konsep rantai Markov berdasarkan asumsi bahwa probabilitas statistik masa depan hanya bergantung pada status proses saat ini, bukan status sebelumnya. Misalnya, saat melempar koin, kita tidak bisa mengatakan bahwa hasil lemparan kelima adalah kepala. Ini karena koin tidak memiliki memori apa pun dan hasil selanjutnya tidak bergantung pada hasil sebelumnya.
Secara matematis, HMM terdiri dari variabel-variabel berikut -
Serikat (S)
Ini adalah sekumpulan status tersembunyi atau laten yang ada di HMM. Ini dilambangkan dengan S.
Simbol keluaran (O)
Ini adalah satu set simbol keluaran yang mungkin ada di HMM. Ini dilambangkan dengan O.
Matriks Probabilitas Transisi Status (A)
Ini adalah probabilitas untuk melakukan transisi dari satu kondisi ke kondisi lainnya. Ini dilambangkan dengan A.
Matriks Probabilitas Emisi Pengamatan (B)
Ini adalah kemungkinan memancarkan / mengamati simbol pada keadaan tertentu. Ini dilambangkan dengan B.
Matriks Probabilitas Sebelumnya (Π)
Ini adalah probabilitas untuk memulai pada keadaan tertentu dari berbagai keadaan sistem. Ini dilambangkan dengan Π.
Karenanya, HMM dapat didefinisikan sebagai = (S,O,A,B,),
dimana,
- S = {s1,s2,…,sN} adalah satu set N kemungkinan status,
- O = {o1,o2,…,oM} adalah satu set M simbol observasi yang mungkin,
- A adalah NN keadaan Transition Probability Matrix (TPM),
- B adalah NM observasi atau Emission Probability Matrix (EPM),
- π adalah vektor distribusi probabilitas keadaan awal dimensi N.
Contoh: Analisis data Pasar Saham
Dalam contoh ini, kita akan menganalisis data pasar saham, selangkah demi selangkah, untuk mendapatkan gambaran tentang bagaimana HMM bekerja dengan data sekuensial atau deret waktu. Harap dicatat bahwa kami menerapkan contoh ini dengan Python.
Impor paket yang diperlukan seperti yang ditunjukkan di bawah ini -
import datetime
import warnings
Sekarang, gunakan data pasar saham dari matpotlib.finance paket, seperti yang ditunjukkan di sini -
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
Muat data dari tanggal mulai dan tanggal akhir, yaitu antara dua tanggal tertentu seperti yang ditunjukkan di sini -
start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)
Pada langkah ini, kita akan mengekstrak kutipan penutup setiap hari. Untuk ini, gunakan perintah berikut -
closing_quotes = np.array([quote[2] for quote in quotes])
Sekarang, kami akan mengekstrak volume saham yang diperdagangkan setiap hari. Untuk ini, gunakan perintah berikut -
volumes = np.array([quote[5] for quote in quotes])[1:]
Di sini, ambil selisih persentase dari harga penutupan saham, menggunakan kode yang ditunjukkan di bawah ini -
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])
Pada langkah ini, buat dan latih Gaussian HMM. Untuk ini, gunakan kode berikut -
hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
warnings.simplefilter('ignore')
hmm.fit(training_data)
Sekarang, buat data menggunakan model HMM, menggunakan perintah yang ditunjukkan -
num_samples = 300
samples, _ = hmm.sample(num_samples)
Terakhir, pada langkah ini, kami memplot dan memvisualisasikan perbedaan persentase dan volume saham yang diperdagangkan sebagai output dalam bentuk grafik.
Gunakan kode berikut untuk memplot dan memvisualisasikan persentase perbedaan -
plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')
Gunakan kode berikut untuk merencanakan dan memvisualisasikan volume saham yang diperdagangkan -
plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()