#python #tensorflow #keras #lstm
#python #тензорный поток #keras #lstm
Вопрос:
Я пытаюсь сделать предиктор акций, я знаю, что модель, которую я создам, не будет отличной, но тем не менее. Во-первых, ниже я добавлю код, который форматирует X и Y. X содержит цены на акции за 10 дней, Y содержит ответы (цены на следующие дни).
import yfinance as yf
import numpy as np
import pandas as pd
import json
from sys import exit
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dropout
from keras.layers import Dense
with open('/content/drive/MyDrive/tickers.json', 'r', encoding='utf-8') as f:
tickers_list = eval(json.loads(f.read()))['tickers'][:100] # list of tickers
X = []
Y = []
for ticker in tickers_list:
stock = yf.download(ticker,'1990-01-01','2019-12-31')['Adj Close'].values
for i in range(len(stock)):
try:
stock[i 11]
except:
continue
X.append(stock[i:i 10])
Y.append([stock[i 11]])
X = np.array(X) #price for 10 days
Y = np.array(Y) #price for next day
После этого я написал код для создания модели.
X_train = np.expand_dims(X, 1)
model = Sequential()
model.add(LSTM(units=64,return_sequences=True, input_shape=(10, 1)))
model.add(Dropout(0.2))
model.add(LSTM(units=64,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=64,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=64))
model.add(Dropout(0.2))
model.add(Dense(units=1))
model.compile(optimizer='adam',loss='mean_squared_error')
print(model.summary())
model.fit(X_train, Y, epochs=100, batch_size=32)
Но когда я запустил приведенный выше код, я получил сообщение об ошибке.
Input 0 is incompatible with layer sequential_17: expected shape=(None, None, 1), found shape=[None, 1, 10]
Как это исправить?
Спасибо.
Примечание. Если у вас есть какие-либо предложения, которые могли бы улучшить мои исследования, пожалуйста, напишите мне здесь.
Комментарии:
1. какой результат
X_train.shape
?2. Вывод X_train.shape равен (474299, 1, 10)
Ответ №1:
Измените эту строку:
X_train = np.expand_dims(X, 2) # 2 instead of 1
Комментарии:
1. Спасибо, есть ли у вас какие-либо предложения для меня, которые могли бы улучшить мою модель? После первой потери эпохи составляет nan.
2. если потери равны nan, проверьте, есть ли Nan в вашем наборе данных, и удалите их
3. Я не буду принимать ваш ответ в течение 30 минут, я буду ждать предложений. Ваш ответ решил мою проблему.
4. @BDouchet, что ты думаешь. Технически, должна ли моя модель работать?
5. попробуйте уменьшить количество слоев LSTM (начните с одного). 4 слоя могут быть нестабильными
Ответ №2:
Я предлагаю вам использовать эту функцию для создания набора данных временных рядов. Ваш, включая обработку ошибок, кажется неоптимальным. Эта функция взята из прошлой версии официальной документации Tensorflow. Кроме того, кажется, что вы объединяете кучу временных рядов один за другим, что не имеет смысла.
def univariate_data(dataset, start_index, end_index, history_size,
target_size, single_step=False):
data, labels = [], []
start_index = start_index history_size
if end_index is None:
end_index = len(dataset) - target_size
for i in range(start_index, end_index):
indices = np.arange(i-history_size, i)
data.append(np.reshape(dataset[indices], (history_size, 1)))
if single_step:
labels.append(dataset[i target_size])
else:
labels.append(dataset[i:i target_size])
return np.array(data), np.array(labels)
Тогда вы даже не столкнетесь с проблемой, с которой столкнулись. Кроме того, обратите внимание, что вам не нужно печатать model.summary()
, вызов этого метода автоматически печатает его. Вот полный рабочий пример с предоставленной мной функцией:
import yfinance as yf
import numpy as np
import tensorflow as tf
stock = yf.download('aapl','1990-01-01','2019-12-31')['Adj Close'].values
def univariate_data(dataset, start_index, end_index, history_size,
target_size, single_step=False):
data, labels = [], []
start_index = start_index history_size
if end_index is None:
end_index = len(dataset) - target_size
for i in range(start_index, end_index):
indices = np.arange(i-history_size, i)
data.append(np.reshape(dataset[indices], (history_size, 1)))
if single_step:
labels.append(dataset[i target_size])
else:
labels.append(dataset[i:i target_size])
return np.array(data), np.array(labels)
X, y = univariate_data(stock, 0, len(stock) - 1, 10, 1, True)
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(units=8,return_sequences=True,
input_shape=(10, 1)))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.LSTM(units=8,return_sequences=True))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.LSTM(units=8,return_sequences=True))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.LSTM(units=8))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Dense(units=1))
model.compile(optimizer='adam',loss='mean_squared_error')
model.summary()
history = model.fit(X, y, steps_per_epoch=1)
7547/7547 [==============================] - 12s 2ms/sample - loss: 286.5788
Комментарии:
1. Большое спасибо
2. Как что-то предсказать? aapl = np.array(список(yf.download(‘AAPL’,’2020-11-25′,’2020-12-10′)[‘ Adj Закрыть’].значения)) aapl = np.expand_dims(aapl, 1) model.predict(aapl) дает мне ввод 0 последовательного уровня, несовместимого суровень: ожидаемый ndim = 3, найденный ndim = 2. Получена полная форма: [Нет, 1]
3. Если вы создаете тестовые данные, вам также необходимо передать их через функцию
4. Кстати, я почти уверен, что вы объединяете несколько временных рядов один за другим, что не имеет смысла.
5. что вы делаете? Я знаю, что моя модель не подойдет для ее задачи.