使用 RNN 对 keras 中的顺序数据进行预测
Doing prediction with RNN on Sequential data in keras
我是 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: Error when checking input: expected lstm_input to have 3
dimensions, but got array with shape (69188, 1)
我不太明白这个错误,这实际上是我继著名的猫狗分类之后的第二个 ML 项目。所以没有太多的调试经验,我确实先学习了理论,关于神经元和它们之间的关系,但仍然很难将这些知识应用到实际项目中。所以这个项目的想法是根据最近 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
LSTM 期望输入形状为 (batch_size, timesteps, channels)
;在您的情况下,timesteps=60
和 channels=128
。 batch_size
是每次拟合/预测一次输入的样本数。
您的错误表明存在预处理缺陷:
- DataFrame 的行,基于索引名称
time
,将填充 x
的 dim 1 -> timesteps
- 列通常是特征,将填充
x
-> channels
的 dim 2
- dim 0 是样本维度; "sample" 是一个独立的观察 - 根据您的数据格式,一个文件可以是一个样本,或包含多个
综合以上:
print(x.shape)
应该读作(N, 60, 128)
,其中N
是样本数,>= 1
- 由于您要遍历
ready_x
,x
将沿其暗淡的 0 对 ready_x
进行切片 - 因此 print(ready_x.shape)
应读取 (M, N, 60, 128)
,其中 M >= 1
;这是 "batches" 维度,每个切片是 1 个批次。
作为基本调试:在整个预处理代码中插入 print(item.shape)
,其中 item
是数组、DataFrame 等 - 以查看形状在各个步骤中如何变化。确保有一个步骤在最后一个维度上给出 128
,在倒数第二个维度上给出 60
。
我是 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: Error when checking input: expected lstm_input to have 3 dimensions, but got array with shape (69188, 1)
我不太明白这个错误,这实际上是我继著名的猫狗分类之后的第二个 ML 项目。所以没有太多的调试经验,我确实先学习了理论,关于神经元和它们之间的关系,但仍然很难将这些知识应用到实际项目中。所以这个项目的想法是根据最近 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
LSTM 期望输入形状为 (batch_size, timesteps, channels)
;在您的情况下,timesteps=60
和 channels=128
。 batch_size
是每次拟合/预测一次输入的样本数。
您的错误表明存在预处理缺陷:
- DataFrame 的行,基于索引名称
time
,将填充x
的 dim 1 ->timesteps
- 列通常是特征,将填充
x
->channels
的 dim 2
- dim 0 是样本维度; "sample" 是一个独立的观察 - 根据您的数据格式,一个文件可以是一个样本,或包含多个
综合以上:
print(x.shape)
应该读作(N, 60, 128)
,其中N
是样本数,>= 1
- 由于您要遍历
ready_x
,x
将沿其暗淡的 0 对ready_x
进行切片 - 因此print(ready_x.shape)
应读取(M, N, 60, 128)
,其中M >= 1
;这是 "batches" 维度,每个切片是 1 个批次。
作为基本调试:在整个预处理代码中插入 print(item.shape)
,其中 item
是数组、DataFrame 等 - 以查看形状在各个步骤中如何变化。确保有一个步骤在最后一个维度上给出 128
,在倒数第二个维度上给出 60
。