Прогноз модели LSTM не меняется при изменении входных данных.Python

Программы на Python
Ответить
Anonymous
 Прогноз модели LSTM не меняется при изменении входных данных.

Сообщение Anonymous »

Я реализую в PyTorch модель LSTM, чтобы предсказать, вырастет или упадет цена акции на момент закрытия в следующие 5 и 10 минут.
В частности, я использую 5-минутные данные за 24 года с 19 функции, разделенные на части по одной неделе на прогноз (с использованием 7 разных акций).
Проблема, с которой я сталкиваюсь, заключается в том, что, несмотря ни на что, модель LSTM, похоже, предсказывает значения вокруг одного конкретного значения. чтобы всегда минимизировать потери, которые не сильно уменьшаются.
Я предварительно готовлю входные данные и цели в torch.tensors с помощью [batch_size, последовательности_len, функций] (которые в моем случай [32, 2016, 19]), нормализуйте их между 0 и 1 и передайте в мою модель LSTM, которая структурирована следующим образом:
class MultiInputOutputLSTM(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size, dropout, lr, batch_size):
super(MultiInputOutputLSTM, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.num_layers = num_layers
self.dropout = dropout
self.batch_size = batch_size
self.loss_list = []
self.accuracy = 0
self.predictions_list = [0]

self.lstm = nn.LSTM(input_size = self.input_size, hidden_size = self.hidden_size, num_layers = self.num_layers, dropout = self.dropout, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size, bias=True)
self.sigmoid = nn.Sigmoid()
self.criterion = nn.BCEWithLogitsLoss()
self.optimizer = torch.optim.RMSprop(self.parameters(), lr = lr, alpha=0.9, weight_decay=1e-4, momentum=0.5)
self.scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(self.optimizer, 'min')

def forward(self, x):

h0 = torch.zeros(self.num_layers, self.batch_size, self.hidden_size)
c0 = torch.zeros(self.num_layers, self.batch_size, self.hidden_size)
lstm_out, _ = self.lstm(x, (h0, c0))
output = self.fc(lstm_out[:, -1, :])

return output

def train_step(self ,x, y):
self.train()
predictions_1 = torch.round(self.forward(x))
predictions = self.forward(x)
if (predictions_1.detach().cpu().numpy()[0] == y.detach().cpu().numpy()[0]).all():
self.accuracy += 1
self.predictions_list.append(predictions.detach().cpu().numpy()[0][0])
penalty = torch.mean((predictions-0.5)**2)
loss = self.criterion(predictions, y) + penalty
self.scheduler.step(loss)
self.optimizer.zero_grad()
self.loss_list.append(loss.item())
mean_loss = sum(self.loss_list)/len(self.loss_list)
loss.backward()
torch.nn.utils.clip_grad_norm_(self.parameters(), max_norm=6)
self.optimizer.step()
return loss.item(), mean_loss, self.accuracy, predictions.detach().cpu().numpy()[0], y.detach().cpu().numpy()[0]

def test_step(self, inputs, targets):
self.eval()
with torch.no_grad():
outputs = torch.round(self.forward(inputs))
outputs = outputs.detach().cpu().numpy()[0]
targets = targets.detach().cpu().numpy()[0]
if (outputs == targets).all():
accuracy = 1
else:
accuracy = 0
return accuracy, outputs, targets

Целями являются 1, если цена растет, и 0 в противном случае.
Гиперпараметры:
input_size = 19
hidden_size = 3
num_layers = 5
output_size = 2
lr = 0.001
num_epochs = 5
batch_size = 32
dropout = 0.3

Модель создает прогнозы в начале, а затем они будут меняться +- 1e-3, 1e-4, то есть в основном то же самое во время обучения.
Разделение поезд-тест составляет 85-15%.
Вот список того, что я пробовал:
снижение или увеличение скорости обучения (с 0,00001 до 0,1), размер вывода (с большим и меньшим количеством прогнозы), Batch_size (от 1 до 256), num_layers (1-5), input_size (с 1, 2, 3... 19 функциями), dropout (от 0 до 0,5) и num_epochs (от 1 до 100).Я попробовал оптимизатор Adam, затем SDG, затем оптимизатор RMSProp, меняя альфа, импульс и вес_распада.
Также попробовал BCELoss (со слоем активации сигмовидной кишки в self.forward()), L1Loss, MSELoss, CrossEntropyLoss, прежде чем остановиться на потере, которая наказывает значения, слишком близкие к 0,5 (это не очень помогает, но при этом Я попробую что угодно.
Средняя потеря снижается с 0,924 до 0,889.
Точность как вы понимаете, очень низка (от 5,56% до 11,67%): единственная причина, по которой она не равна нулю, это чистая удача.
Я также пытаюсь спрогнозировать разница между последним элементом закрывающего столбца фрейма данных и будущими двумя следующими значениями, но... с теми же проблемами.
Ticker - Df - Loss - Mean Loss - Predictions - Targets - Epoch
AAPL 1/120 0.808 0.808 [0.5642182 0.11684255] [1. 1.] 1/50
AAPL 2/120 0.828 0.818 [0.5629723 0.12899561] [1. 1.] 1/50
AAPL 3/120 0.834 0.823 [0.5472506 0.13749745] [1. 1.] 1/50
AAPL 4/120 0.839 0.827 [0.52973044 0.13656825] [0. 0.] 1/50
AAPL 5/120 0.821 0.826 [0.52082217 0.13681749] [0. 0.] 1/50
AAPL 6/120 0.804 0.822 [0.5117941 0.14727135] [1. 1.] 1/50
AAPL 7/120 0.779 0.816 [0.49826628 0.1547919 ] [0. 0.] 1/50
AAPL 8/120 0.845 0.820 [0.49666688 0.1573844 ] [0. 0.] 1/50

AAPL 1/120 0.762 0.751 [0.4200741 0.24348469] [1. 1.] 50/50
AAPL 2/120 0.787 0.751 [0.43581426 0.23458275] [1. 1.] 50/50
AAPL 3/120 0.797 0.751 [0.43012726 0.23912352] [1. 1.] 50/50
AAPL 4/120 0.805 0.751 [0.43174705 0.23598525] [0. 0.] 50/50
AAPL 5/120 0.794 0.751 [0.41290796 0.24462458] [0. 0.] 50/50
AAPL 6/120 0.777 0.751 [0.42214283 0.2398287 ] [1. 1.] 50/50
AAPL 7/120 0.747 0.751 [0.42418063 0.24077193] [0. 0.] 50/50
AAPL 8/120 0.822 0.751 [0.44875318 0.23495609] [0. 0.] 50/50
...


Подробнее здесь: https://stackoverflow.com/questions/793 ... ent-inputs
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»