python - RNN 模型不是在学习。图中所附的预测值和实际值是一条平线
问题描述
我已经对时间序列预测 RNN 模型进行了重新缩放、规范化、初始化、丢弃,但它没有学习。图中显示的预测值和实际值为零处的平线。我无法弄清楚我的模型有什么问题。您的输入将不胜感激。这是整个代码
[Predicted and actual value graph[\]\[1\]][1]
# split into train and test sets
train_size = int(len(dataset) * 0.80)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:]
dataset[train_size:len(dataset),:]
scaler = MinMaxScaler(feature_range=(-1, 1))
scaler = scaler.fit(train)
train_scaled = scaler.transform(train)
test_scaled = scaler.transform(test)
# convert an array of values into a dataset matrix
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return np.array(dataX), np.array(dataY)
# reshape into X=t and Y=t+1
look_back = 40
train_X, train_y = create_dataset(train_scaled, look_back)
test_X, test_y = create_dataset(test_scaled, look_back)
# reshape input to be [samples, time steps, features]
train_X= np.expand_dims(train_X, axis=1)
test_X = np.expand_dims(test_X, axis=1)
print ('Train_X shape', train_X.shape, 'Test_X.shape', test_X.shape)
model = Sequential()
model.add(SimpleRNN(64, input_shape=(1,window_size),
kernel_initializer = 'random_normal',
bias_initializer= 'random_normal'))
#model.add(Dropout(0.2))
model.add(Dense(32, kernel_initializer = 'random_normal',
bias_initializer= 'random_normal'))
#model.add(Dropout(0.2))
model.add(Dense(1, activation = 'linear'))
optimizer = keras.optimizers.adam(lr=0.1)
model.compile(loss='mse', optimizer=optimizer, metrics=['accuracy'])
#fit network history =model.fit(train_X, train_y, epochs=2,
batch_size=32,
validation_data=(test_X, test_y), verbose=1, shuffle=False)
def predict_and_score(model, X, Y): # Make predictions on the
original
scale of the data. pred =
scaler.inverse_transform(model.predict(X))
# Prepare Y data to also be on the original scale for
interpretability.
orig_data = scaler.inverse_transform([Y]) # Calculate RMSE. score
= math.sqrt(mean_squared_error(orig_data[0], pred[:, 0]))
return(score, pred)
rmse_train, train_predict = predict_and_score(model, train_X,
train_y)
rmse_test, test_predict = predict_and_score(model, test_X,
test_y)
print("Training data score: %.2f RMSE" % rmse_train)
print("Test data score: %.2f RMSE" % rmse_test)
Training data score: 151198.09 RMSE
Test data score: 125302.35 RMSE
[enter image description here][1]
解决方案
一个明显的问题是您的数据:它的范围绝对是荒谬的。虽然 NN 在理论上可以学习“任何东西”,但我想说实际上不可能学习对输出进行建模:(1)大部分时间为零,(2)然后范围高达 1e14。
虽然 (1) 可能是您的领域所固有的,但 (2) 似乎没有必要。
首先将您的数据缩小到范围 [0, 1],这应该至少可以学习一些东西。
推荐阅读
- javascript - Ember this 在组件的组件中未定义
- php - 弹性搜索更新非法参数异常
- node.js - Botpress中的节点数量有没有限制
- android - requireActivity()、requireContext() 和 requireFragmentManager() 不适用于 AndroidX
- javascript - 是否可以让两个客户端网页在不同的浏览器但相同的域中进行通信?
- c# - C# 应用到 MS SQL 数据库调用堆栈
- symfony - Symfony 3 带有子集合的表单集合
- javascript - Bootstrap Multiselect - 通过onclick取消选择
- c# - 在服务器端处理中两次加载实体框架,数据表抛出错误
- python - 将两个列表添加到字典中并允许合并具有相似标题的值