Мои потери показывают, что они равны NaN, а точность - 0, когда я тренирую свою модель LSTM - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь предсказать цены акций на основе исторических данных. Я использую LSTM для обучения моей модели. Но когда я тренируюсь, потери оказываются равными NaN, а точность - 0. Данные, которые я использую, получены из Yahoo Finance. 5 лет данных Да Банка акций. Я разбил данные в наборе тестов и поездов и показал их масштабирование (хотя и не обязательно). Добавлены 2 слоя LSTM для обучения.

Мой код выглядит следующим образом:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout


#Get the Data
data = pd.read_csv('YESBANK.NS.csv')
X = data.iloc[:, [5]].values

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test = train_test_split(X, test_size = 0.2, random_state = 0)

# Feature Scaling
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_set_scaled = sc.fit_transform(X_train)


# Creating a data structure with 60 timesteps and 1 output
X_train1 = []
y_train1 = []
for i in range(60, training_set_scaled.shape[0]):
    X_train1.append(training_set_scaled[i-60:i, 0])
    y_train1.append(training_set_scaled[i, 0])
X_train, y_train = np.array(X_train1), np.array(y_train1)

# Reshaping for LSTM 
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))


#Initialize the RNN
model = Sequential()

#Adding first LSTM layer
model.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
model.add(Dropout(0.2))

# #Adding second LSTM layer
# model.add(LSTM(units=50, return_sequences=True))
# model.add(Dropout(0.2))

# #Adding third LSTM layer
# model.add(LSTM(units= 50, return_sequences=True))
# model.add(Dropout(0.2))

#Adding fourth LSTM layer
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))

#Adding Output layer
model.add(Dense(units=1))

#Compiling the RNN
model.compile(optimizer = 'adam', loss = 'mean_squared_error', metrics = ['accuracy'])

#Fitiing the RNN
model.fit(X_train, y_train, epochs = 500, batch_size = 10) ```

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Скорее всего, ваши входные данные содержат NaN с. Если вы используете эти данные , то на момент написания строки строка 142 будет полностью NaN за исключением столбца даты. Они распространятся через масштабирование и приведут к тому, что сеть вернет NaN с. Быстрое и разумное решение состоит в том, чтобы добавить эту строку после того, как вы прочитаете данные в:

data = data.fillna(data.mean())

Несколько замечаний:

  1. pd.read_csv можно прочитать из Прямой URL.
  2. Простое использование train_test_split с shuffle=True для задачи временного ряда не идеально, если вы хотите использовать модель для прогнозирования. Цель тестового набора состоит в том, чтобы действовать так, как если бы это были невидимые данные, которым эта схема не удовлетворяет. Вам следует рассмотреть возможность разделения данных на train до даты отсечения и test после даты отсечения, поскольку это будет более репрезентативно для прогнозирующей ситуации (если это ваше намерение и учитывая неинтерпретируемый характер нейронных сетей, Я предполагаю, что это так).
0 голосов
/ 25 марта 2020

То, что вы делаете, это regression, чтобы регрессировать цены акций (то есть, непрерывные значения). Следовательно, вы не должны использовать accuracy в качестве функции metric. Вы можете использовать среднеквадратическую ошибку: «mse» или среднюю абсолютную ошибку: «mae» в качестве функции metri c.

...