输入 5 行数据,在 Keras LSTM 中分类(预测)第 6 行
Inputing 5 row data,classifiying(predicting) 6th row in Keras LSTM
我想将数据集的 5 行输入到 LSTM
并对 Y 的第 6 行进行分类。我通过重塑数据进行了输入:
X = X.reshape(6000,5,5)
但是我如何预测第 6 行的 Y? Y应该是什么形状?我在 Google 上阅读和搜索了很多,但老实说我无法理解代码,因为他们在使用它们之前自定义了数据。
我的完整代码:
import pandas as pd
from sklearn.preprocessing import LabelEncoder,MinMaxScaler
from keras.layers import Dense,RNN,LSTM,Activation,Dropout,SimpleRNN,Bidirectional
from keras.optimizers import RMSprop,Adam
from keras.wrappers.scikit_learn import KerasClassifier
from keras.models import Sequential
from sklearn.model_selection import train_test_split
import numpy as np
df = pd.read_csv('./EURUSD_DATAFRAME.csv')
BinEncoder = LabelEncoder()
scalar = MinMaxScaler()
df['pos'] = df['pos'].astype('int')
dat = df.values
X = dat[0:30000,0:5]
Y = dat[0:6000,5]
X[:,4]= BinEncoder.fit_transform(X[:,4])
X[:,0:4] = scalar.fit_transform(X[:,0:4])
X[:,4] = X[:,4].astype('int')
Y = BinEncoder.fit_transform(Y)
X = X.reshape(6000,5,5)
#MODEL 3
model = Sequential()
model.add(LSTM(1024,input_shape=(5,5),return_sequences=True,kernel_initializer='normal'))
#model.add(Activation('tanh'))
model.add(Dropout(0.2))
model.add(LSTM(512))
model.add(Dropout(0.3))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
model.fit(X,Y,batch_size=100,epochs=10,validation_split=0.2)
p = model.predict(X)
# print(classifier.score(X,Y))
# ----
我正在对编码为 1 或 0 的 Y 进行分类。
很简单。使用内置的 keras 函数:这会将它变成一个热表示,如 [0, 1] 和 [1, 0]
from keras.utils import to_categorical
y = to_categorical(y, num_classes=2)
并将最后一个密集层中的单元数更改为 num_classes,在您的例子中为 2。而且我认为您应该使用 softmax 进行分类而不是 sigmoid。此外,我建议您在 lstm 层或更高级的 LeakyRelu
之间使用 'relu' 激活
抱歉,我真的不明白你这是什么意思?您的输入形状是 (6000, 5, 5) 而您的输出形状是 (6000, 2)?那么第六行是什么意思?
我想将数据集的 5 行输入到 LSTM
并对 Y 的第 6 行进行分类。我通过重塑数据进行了输入:
X = X.reshape(6000,5,5)
但是我如何预测第 6 行的 Y? Y应该是什么形状?我在 Google 上阅读和搜索了很多,但老实说我无法理解代码,因为他们在使用它们之前自定义了数据。
我的完整代码:
import pandas as pd
from sklearn.preprocessing import LabelEncoder,MinMaxScaler
from keras.layers import Dense,RNN,LSTM,Activation,Dropout,SimpleRNN,Bidirectional
from keras.optimizers import RMSprop,Adam
from keras.wrappers.scikit_learn import KerasClassifier
from keras.models import Sequential
from sklearn.model_selection import train_test_split
import numpy as np
df = pd.read_csv('./EURUSD_DATAFRAME.csv')
BinEncoder = LabelEncoder()
scalar = MinMaxScaler()
df['pos'] = df['pos'].astype('int')
dat = df.values
X = dat[0:30000,0:5]
Y = dat[0:6000,5]
X[:,4]= BinEncoder.fit_transform(X[:,4])
X[:,0:4] = scalar.fit_transform(X[:,0:4])
X[:,4] = X[:,4].astype('int')
Y = BinEncoder.fit_transform(Y)
X = X.reshape(6000,5,5)
#MODEL 3
model = Sequential()
model.add(LSTM(1024,input_shape=(5,5),return_sequences=True,kernel_initializer='normal'))
#model.add(Activation('tanh'))
model.add(Dropout(0.2))
model.add(LSTM(512))
model.add(Dropout(0.3))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
model.fit(X,Y,batch_size=100,epochs=10,validation_split=0.2)
p = model.predict(X)
# print(classifier.score(X,Y))
# ----
我正在对编码为 1 或 0 的 Y 进行分类。
很简单。使用内置的 keras 函数:这会将它变成一个热表示,如 [0, 1] 和 [1, 0]
from keras.utils import to_categorical
y = to_categorical(y, num_classes=2)
并将最后一个密集层中的单元数更改为 num_classes,在您的例子中为 2。而且我认为您应该使用 softmax 进行分类而不是 sigmoid。此外,我建议您在 lstm 层或更高级的 LeakyRelu
之间使用 'relu' 激活抱歉,我真的不明白你这是什么意思?您的输入形状是 (6000, 5, 5) 而您的输出形状是 (6000, 2)?那么第六行是什么意思?