【问题标题】:Doing prediction with RNN on Sequential data in keras使用 RNN 对 keras 中的序列数据进行预测
【发布时间】:2020-02-29 09:47:46
【问题描述】:

我是 ML 新手,我正在关注这个 tutorial,它教授如何根据一些期货进行加密货币预测。

我的预测代码:

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)  

main_df 是一个数据框,包含:


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

编辑:
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

【问题讨论】:

    标签: python keras deep-learning prediction


    【解决方案1】:

    LSTM 期望输入形状为 (batch_size, timesteps, channels);在您的情况下,timesteps=60channels=128batch_size 是您一次输入的样本数量,每次拟合/预测。

    您的错误表明预处理存在缺陷:

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

    一旦考虑到上述情况:

    • print(x.shape) 应为(N, 60, 128),其中N 是样本数,>= 1
    • 由于您正在迭代ready_xx 将沿其暗淡 0 分割ready_x - 所以print(ready_x.shape) 应为(M, N, 60, 128),其中M >= 1;这是“批次”维度,每个切片为 1 个批次。

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

    【讨论】:

    • 我试过 print(ready_x.shape) 并得到错误:AttributeError: 'tuple' object has no attribute 'shape'
    • 也很累:for x in ready_x: print(x.shape) 并得到错误:AttributeError: 'list' object has no attribute 'shape'
    • 我还是不明白,我可以通过电子邮件或其他方式与您联系,将完整的代码发送给您,看看是否可以。会很感激的
    • @casper StackOverflow 不适用于调试整个程序 - 尝试缩小问题范围。根据您的描述,您似乎会有很多这样的错误,所以最好的想法可能是从一个更简单的例子开始,或者学习更多的 Python。无论如何,对于这个特定的错误,听起来ready_x 中有多个列表,因此您可以尝试x = np.asarray(x),然后打印形状。
    • 我知道了,我已经更新了一个问题并添加了 preproces 功能,请你看一下它,也许你会看到smth
    猜你喜欢
    • 2018-12-23
    • 2021-10-17
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2018-11-13
    • 2023-04-08
    • 2018-05-14
    相关资源
    最近更新 更多