added new version to run with adjusted training process
This commit is contained in:
+56
-1
@@ -1,7 +1,10 @@
|
||||
import keras_tuner
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import shutil
|
||||
import os
|
||||
|
||||
from keras.src.metrics import F1Score
|
||||
from pandas import ExcelWriter
|
||||
import keras_tuner as kt
|
||||
from tensorflow.keras.models import Sequential
|
||||
@@ -11,7 +14,7 @@ from tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping
|
||||
from keras_tuner import RandomSearch
|
||||
from sklearn.metrics import accuracy_score
|
||||
|
||||
epochs = 50
|
||||
epochs = 30
|
||||
model_type_gru = 'GRU'
|
||||
model_type_lstm = 'LSTM'
|
||||
model_type_bilstm = 'BiLSTM'
|
||||
@@ -139,6 +142,58 @@ def train_models(user_data, user_data_val, sequence_lengths, tuner_dir="./workin
|
||||
|
||||
return best_models
|
||||
|
||||
# === Training & Validation ===
|
||||
def train_models_v2(user_data, user_data_val, sequence_length, model_type):
|
||||
tuner_dir = "./working/tuner"
|
||||
|
||||
early_stopping = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)
|
||||
lr_scheduler = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=2)
|
||||
|
||||
shutil.rmtree(tuner_dir, ignore_errors=True)
|
||||
|
||||
x, y = prepare_data_for_model(user_data=user_data, sequence_length=sequence_length)
|
||||
x_val, y_val = prepare_data_for_model(user_data=user_data_val, sequence_length=sequence_length)
|
||||
|
||||
n_features = x.shape[2]
|
||||
users = list(user_data.keys())
|
||||
|
||||
def build_model(hp):
|
||||
model = Sequential()
|
||||
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(
|
||||
optimizer=Adam(learning_rate=hp.Choice('learning_rate', [1e-2, 1e-3, 1e-4])),
|
||||
loss='sparse_categorical_crossentropy',
|
||||
metrics=['accuracy']
|
||||
)
|
||||
return model
|
||||
|
||||
tuner = RandomSearch(
|
||||
build_model,
|
||||
objective='val_loss',
|
||||
max_trials=100,
|
||||
directory=tuner_dir,
|
||||
)
|
||||
|
||||
tuner.search(x, y, epochs=epochs, validation_data=(x_val, y_val),
|
||||
callbacks=[early_stopping, lr_scheduler])
|
||||
|
||||
best_hps = tuner.get_best_hyperparameters(1)[0]
|
||||
best_model = tuner.hypermodel.build(best_hps)
|
||||
best_model.fit(x, y, epochs=epochs, validation_data=(x_val, y_val),
|
||||
callbacks=[early_stopping, lr_scheduler])
|
||||
return best_model
|
||||
|
||||
|
||||
# === Evaluation ===
|
||||
def evaluate_models(best_models, df_test, sequence_lengths, output_excel_path, ALLUSERS32_15MIN_WITHOUTTHREHOLD):
|
||||
print("\n🧪 Evaluating on Test Data...")
|
||||
|
||||
Reference in New Issue
Block a user