在Keras中使用循环神经网络对序列数据进行预测

5

我刚接触机器学习,正在按照这个教程学习如何基于一些期货进行加密货币预测。

以下是我的代码进行预测:

model = load_model("Path//myModel.model")

ready_x = preprocess_df(main_df) # the function returns array of price sequences and targets (0-buy,1-sells): return np.array(X), y 
predictions = []

for x in ready_x:
 l_p = model.predict_classes(x) #error occurs on this line
 predictions.append(l_p[0])
plot_prediction(main_df, predictions)

但我遇到了以下错误:

ValueError:检查输入时出错:预期lstm_input有3个维度,但得到的数组形状为(69188,1)

我真的不太明白这个错误的意思,这是我在著名的猫和狗分类之后进行的第二个机器学习项目。因此,在调试方面并没有太多经验,我确实先学习了神经元的理论以及它们之间的关系,但将这些知识应用于实际项目仍然非常困难。因此,这个项目的想法是基于过去60分钟的价格(在其上进行训练)来预测未来3分钟的价格。
模型如下:
model = Sequential()
model.add(LSTM(128, input_shape=(train_x.shape[1:]),return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(LSTM(128, return_sequences=True))
model.add(Dropout(0.1))
model.add(BatchNormalization())

model.add(LSTM(128))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(Dense(32, activation="relu"))
model.add(Dropout(0.2))

model.add(Dense(2, activation="softmax"))

opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)  

model.summary()

main_df是一个数据框,包括:

enter image description here
我的问题是,我应该如何为模型提供正确的数据输入来进行预测?

编辑:
preprocess函数:

def preprocess_df(df):
    #scalling
    df = df.drop('future', 1)

    for col in df.columns:
        if col!= "target":
            df[col] = df[col].pct_change() # normalizes the data
            df.dropna(inplace=True)
            df[col] = preprocessing.scale(df[col].values) #scale the data between 0-1

    df.dropna(inplace=True)

    sequential_data = []
    prev_days = deque(maxlen=SEQ_LEN)

    for i in df.values:
        prev_days.append([n for n in i[:-1]]) # append each column and not taking a target
        if len(prev_days) == SEQ_LEN:
            sequential_data.append([np.array(prev_days), i[-1]])

    random.shuffle(sequential_data)

    # BALANCING THE DATA
    buys = []
    sells = []

    for seq, target in sequential_data:
        if target == 0:
            sells.append([seq, target])
        elif target == 1:
            buys.append([seq, target])

    random.shuffle(buys)
    random.shuffle(sells)

    lower = min(len(buys), len(sells))

    buys = buys[:lower]
    sells = sells[:lower]

    sequential_data = buys + sells
    random.shuffle(sequential_data)

    X = []
    y = []

    for seq, target in sequential_data:
        X.append(seq)
        y.append(target)

    return np.array(X), y
1个回答

4

LSTM需要输入以 (batch_size, timesteps, channels) 格式为形状的数据; 在您的情况下,timesteps=60,而且 channels=128batch_size 表示每次进行拟合/预测时输入的样本数量。

您的错误提示表明存在预处理问题:

  • 基于索引名称 time 的 DataFrame 行会填充 x 的 dim 1 -> timesteps
  • 列通常是特征,会填充 x 的 dim 2 -> channels
  • dim 0 是样本维度;“样本”是一个独立的观察 - 根据您的数据格式如何,一个文件可能是一个样本,或包含多个样本

一旦考虑到上述问题:

  • print(x.shape) 应该显示为 (N, 60, 128),其中 N 是样本数,>= 1
  • 由于您正在遍历 ready_x,因此 x 将沿其 dim 0 切片 ready_x - 因此 print(ready_x.shape) 应该显示为 (M, N, 60, 128),其中 M >= 1;它是“批次”维度,每个切片都是一个批次。

作为基本的调试: 在您的预处理代码中插入 print(item.shape),其中 item 是数组、DataFrame 等 - 以查看各种步骤中形状如何变化。确保有一个步骤可以给出最后一个维度上的 128,并且在倒数第二个维度上为 60


也感到疲倦了:对于准备好的x,执行以下操作: print(x.shape) 并且出现了错误:AttributeError: 'list' object has no attribute 'shape' - casper
我还是不太明白,能否通过电子邮件或其他方式联系您,将完整的代码发送给您,以便查看是否可以解决问题。非常感谢。 - casper
我运行了你的代码,这是一个链接:[https://pastebin.com/xAkZLNpg]。 - casper
如果需要,完整代码以及csv文件内容图像 - casper
我也将其中一个csv文件上传到此链接,以供下载。 - casper
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接