feat(Model): now successfully training the basic LSTM model

This commit is contained in:
Mark Aron Szulyovszky
2021-11-11 18:29:05 +01:00
parent 78b3c07420
commit 5f8efc97fa
3 changed files with 36 additions and 30 deletions
+20 -29
View File
@@ -4,16 +4,18 @@ import pandas as pd
from tensorflow import keras from tensorflow import keras
from utils.normalize import normalize from utils.normalize import normalize
import tensorflow as tf import tensorflow as tf
from utils.visualize import visualize_loss
data = load_files('data/', False) data = load_files('data/', False)
data.reset_index(drop=True, inplace=True) data.reset_index(drop=True, inplace=True)
data = data[[column for column in data.columns if not column.endswith('volume')]] data = data[[column for column in data.columns if not column.endswith('volume')]]
# data = data[["ETH_returns", "BTC_returns"]]
ticker_to_predict = 'ETH_returns' ticker_to_predict = 'ETH_returns'
learning_rate = 0.001 learning_rate = 0.002
batch_size = 128 batch_size = 64
epochs = 30 epochs = 100
split_fraction = 0.715 split_fraction = 0.715
train_split = int(split_fraction * int(data.shape[0])) train_split = int(split_fraction * int(data.shape[0]))
@@ -31,7 +33,7 @@ val_data = data.loc[train_split:]
#%% create features and target for training set & keras dataset #%% create features and target for training set & keras dataset
x_train = normalize(train_data).values x_train = normalize(train_data).values
# x_train = train_data.drop(ticker_to_predict, axis=1).values # x_train = normalize(train_data).drop(ticker_to_predict, axis=1).values
y_train = normalize(data).iloc[start:end][ticker_to_predict].values y_train = normalize(data).iloc[start:end][ticker_to_predict].values
dataset_train = keras.preprocessing.timeseries_dataset_from_array( dataset_train = keras.preprocessing.timeseries_dataset_from_array(
@@ -41,12 +43,13 @@ dataset_train = keras.preprocessing.timeseries_dataset_from_array(
batch_size=batch_size, batch_size=batch_size,
) )
#%% create features and target for validation set & keras dataset #%% create features and target for validation set & keras dataset
x_end = len(val_data) - past - future x_end = len(val_data) - past - future
label_start = train_split + past + future label_start = train_split + past + future
x_val = normalize(val_data).iloc[:x_end].values x_val = normalize(val_data).iloc[:x_end].values
# x_val = val_data.iloc[:x_end].drop(ticker_to_predict, axis=1).values # x_val = normalize(val_data).iloc[:x_end].drop(ticker_to_predict, axis=1).values
y_val = normalize(data).iloc[label_start:][ticker_to_predict].values y_val = normalize(data).iloc[label_start:][ticker_to_predict].values
dataset_val = keras.utils.timeseries_dataset_from_array( dataset_val = keras.utils.timeseries_dataset_from_array(
@@ -59,47 +62,35 @@ dataset_val = keras.utils.timeseries_dataset_from_array(
#%% #%%
for batch in dataset_train.take(1): for batch in dataset_train.take(10):
batch_inputs, batch_targets = batch batch_inputs, batch_targets = batch
print("Input shape:", batch_inputs.shape) print("Input shape:", batch_inputs.shape)
print("Target shape:", batch_targets.shape) print("Target shape:", batch_targets.shape)
print(batch_inputs)
print(batch_targets)
# %% # %%
# model = keras.Sequential() model = keras.Sequential()
# model.add(keras.layers.LSTM(units = 50, return_sequences = True, input_shape=(batch_inputs.shape[1], batch_inputs.shape[2]))) model.add(keras.layers.LSTM(units = 32, return_sequences = True, activation = 'relu', input_shape=(batch_inputs.shape[1], batch_inputs.shape[2])))
# model.add(keras.layers.Dropout(0.2)) # model.add(keras.layers.Dropout(0.4))
# model.add(keras.layers.Dense(units = 1)) # model.add(keras.layers.Dense(units = 10, activation = 'relu'))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(units = 1, activation = 'relu'))
inputs = keras.layers.Input(shape=(batch_inputs.shape[1], batch_inputs.shape[2])) optimizer = keras.optimizers.Adam(learning_rate=learning_rate, clipnorm=1.0)
lstm_out = keras.layers.LSTM(32)(inputs)
outputs = keras.layers.Dense(1)(lstm_out)
model = keras.Model(inputs=inputs, outputs=outputs)
optimizer = keras.optimizers.Adam(learning_rate=learning_rate, clipnorm = 1.)
model.compile(optimizer=optimizer, loss="mean_squared_error") model.compile(optimizer=optimizer, loss="mean_squared_error")
model.summary() model.summary()
# %% # %%
path_checkpoint = "model_checkpoint.h5" path_checkpoint = "model_checkpoint.h5"
# es_callback = keras.callbacks.EarlyStopping(monitor="val_loss", min_delta=0, patience=5)
# modelckpt_callback = keras.callbacks.ModelCheckpoint(
# monitor="val_loss",
# filepath=path_checkpoint,
# verbose=1,
# save_weights_only=True,
# save_best_only=True,
# )
tf.debugging.enable_check_numerics(
stack_height_limit=30, path_length_limit=50
)
history = model.fit( history = model.fit(
dataset_train, dataset_train,
epochs=epochs, epochs=epochs,
validation_data=dataset_val, validation_data=dataset_val,
# callbacks=[modelckpt_callback],
) )
# %% # %%
visualize_loss(history, "Training and Validation Loss")
+1 -1
View File
@@ -3,4 +3,4 @@ import pandas as pd
def normalize(data: pd.DataFrame) -> pd.DataFrame: def normalize(data: pd.DataFrame) -> pd.DataFrame:
data_mean = data.mean(axis=0) data_mean = data.mean(axis=0)
data_std = data.std(axis=0) data_std = data.std(axis=0)
return (data - data_mean) / data_std return ((data - data_mean) / data_std).fillna(0.)
+15
View File
@@ -0,0 +1,15 @@
import matplotlib.pyplot as plt
def visualize_loss(history, title: str):
loss = history.history["loss"]
val_loss = history.history["val_loss"]
epochs = range(len(loss))
plt.figure()
plt.plot(epochs, loss, "b", label="Training loss")
plt.plot(epochs, val_loss, "r", label="Validation loss")
plt.title(title)
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.legend()
plt.show()