Меня заинтриговала возможность предсказывать будущее на основе прошлой и текущей информации, поэтому я в первую очередь стал Data Scientist. Является ли Вселенная детерминированной? И если да, сможем ли мы когда-нибудь инкапсулировать все переменные, ведущие к настоящему моменту? Как бы то ни было, даже если вы можете предсказать будущее, это просто делает предсказанное будущее более невероятным. Странно, да?

«Предсказывать очень сложно, особенно если речь идет о будущем». — Нильс Бор

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

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

Ну это облом :(

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

Имея это в виду и мою естественную склонность возиться с технологиями, я пытаюсь найти что-то супер изменчивое и сложное, чтобы увидеть, как сбываются прогнозы, — Биткойн. Итак, я пошел на Kaggle и нашел этот набор данных биткойнов, в котором были данные с января 2012 года по март 2021 года, и попытался предсказать цены с помощью LSTM.

Что такое ЛСТМ?

LSTM расшифровывается как Long Short-Term Memory, тип архитектуры рекуррентной нейронной сети (RNN), обычно используемый в глубоком обучении. Он предназначен для эффективной обработки и изучения последовательностей данных, таких как временные ряды или текст. В отличие от традиционных RNN, сети LSTM оснащены ячейкой памяти, которая может хранить и обновлять информацию с течением времени. Эта ячейка памяти управляется вентилями, регулирующими поток информации, состоящими из входных вентилей, вентилей забывания и выходных вентилей. Прежде чем мы рассмотрим, как передается информация, давайте рассмотрим некоторые строительные блоки LSTM.

  1. Ячейка памяти (ct)
  • Ячейка памяти (ct) в LSTM отвечает за сохранение и обновление информации с течением времени.
  • Он действует как долговременная память LSTM и может выборочно хранить или отбрасывать информацию.

2. Предыдущая ячейка памяти (ct-1)

  • ct-1 представляет предыдущее состояние ячейки памяти, которое содержит информацию с предыдущего временного шага.

3. Скрытое состояние (ht)

  • Скрытое состояние (ht) содержит информацию о предыдущих входных данных и используется для передачи информации на следующий временной шаг.
  • Он действует как сжатое представление предыдущих входных данных и фиксирует краткосрочные зависимости.

4. Предыдущее скрытое состояние (ht-1)

  • ht-1 представляет предыдущее скрытое состояние, которое содержит информацию с предыдущего временного шага.

5. Ввод (xt)

  • xt представляет ввод на текущем временном шаге, например, слово в последовательности или функцию во временном ряду.

6. Функции активации

  • В LSTM обычно используются две функции активации: сигмовидная (σ) и гиперболический тангенс (tanh).
  • Сигмовидная функция используется для управления потоком информации, решая, что сохранить, а что отбросить.
  • Функция tanh используется для преобразования значений и внесения нелинейности в вычисления LSTM.

7. Операторы

  • Сложение (+) и поэлементное умножение (x) являются ключевыми операторами, используемыми в LSTM.

Теперь давайте опишем высокоуровневый поток информации в модуле LSTM:

  1. Входные ворота:
  • Входной вентиль определяет, какие части текущего ввода (xt) и предыдущего скрытого состояния (ht-1) должны быть включены в ячейку памяти (ct).
  • Он берет конкатенацию xt и ht-1 и пропускает ее через сигмовидную функцию активации (σ) для получения значений активации входных ворот (it).
  • Между ним и выходом другой функции активации tanh, примененной к конкатенации xt и ht-1, выполняется поэлементное умножение.
  • Эта операция объединяет преобразованную входную информацию со значениями активации входного вентиля для обновления ячейки памяти.

2. Забыть ворота:

  • Ворота забывания решают, какую информацию из предыдущей ячейки памяти (ct-1) следует отбросить.
  • Он берет конкатенацию xt и ht-1 и пропускает ее через сигмовидную функцию активации (σ), чтобы получить значения активации ворот забывания (ft).
  • Поэлементное умножение выполняется между ft и ct-1, представляя, какую часть предыдущего состояния ячейки памяти следует забыть.

3. Обновление ячейки памяти:

  • Ячейка памяти (ct) обновляется путем объединения информации от входа и забывания.
  • Выход входного вентиля поэлементно умножается на выход функции активации tanh, примененной к конкатенации xt и ht-1.
  • Выход забывающего вентиля поэлементно умножается на предыдущую ячейку памяти (ct-1).
  • Результирующие векторы суммируются, представляя обновленное состояние ячейки памяти (ct).

4. Выходные ворота:

  • Выходной вентиль определяет, какие части ячейки памяти (ct) должны быть выставлены в качестве вывода (ht).
  • Он берет конкатенацию xt и ht-1 и пропускает ее через сигмовидную функцию активации (σ) для получения значений активации выходного вентиля (ot).
  • Обновленная ячейка памяти (ct) проходит через функцию активации tanh, в результате чего получается вектор значений от -1 до 1.
  • Поэлементное умножение выполняется между ot и выходом функции активации tanh, в результате чего получается конечное скрытое состояние (ht).

LSTM для прогнозирования цен на биткойны

Хорошо, теперь, когда мы знаем проблему и обладаем знаниями о LSTM, давайте посмотрим, насколько хорошо мы можем прогнозировать цены.

Шаг 1. Подготовка данных

Собираются исторические данные о цене акций, включая такие характеристики, как цена открытия, цена закрытия, объем и т. д. Для нашей задачи мы будем рассматривать цену открытия только с интервалом в одну минуту. Затем данные делятся на наборы для обучения и тестирования, обычно большая часть (80%) выделяется для обучения.

# Splitting data into test and train
training_data = data.iloc[:round(data.shape[0]*0.8),:].reset_index(drop=True)
test_data = data.iloc[round(data.shape[0]*0.8):,:].reset_index(drop=True)

Вот снимок данных обучения:

Шаг 2. Кодирование ввода

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

# Feature scaling
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range=(-0.5,0.5))
sc.fit(training_set)

training_set_scaled = sc.transform(training_set)
test_set_scaled = sc.transform(test_set)

# Creating a data structure with 60 timesteps and 1 output
x_train = []
y_train = []

for i in range(60, training_set_scaled.shape[0]):
  x_train.append(training_set_scaled[i-60:i, 0])
  y_train.append(training_set_scaled[i, 0])

# Converting x_train and y_train into numpy array
x_train, y_train = np.array(x_train), np.array(y_train)

Шаг 3. Архитектура LSTM

Модель LSTM строится, как правило, с одним или несколькими слоями LSTM, за которыми следуют полностью связанные слои для прогнозирования. Здесь я создал простую архитектуру с 4 слоями LSTM. Количество модулей LSTM на уровень и общую архитектуру можно определить на основе экспериментов и знаний предметной области.

# Define an object (inilitizing RNN)
model = tf.keras.models.Sequential()

# First LSTM layer
model.add(tf.keras.layers.LSTM(units=60, activation='relu', return_sequences=True, input_shape=(60,1)))
# Dropout layer
model.add(tf.keras.layers.Dropout(0.2))

# Second LSTM layer
model.add(tf.keras.layers.LSTM(units=60, activation='relu', return_sequences=True))
# Dropout layer
model.add(tf.keras.layers.Dropout(0.2))

# Third LSTM layer
model.add(tf.keras.layers.LSTM(units=80, activation='relu', return_sequences=True))
# Dropout layer
model.add(tf.keras.layers.Dropout(0.2))

# Fourth LSTM layer
model.add(tf.keras.layers.LSTM(units=120, activation='relu'))
# Dropout layer
model.add(tf.keras.layers.Dropout(0.2))

# Output layer
model.add(tf.keras.layers.Dense(units=1))

Шаг 4. Обучение

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

# Compile the model
model.compile(optimizer='adam', loss='mean_squared_error')

# Train the model
model.fit(x_train, y_train, batch_size=10000, epochs=5)

Шаг 5. Прогноз

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

# Preparing test data
x_test = []
for i in range(60, test_set_scaled.shape[0]):
  x_test.append(test_set_scaled[i-60:i, 0])

# Convert in numpy array
x_test = np.array(x_test)
# Convert in 3D (required to process)
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))

# Getting predicted BTC prices
predicted_BTC_price = model.predict(x_test)
predicted_BTC_price = sc.inverse_transform(predicted_BTC_price)

Шаг 6. Оценка

Прогнозируемые цены акций сравниваются с фактическими значениями для оценки эффективности модели. Для оценки точности прогноза можно использовать такие показатели, как среднеквадратическая ошибка (MSE), среднеквадратическая ошибка (RMSE) или средняя абсолютная ошибка (MAE). Здесь мы строим график между фактическими ценами BTC и ценами, предсказанными моделью.

# Plotting the actual vs predicted BTC price
import matplotlib.pyplot as plt
plt.plot(test_data['Timestamp'][:560000], test_set[:560000], color='red', label='Real Bitcoin Price')
plt.plot(test_data['Timestamp'][:560000], predicted_BTC_price[:560000], color='blue', label='Predicted Bitcoin Price')
plt.title('Bitcoin Price Prediction')
plt.xlabel('Time')
plt.ylabel('Bitcoin Price')
plt.legend()

plt.show()

Как видите, прогнозы не далеки от реальности, но после ноября 2020 года прогнозы теряют смысл из-за внезапного изменения цен на биткойны.

Ну, я надеюсь, что этот урок был полезен для вас, и если вы хотите получать больше таких статей, проявите свою любовь, оставив как можно больше хлопков, и следите за моей страницей, подписывайтесь на мою ленту :)

Найдите меня здесь: https://bento.me/harjotpahwa