18+
реклама
18+
Бургер менюБургер меню

Джейд Картер – 120 практических задач (страница 7)

18

# Шаг 2: Подготовка данных

# Загрузка данных. Предположим, что у нас есть CSV файл с историческими ценами на акции.

data = pd.read_csv('stock_prices.csv')

# Выбираем интересующие нас столбцы, например, 'Close'

prices = data['Close'].values.reshape(-1, 1)

# Нормализация данных

scaler = MinMaxScaler(feature_range=(0, 1))

scaled_prices = scaler.fit_transform(prices)

# Создание последовательностей для обучения модели

def create_sequences(data, sequence_length):

sequences = []

targets = []

for i in range(len(data) – sequence_length):

sequences.append(data[i:i + sequence_length])

targets.append(data[i + sequence_length])

return np.array(sequences), np.array(targets)

sequence_length = 60 # 60 дней

X, y = create_sequences(scaled_prices, sequence_length)

# Разделение данных на обучающую и тестовую выборки

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

# Шаг 3: Построение модели RNN

model = models.Sequential()

model.add(layers.LSTM(50, return_sequences=True, input_shape=(sequence_length, 1)))

model.add(layers.LSTM(50, return_sequences=False))

model.add(layers.Dense(25))

model.add(layers.Dense(1))

# Шаг 4: Компиляция и обучение модели

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

history = model.fit(X_train, y_train, batch_size=32, epochs=10,

validation_data=(X_test, y_test))

# Шаг 5: Оценка модели

predictions = model.predict(X_test)

predictions = scaler.inverse_transform(predictions)

# Визуализация результатов

plt.figure(figsize=(10, 6))

plt.plot(data.index[:len(data) – len(y_test)], scaler.inverse_transform(scaled_prices[:len(scaled_prices) – len(y_test)]), color='blue', label='Исторические данные')

plt.plot(data.index[len(data) – len(y_test):], scaler.inverse_transform(scaled_prices[len(scaled_prices) – len(y_test):]), color='orange', label='Истинные значения')

plt.plot(data.index[len(data) – len(y_test):], predictions, color='red', label='Прогнозы')

plt.xlabel('Дата')

plt.ylabel('Цена акции')

plt.legend()

plt.show()

```

Пояснение:

1. Импорт библиотек: Импортируются необходимые библиотеки, включая TensorFlow, Keras, pandas и matplotlib.

2. Подготовка данных: Загружаются данные о ценах акций из CSV файла и нормализуются с помощью MinMaxScaler. Создаются последовательности для обучения модели.

3. Построение модели RNN: Модель строится с использованием двух LSTM слоев. Первый слой LSTM возвращает последовательность, которая передается следующему слою. Второй слой LSTM возвращает конечный выход, который подается на полносвязные слои для получения прогноза.

4. Компиляция и обучение модели: Модель компилируется с использованием оптимизатора Adam и функции потерь mean_squared_error. Затем модель обучается на обучающей выборке.

5. Оценка и тестирование модели: Прогнозы модели сравниваются с реальными данными, и результаты визуализируются с помощью графика.

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

Построение модели RNN

Использование двух LSTM слоев

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

Первый слой LSTM

Первый слой LSTM принимает последовательность данных на вход и возвращает последовательность, которая будет передана следующему слою. Возвращение последовательности (return_sequences=True) необходимо, чтобы каждый временной шаг предыдущего слоя был передан на вход следующего слоя LSTM. Это позволяет следующему слою LSTM дополнительно обрабатывать временные зависимости.

```python

model.add(layers.LSTM(50, return_sequences=True, input_shape=(sequence_length, 1)))

```

– 50 нейронов: Это количество нейронов в первом слое LSTM. Число нейронов определяет способность сети к обучению сложным паттернам.

–return_sequences=True: Указывает, что слой должен возвращать полную последовательность выходов для каждого временного шага, а не только последний выход.

– input_shape=(sequence_length, 1): Определяет форму входных данных, где `sequence_length` – это длина последовательности (например, 60 дней), а `1` – это количество признаков (в данном случае, только одно значение цены закрытия).

Второй слой LSTM

Второй слой LSTM принимает последовательность от первого слоя и возвращает конечный выход для всей последовательности. Здесь параметр `return_sequences` установлен в `False`, что означает, что слой будет возвращать только последний выходной элемент последовательности.

```python

model.add(layers.LSTM(50, return_sequences=False))