Estoy trabajando para predecir la tendencia de las acciones (al alza o a la baja).

A continuación se muestra cómo estoy manejando mi procesamiento previo.

index_ = len(df.columns) - 1
x = df.iloc[:,:index_]
x = x[['Relative_Volume', 'CurrentPrice', 'MarketCap']]
x = x.values.astype(float)
# x = x.reshape(len(x), 1, x.shape[1]).astype(float)
x = x.reshape(*x.shape, 1)
y = df.iloc[:,index_:].values.astype(float)

# x.shape = (44930, 3, 1)
# y.shape = (44930, 1)


x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=98 )

Entonces estoy construyendo mi modelo BILSTM:

def build_nn():
    model = Sequential()    
    model.add(Bidirectional(LSTM(128, return_sequences=True, input_shape = (x_train.shape[0], 1) , name="one")))
    model.add(Dropout(0.20))
    model.add(Bidirectional(LSTM(128, return_sequences=True , name="two")))
    model.add(Dropout(0.20))
    model.add(Bidirectional(LSTM(64, return_sequences=False , name="three")))
    model.add(Dropout(0.20))
    model.add(Dense(1,activation='sigmoid'))
    # opt = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, decay=0.01)
    opt = SGD(lr=0.01)

    model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
    return model

filepath = "bilstmv1.h5"
chkp = ModelCheckpoint(monitor = 'val_accuracy', mode = 'auto', filepath=filepath, verbose = 1, save_best_only=True)


model = build_nn()
# model.summary()
model.fit(x_train, y_train,
                epochs=3,
                batch_size=256,
                validation_split=0.1, callbacks=[chkp])
model.summary()

A continuación se muestra la salida de loss_value:

Epoch 1/3
127/127 [==============================] - 27s 130ms/step - loss: 0.6829 - accuracy: 0.5845 - val_loss: 0.6797 - val_accuracy: 0.5803

Epoch 00001: val_accuracy improved from -inf to 0.58025, saving model to bilstmv1.h5
Epoch 2/3
127/127 [==============================] - 14s 112ms/step - loss: 0.6788 - accuracy: 0.5851 - val_loss: 0.6798 - val_accuracy: 0.5803

Epoch 00002: val_accuracy did not improve from 0.58025
Epoch 3/3
127/127 [==============================] - 14s 112ms/step - loss: 0.6800 - accuracy: 0.5822 - val_loss: 0.6798 - val_accuracy: 0.5803

Epoch 00003: val_accuracy did not improve from 0.58025

Intenté cambiar el optimizador, la función de pérdida y otras modificaciones. Como puede esperar, todas las predicciones son las mismas ya que la función de pérdida no se modifica.

0
Houzayfa Rifai 13 mar. 2021 a las 18:36

1 respuesta

La mejor respuesta

Tiene un problema con su forma de entrada en su primera capa LSTM. Las entradas de Keras toman (None, Your_Shape) como entrada, ya que su entrada al modelo puede variar. Puede tener 1 entrada, 2 entradas o entradas infinitas. La única forma de representar la dinámica es utilizando None como primera entrada. La forma más rápida de hacer esto es cambiar la entrada a (None, *input_shape), ya que * expandirá su forma de entrada.

Su función de construcción se convertirá entonces en:

def build_nn():
    model = Sequential()    
    model.add(Bidirectional(LSTM(128, return_sequences=True, input_shape = (None, *x_train.shape) , name="one")))
    model.add(Dropout(0.20))
    model.add(Bidirectional(LSTM(128, return_sequences=True , name="two")))
    model.add(Dropout(0.20))
    model.add(Bidirectional(LSTM(64, return_sequences=False , name="three")))
    model.add(Dropout(0.20))
    model.add(Dense(1,activation='sigmoid'))
    # opt = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, decay=0.01)
    opt = SGD(lr=0.01)

    model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
    return model

Aunque todavía recomiendo echar un vistazo a su Optimizador, ya que eso podría afectar sus resultados. También puede usar -1 como una forma de entrada que significará auto fill, pero solo puede usarlo una vez.

1
thethiny 14 mar. 2021 a las 05:56