当我训练我的 LSTM 模型时,我的损失显示为 NaN,准确度为 0
My loss is showing to be NaN and accuracy to be 0 when I'm training my LSTM model
我正在尝试根据历史数据预测股票价格。我正在使用 LSTM 来训练我的模型。但是当我训练时,损失是 NaN,准确度是 0。
我使用的数据来自雅虎财经。 Yes Bank 股票的 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) ```
您正在做的是 regression
回归股票价格(即连续值)。因此,您不应将 accuracy
用作 metric
函数。您可以使用均方误差:'mse' 或平均绝对误差:'mae' 作为您的度量函数。
您的输入数据很可能包含 NaN
。如果您使用 this data,那么在撰写本文时,第 142 行除了日期列外完全是 NaN
。这些将通过缩放传播并导致网络 return NaN
s。一个快速且合理的解决方案是在读取数据后添加此行:
data = data.fillna(data.mean())
还有几点需要注意:
pd.read_csv
可以直接从 URL 读取。
- 如果您想使用模型进行预测,简单地将
train_test_split
和 shuffle=True
用于时间序列问题并不理想。测试集的目的是表现得好像它是看不见的数据,这种安排不满足。您应该考虑在截止日期之前使用 train
并在截止日期之后使用 test
拆分数据,因为这将更能代表预测情况(如果这是您的意图,并且考虑到不可解释的性质神经网络,我认为是)。
我正在尝试根据历史数据预测股票价格。我正在使用 LSTM 来训练我的模型。但是当我训练时,损失是 NaN,准确度是 0。 我使用的数据来自雅虎财经。 Yes Bank 股票的 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) ```
您正在做的是 regression
回归股票价格(即连续值)。因此,您不应将 accuracy
用作 metric
函数。您可以使用均方误差:'mse' 或平均绝对误差:'mae' 作为您的度量函数。
您的输入数据很可能包含 NaN
。如果您使用 this data,那么在撰写本文时,第 142 行除了日期列外完全是 NaN
。这些将通过缩放传播并导致网络 return NaN
s。一个快速且合理的解决方案是在读取数据后添加此行:
data = data.fillna(data.mean())
还有几点需要注意:
pd.read_csv
可以直接从 URL 读取。- 如果您想使用模型进行预测,简单地将
train_test_split
和shuffle=True
用于时间序列问题并不理想。测试集的目的是表现得好像它是看不见的数据,这种安排不满足。您应该考虑在截止日期之前使用train
并在截止日期之后使用test
拆分数据,因为这将更能代表预测情况(如果这是您的意图,并且考虑到不可解释的性质神经网络,我认为是)。