added differentiation between 3 different models
This commit is contained in:
+23
-8
@@ -5,12 +5,17 @@ import os
|
||||
from pandas import ExcelWriter
|
||||
import keras_tuner as kt
|
||||
from tensorflow.keras.models import Sequential
|
||||
from tensorflow.keras.layers import LSTM, Dense, Dropout, Bidirectional
|
||||
from tensorflow.keras.layers import LSTM, Dense, Dropout, Bidirectional,GRU
|
||||
from tensorflow.keras.optimizers import Adam
|
||||
from tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping
|
||||
from keras_tuner import RandomSearch
|
||||
from sklearn.metrics import accuracy_score
|
||||
|
||||
epochs = 2#50 # TODO: change
|
||||
model_type_gru = 'GRU'
|
||||
model_type_lstm = 'LSTM'
|
||||
model_type_bilstm = 'BiLSTM'
|
||||
|
||||
# === Display functions ===
|
||||
def display_warning_about_2020_data():
|
||||
print("\n⚠️ Warning: 2020 data after February is excluded due to COVID-19.")
|
||||
@@ -67,7 +72,7 @@ def prepare_data_for_model(user_data, sequence_length):
|
||||
return X,y
|
||||
|
||||
# === Training & Validation ===
|
||||
def train_models(user_data, user_data_val, sequence_lengths=[20], tuner_dir="./working/tuner"):
|
||||
def train_models(user_data, user_data_val, sequence_lengths, tuner_dir="./working/tuner", model_type=model_type_lstm):
|
||||
best_models = {}
|
||||
early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
|
||||
lr_scheduler = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, verbose=1)
|
||||
@@ -88,8 +93,15 @@ def train_models(user_data, user_data_val, sequence_lengths=[20], tuner_dir="./w
|
||||
|
||||
def build_model(hp):
|
||||
model = Sequential()
|
||||
model.add(Bidirectional(LSTM(units=hp.Int('units', 32, 256, step=2),
|
||||
input_shape=(sequence_length, n_features))))
|
||||
if model_type==model_type_bilstm:
|
||||
model.add(Bidirectional(LSTM(units=hp.Int('units', 32, 256, step=2),
|
||||
input_shape=(sequence_length, n_features))))
|
||||
if model_type==model_type_lstm:
|
||||
model.add(LSTM(units=hp.Int('units', 32, 256, step=2),
|
||||
input_shape=(sequence_length, n_features)))
|
||||
if model_type==model_type_gru:
|
||||
model.add(GRU(units=hp.Int('units', 32, 256, step=2),
|
||||
input_shape=(sequence_length, n_features)))
|
||||
model.add(Dropout(hp.Float('dropout_rate', 0.1, 0.5, step=0.1)))
|
||||
model.add(Dense(len(users), activation='softmax'))
|
||||
model.compile(
|
||||
@@ -102,18 +114,18 @@ def train_models(user_data, user_data_val, sequence_lengths=[20], tuner_dir="./w
|
||||
tuner = RandomSearch(
|
||||
build_model,
|
||||
objective='val_loss',
|
||||
max_trials=30,
|
||||
max_trials=2, #30, TODO: change
|
||||
executions_per_trial=2,
|
||||
directory=tuner_dir,
|
||||
project_name=f'lstm_seq_{sequence_length}'
|
||||
)
|
||||
|
||||
tuner.search(X, y, epochs=30, validation_data=(X_val, y_val),
|
||||
callbacks=[early_stopping, lr_scheduler], verbose=1)
|
||||
tuner.search(X, y, epochs=epochs, validation_data=(X_val, y_val),
|
||||
callbacks=[early_stopping, lr_scheduler], verbose=0)
|
||||
|
||||
best_hps = tuner.get_best_hyperparameters(1)[0]
|
||||
best_model = tuner.hypermodel.build(best_hps)
|
||||
best_model.fit(X, y, epochs=30, validation_data=(X_val, y_val),
|
||||
best_model.fit(X, y, epochs=epochs, validation_data=(X_val, y_val),
|
||||
callbacks=[early_stopping, lr_scheduler], verbose=0)
|
||||
|
||||
best_models[sequence_length] = {
|
||||
@@ -174,12 +186,15 @@ def evaluate_model_on_test_data(model, test_df, sequence_length, excel_writer, A
|
||||
y_pred = model.predict(X, verbose=0)
|
||||
y_pred_classes = np.argmax(y_pred, axis=1)
|
||||
|
||||
# counts which class was predicted how often
|
||||
unique_pred, counts_pred = np.unique(y_pred_classes, return_counts=True)
|
||||
label_counts_pred = dict(zip(unique_pred, counts_pred))
|
||||
|
||||
# counts which class should have been predicted how often (only one class for the user)
|
||||
unique_true, counts_true = np.unique(y_true, return_counts=True)
|
||||
label_counts_true = dict(zip(unique_true, counts_true))
|
||||
|
||||
# the fraction of correctly classified samples
|
||||
acc = accuracy_score(y_true, y_pred_classes)
|
||||
if acc > 0.5:
|
||||
accuracy_above_50 += 1
|
||||
|
||||
Reference in New Issue
Block a user