【问题标题】:How can I implement the input of multiple regression in LSTM using keras?如何使用 keras 在 LSTM 中实现多元回归的输入?
【发布时间】:2019-12-23 21:59:39
【问题描述】:

这是我的代码

def create_dataset(signal_data, look_back=1):
    dataX, dataY = [], []
    for i in range(len(signal_data) - look_back):
        dataX.append(signal_data[i:(i + look_back), 0])
        dataY.append(signal_data[i + look_back, 0])
    return np.array(dataX), np.array(dataY)

df = pd.read_csv('time_series.csv')
signal_data = df.Close.values.astype('float32')
signal_data = signal_data.reshape(len(df), 1)


scaler = MinMaxScaler(feature_range=(0, 1))
signal_data = scaler.fit_transform(signal_data)

train_size = int(len(signal_data) * 0.80)
test_size = len(signal_data) - train_size)
# val_size = len(signal_data) - train_size - test_size
train = signal_data[0:train_size]
# val = signal_data[train_size:train_size+val_size]
test = signal_data[train_size+val_size:len(signal_data)]

x_train, y_train = create_dataset(train, look_back)
# x_val, y_val = create_dataset(val, look_back)
x_test, y_test = create_dataset(test, look_back)


x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
# x_val = np.reshape(x_val, (x_val.shape[0], x_val.shape[1], 1))
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))

现在我想添加df.Opendf.Highdf.Lowdf.Volume

如何实现此代码?

我应该只添加信号数据吗?我想知道如何添加数据,以便我可以在信号数据中训练多个特征。

我不知道在哪里以及如何实现它。我需要你的帮助。

您的宝贵意见和想法将不胜感激。

【问题讨论】:

  • 请提供一个包含完整代码的可重现示例,我们将能够为您提供帮助:D。你还需要包含 LSTM 实现的代码,你使用哪个框架,等等......否则不可能添加一些东西
  • 谢谢,这很有帮助,但我必须加载数据才能提供帮助。你能至少提供一个模仿你拥有的数据集的简单脚本吗?
  • 你可以在 git source url 中找到最后一条评论...#kospi.csv 是 docs.google.com/spreadsheets/d/…

标签: python pandas machine-learning keras deep-learning


【解决方案1】:

我对您的代码做了几处修改。这应该有效。总结:

  • 我已修复了您对变量 0 的选择进行条形码编码的代码行。现在,目标变量位于最后一个位置,其他位于前面的位置
  • 我修复了一些不需要的重塑,而其他一些则已修复以保留所有尺寸
  • 我修复了模型输入形状,现在您有 5 个变量而不是 1 个

我的一般建议:

  • 我不会使用MinMaxScaler,这很危险,因为单个异常值可能会干扰您的所有分布。相反,请使用StandardScaler。更多信息在这里:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html
  • 之后,当train_xtest_x 和它们的y 对应的对应项构建完成后,我会缩放数据。原因是因为您正在计算使用训练集和测试集缩放数据的统计数据,即未来信息。这与您尝试在真实情况下运行代码时所发现的完全不同。 IE。您必须使用过去的统计数据来扩展新数据。最好建立一个尽可能接近现实的测试集。
  • 您如何知道您的模型足以对数据进行建模?我会摆脱辍学并运行模型以查看它是否可以过度拟合数据。如果模型可以过度拟合训练数据,则意味着模型足够大,您可以开始对模型进行正则化以增强泛化能力。本书中的更多信息:https://www.deeplearning.ai/machine-learning-yearning/
  • 在模型metrics 中选择accuracy,这是一个分类度量。我会根据我的问题类型(回归)使用一个:例如“平均绝对误差”。

希望能帮到你:D


import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout, Conv2D, Reshape, TimeDistributed, Flatten, Conv1D,ConvLSTM2D, MaxPooling1D
from keras.layers.core import Dense, Activation, Dropout
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
import tensorflow as tf
import matplotlib.pyplot as plt


config = tf.ConfigProto()
config.gpu_options.allow_growth=True

sess = tf.Session(config=config)
def create_dataset(signal_data, look_back=1):
    dataX, dataY = [], []
    for i in range(len(signal_data) - look_back):
        dataX.append(signal_data[i:(i + look_back), :])
        dataY.append(signal_data[i + look_back, -1])
    return np.array(dataX), np.array(dataY)


look_back = 20



df = pd.read_csv('kospi.csv')
signal_data = df[["Open", "Low", "High", "Volume", "Close"]].values.astype('float32')


scaler = MinMaxScaler(feature_range=(0, 1))
signal_data = scaler.fit_transform(signal_data)



train_size = int(len(signal_data) * 0.80)
test_size = len(signal_data) - train_size - int(len(signal_data) * 0.05)
val_size = len(signal_data) - train_size - test_size
train = signal_data[0:train_size]
val = signal_data[train_size:train_size+val_size]
test = signal_data[train_size+val_size:len(signal_data)]



x_train, y_train = create_dataset(train, look_back)
x_val, y_val = create_dataset(val, look_back)
x_test, y_test = create_dataset(test, look_back)




model = Sequential()
model.add(LSTM(128, input_shape=(None, 5),return_sequences=True))
model.add(Dropout(0.3))

model.add(LSTM(128, input_shape=(None, 5)))
model.add(Dropout(0.3))

model.add(Dense(128))
model.add(Dropout(0.3))

model.add(Dense(1))




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


model.summary()
hist = model.fit(x_train, y_train, epochs=20, batch_size=32, verbose=2, validation_data=(x_val, y_val))

trainScore = model.evaluate(x_train, y_train, verbose=0)
model.reset_states()
print('Train Score: ', trainScore)
valScore = model.evaluate(x_val, y_val, verbose=0)
model.reset_states()
print('Validataion Score: ', valScore)
testScore = model.evaluate(x_test, y_test, verbose=0)
model.reset_states()
print('Test Score: ', testScore)



p = model.predict(x_test)


print(mean_squared_error(y_test, p))

import matplotlib.pyplot as pplt

pplt.plot(y_test)
pplt.plot(p)
pplt.legend(['testY', 'p'], loc='upper right')
pplt.show()

【讨论】:

  • 非常感谢您抽出宝贵时间回答您的友好解释。
  • 我可以问你一个问题吗?如果我使用MinMaxscaler,损失很低。这意味着良好的性能。不过,您应该使用StandardScaler 来获取股票数据吗?因为一个异常值可以扰乱我的所有分布
  • 我认为通常MinMaxScaler 是个坏主意。想象一下,在这种情况下,您有一个具有异常值的时间序列(例如 [2500, 2350, 2680, ... 9989, 2873, 2284]),最大值或最小值都会被高估,您将通过它们重新调整分布将非常有偏差。如果您更愿意使用StandardScaler,这个异常值几乎不会影响数据的标准化和最终分布。同样重要的是要注意,如果您使用前一种方法计算 maxmin 参数,在这些参数中,您的值可能超出 0-1 范围,并且...
  • ...模型会出乎意料。
  • 我有一个新问题如果你不介意我寻求帮助。 stackoverflow.com/q/57550965/11309950
猜你喜欢
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 2017-07-25
  • 2019-01-07
相关资源
最近更新 更多