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