def test_train(tmp_path): """Tests imbDRL.agents.ddqn.TrainDDQN.train.""" tmp_models = str( tmp_path / "test_model" ) # No support for pathLib https://github.com/tensorflow/tensorflow/issues/37357 tmp_logs = str(tmp_path / "test_log") model = TrainDDQN(10, 10, 0.001, 0.0, 0.1, 5, model_path=tmp_models, log_dir=tmp_logs, val_every=2, memory_length=30) with pytest.raises(Exception) as exc: model.train() assert "must be compiled" in str(exc.value) model.compile_model( np.random.rand(4, 10).astype(np.float32), np.random.choice(2, size=4).astype(np.int32), [Dense(4), Dense(2)]) model.train( np.random.rand(4, 10).astype(np.float32), np.random.choice(2, size=4).astype(np.int32)) assert model.replay_buffer.num_frames().numpy( ) >= 10 + 10 # 10 for warmup + 1 for each episode assert model.global_episode == 10 model = TrainDDQN(10, 10, 0.001, 0.0, 0.1, 5, model_path=tmp_models, log_dir=tmp_logs, val_every=2) with pytest.raises(Exception) as exc: model.train() assert "must be compiled" in str(exc.value) model.compile_model( np.random.rand(4, 10).astype(np.float32), np.random.choice(2, size=4).astype(np.int32), [Dense(4), Dense(2)]) model.train( np.random.rand(4, 10).astype(np.float32), np.random.choice(2, size=4).astype(np.int32)) assert model.replay_buffer.num_frames( ) >= 10 # 10 in total since no memory length is defined assert model.global_episode == 10
) # Normalization should happen after splitting train and test sets X_train, X_test, y_train, y_test = train_test_split(df.to_numpy(), y, stratify=y, test_size=0.2) X_train, y_train, X_test, y_test, X_val, y_val = get_train_test_val( X_train, y_train, X_test, y_test, min_class, maj_class, val_frac=0.2) model = TrainDDQN(episodes, warmup_steps, learning_rate, gamma, min_epsilon, decay_episodes, target_update_period=target_update_period, target_update_tau=target_update_tau, batch_size=batch_size, collect_steps_per_episode=collect_steps_per_episode, memory_length=memory_length, collect_every=collect_every, n_step_update=n_step_update) model.compile_model(X_train, y_train, layers) model.q_net.summary() model.train(X_val, y_val, "F1") stats = model.evaluate(X_test, y_test, X_train, y_train) print(rounded_dict(stats)) # {'Gmean': 0.824172, 'F1': 0.781395, 'Precision': 0.730435, 'Recall': 0.84, 'TP': 84, 'TN': 131, 'FP': 31, 'FN': 16}
X_train, y_train, X_test, y_test, min_class, maj_class, val_frac=0.1, imb_ratio=imb_ratio, imb_test=False) model = TrainDDQN(episodes, warmup_steps, learning_rate, gamma, min_epsilon, decay_episodes, target_update_period=target_update_period, target_update_tau=target_update_tau, batch_size=batch_size, collect_steps_per_episode=collect_steps_per_episode, memory_length=memory_length, collect_every=collect_every, n_step_update=n_step_update) model.compile_model(X_train, y_train, layers, imb_ratio=imb_ratio) model.train(X_val, y_val, "Gmean") stats = model.evaluate(X_test, y_test, X_train, y_train) print(rounded_dict(stats)) # {'Gmean': 0.987032, 'F1': 0.955702, 'Precision': 0.930275, 'Recall': 0.982558, 'TP': 1014, 'TN': 8892, 'FP': 76, 'FN': 18}
target_update_period = 10_000 target_update_tau = 1 n_step_update = 4 layers = [Dense(250, activation="relu"), Dense(2, activation=None)] learning_rate = 0.00025 # Learning rate gamma = 0.1 # Discount factor min_epsilon = 0.01 # Minimal and final chance of choosing random action decay_episodes = 100_000 # Number of episodes to decay from 1.0 to `min_epsilon` imb_ratio = 0.1 # Imbalance rate min_class = [0] # Minority classes maj_class = [1] # Majority classes X_train, y_train, X_test, y_test = load_imdb(config=(5_000, 500)) X_train, y_train, X_test, y_test, X_val, y_val = get_train_test_val(X_train, y_train, X_test, y_test, min_class, maj_class, val_frac=0.1, imb_ratio=imb_ratio, imb_test=False) model = TrainDDQN(episodes, warmup_steps, learning_rate, gamma, min_epsilon, decay_episodes, target_update_period=target_update_period, target_update_tau=target_update_tau, batch_size=batch_size, collect_steps_per_episode=collect_steps_per_episode, memory_length=memory_length, collect_every=collect_every, n_step_update=n_step_update) model.compile_model(X_train, y_train, layers, imb_ratio=imb_ratio) model.train(X_test, y_test, "Gmean") stats = model.evaluate(X_test, y_test, X_train, y_train) print(rounded_dict(stats)) # {'Gmean': 0.286451, 'F1': 0.152846, 'Precision': 0.4967, 'Recall': 0.09032, 'TP': 1129, 'TN': 11356, 'FP': 1144, 'FN': 11371}