AI с Python - анализ данных временных рядов

Предсказание следующего в заданной входной последовательности - еще одна важная концепция машинного обучения. В этой главе дается подробное объяснение анализа данных временных рядов.

Введение

Данные временных рядов означают данные, которые находятся в серии определенных временных интервалов. Если мы хотим построить предсказание последовательности в машинном обучении, то нам придется иметь дело с последовательными данными и временем. Серийные данные - это абстракция последовательных данных. Упорядочивание данных - важная особенность последовательных данных.

Основная концепция анализа последовательности или анализа временных рядов

Анализ последовательности или анализ временных рядов предназначен для прогнозирования следующего в заданной входной последовательности на основе ранее наблюдаемых. Прогноз может быть любым, что может произойти дальше: символом, числом, погодой на следующий день, следующим термином в речи и т. Д. Анализ последовательности может быть очень удобен в таких приложениях, как анализ фондового рынка, прогнозирование погоды и рекомендации по продуктам.

Example

Рассмотрим следующий пример, чтобы понять предсказание последовательности. ВотA,B,C,D являются заданными значениями, и вы должны предсказать значение E с использованием модели прогнозирования последовательности.

Установка полезных пакетов

Для анализа данных временных рядов с использованием Python нам необходимо установить следующие пакеты:

Панды

Pandas - это библиотека с открытым исходным кодом под лицензией BSD, которая обеспечивает высокую производительность, простоту использования структур данных и инструменты анализа данных для Python. Вы можете установить Pandas с помощью следующей команды -

pip install pandas

Если вы используете Anaconda и хотите установить, используя conda менеджер пакетов, вы можете использовать следующую команду -

conda install -c anaconda pandas

хмммучиться

Это библиотека с открытым исходным кодом под лицензией BSD, которая состоит из простых алгоритмов и моделей для изучения скрытых марковских моделей (HMM) в Python. Вы можете установить его с помощью следующей команды -

pip install hmmlearn

Если вы используете Anaconda и хотите установить, используя conda менеджер пакетов, вы можете использовать следующую команду -

conda install -c omnia hmmlearn

PyStruct

Это структурированная библиотека для обучения и прогнозирования. Алгоритмы обучения, реализованные в PyStruct, имеют такие имена, как условные случайные поля (CRF), марковские случайные сети с максимальным запасом (M3N) или машины структурных опорных векторов. Вы можете установить его с помощью следующей команды -

pip install pystruct

CVXOPT

Используется для выпуклой оптимизации на основе языка программирования Python. Это также бесплатный программный пакет. Вы можете установить его с помощью следующей команды -

pip install cvxopt

Если вы используете Anaconda и хотите установить, используя conda менеджер пакетов, вы можете использовать следующую команду -

conda install -c anaconda cvdoxt

Pandas: обработка, нарезка и извлечение статистики из данных временных рядов

Pandas - очень полезный инструмент, если вам нужно работать с данными временных рядов. С помощью Pandas вы можете выполнить следующее -

  • Создайте диапазон дат, используя pd.date_range пакет

  • Индексируйте панд датами с помощью pd.Series пакет

  • Выполните повторную выборку с помощью ts.resample пакет

  • Измените частоту

пример

В следующем примере показано, как обрабатывать и нарезать данные временных рядов с помощью Pandas. Обратите внимание, что здесь мы используем данные о месячных арктических колебаниях, которые можно загрузить с сайта 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()

Вы увидите графики, как показано на следующих изображениях -

Нарезка данных временного ряда

Нарезка включает получение только некоторой части данных временного ряда. В качестве части примера мы разрезаем данные только с 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 ()

Вы можете использовать следующий код для повторной выборки данных с помощью метода mean (), который является методом по умолчанию:

timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()

Затем вы можете наблюдать следующий график как результат передискретизации с использованием mean () -

Повторная выборка с использованием медианы ()

Вы можете использовать следующий код для повторной выборки данных с помощью median()метод -

timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()

Затем вы можете наблюдать следующий график как результат повторной выборки с median () -

Скользящее среднее

Вы можете использовать следующий код для вычисления скользящего (скользящего) среднего -

timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()

Затем вы можете наблюдать следующий график как результат скользящего (скользящего) среднего -

Анализ последовательных данных с помощью скрытой марковской модели (HMM)

HMM - это статистическая модель, которая широко используется для данных, имеющих продолжение и расширяемость, таких как анализ фондового рынка временных рядов, проверка работоспособности и распознавание речи. В этом разделе подробно рассматривается анализ последовательных данных с использованием скрытой марковской модели (HMM).

Скрытая марковская модель (HMM)

HMM - это стохастическая модель, построенная на концепции цепи Маркова, основанной на предположении, что вероятность будущих статистических данных зависит только от текущего состояния процесса, а не от любого состояния, которое ему предшествовало. Например, подбрасывая монету, мы не можем сказать, что результатом пятого подбрасывания будет голова. Это связано с тем, что у монеты нет памяти, и следующий результат не зависит от предыдущего.

Математически HMM состоит из следующих переменных -

Штаты (S)

Это набор скрытых или скрытых состояний, присутствующих в HMM. Обозначается он S.

Выходные символы (O)

Это набор возможных выходных символов, присутствующих в HMM. Обозначается O.

Матрица вероятности перехода состояний (A)

Это вероятность перехода из одного состояния в каждое из других состояний. Обозначается А.

Матрица вероятности выбросов при наблюдении (B)

Это вероятность появления / наблюдения символа в определенном состоянии. Обозначается буквой B.

Матрица априорной вероятности (Π)

Это вероятность запуска в определенном состоянии из различных состояний системы. Обозначается он.

Следовательно, HMM можно определить как = (S,O,A,B,),

где,

  • S = {s1,s2,…,sN} набор из N возможных состояний,
  • O = {o1,o2,…,oM} - набор из M возможных символов наблюдения,
  • А - это 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. Для этого используйте следующий код -

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