Updated literature study and validation set for autoregressive models

This commit is contained in:
2024-05-19 00:08:43 +02:00
parent 1d1436612c
commit 26807eae22
33 changed files with 1282 additions and 742 deletions

View File

@@ -176,22 +176,22 @@ class AutoRegressiveQuantileTrainer(AutoRegressiveTrainer):
crps_from_samples_metric.append(crps[0].mean().item())
if epoch is not None:
if epoch is not None and task is not None:
task.get_logger().report_scalar(
title="CRPS_from_samples",
series="test",
series="val",
value=np.mean(crps_from_samples_metric),
iteration=epoch,
)
# using the policy evaluator, evaluate the policy with the generated samples
if self.policy_evaluator is not None:
if self.policy_evaluator is not None and epoch != -1:
optimal_penalty, profit, charge_cycles = (
self.policy_evaluator.optimize_penalty_for_target_charge_cycles(
idx_samples=generated_samples,
test_loader=dataloader,
initial_penalty=900,
target_charge_cycles=283,
target_charge_cycles=58 * 400 / 356,
initial_learning_rate=5,
max_iterations=100,
tolerance=1,
@@ -205,22 +205,30 @@ class AutoRegressiveQuantileTrainer(AutoRegressiveTrainer):
task.get_logger().report_scalar(
title="Optimal Penalty",
series="test",
series="val",
value=optimal_penalty,
iteration=epoch,
)
task.get_logger().report_scalar(
title="Optimal Profit", series="test", value=profit, iteration=epoch
title="Optimal Profit", series="val", value=profit, iteration=epoch
)
task.get_logger().report_scalar(
title="Optimal Charge Cycles",
series="test",
series="val",
value=charge_cycles,
iteration=epoch,
)
return (
np.mean(crps_from_samples_metric),
profit,
charge_cycles,
optimal_penalty,
generated_samples,
)
return np.mean(crps_from_samples_metric), generated_samples
def log_final_metrics(self, task, dataloader, train: bool = True):

View File

@@ -148,19 +148,6 @@ class Trainer:
running_loss /= len(train_loader.dataset)
test_loss = self.test(val_loader)
if self.patience is not None:
if (
self.best_score is None
or test_loss < self.best_score + self.delta
):
self.save_checkpoint(test_loss, task, epoch)
counter = 0
else:
counter += 1
if counter >= self.patience:
print("Early stopping triggered")
break
if task:
task.get_logger().report_scalar(
title=self.criterion.__class__.__name__,
@@ -194,7 +181,20 @@ class Trainer:
# )
if hasattr(self, "calculate_crps_from_samples"):
self.calculate_crps_from_samples(task, val_loader, epoch)
_, profit, charge_cycles, penalty, _ = self.calculate_crps_from_samples(task, val_loader, epoch)
if self.patience is not None:
if (
self.best_score is None
or profit > self.best_score
):
self.save_checkpoint(profit, task, epoch)
counter = 0
else:
counter += 1
if counter >= self.patience:
print("Early stopping triggered")
break
if task:
self.finish_training(task=task)

View File

@@ -3,7 +3,7 @@ from src.utils.clearml import ClearMLHelper
#### ClearML ####
clearml_helper = ClearMLHelper(project_name="Thesis/NrvForecast")
task = clearml_helper.get_task(
task_name="AQR: GRU (8 - 512) + Load + Wind + PV + QE + NP"
task_name="AQR: Non-Linear (4 - 512) + Load + Wind + PV + QE + NP"
)
task.execute_remotely(queue_name="default", exit_process=True)
@@ -46,7 +46,7 @@ data_config.NOMINAL_NET_POSITION = True
data_config = task.connect(data_config, name="data_features")
data_processor = DataProcessor(data_config, path="", lstm=True)
data_processor = DataProcessor(data_config, path="", lstm=False)
data_processor.set_batch_size(512)
data_processor.set_full_day_skip(False)
@@ -70,7 +70,7 @@ else:
model_parameters = {
"learning_rate": 0.0001,
"hidden_size": 512,
"num_layers": 8,
"num_layers": 4,
"dropout": 0.2,
"time_feature_embedding": 5,
}
@@ -83,25 +83,25 @@ time_embedding = TimeEmbedding(
# time_embedding = TrigonometricTimeEmbedding(data_processor.get_time_feature_size())
lstm_model = GRUModel(
time_embedding.output_dim(inputDim),
len(quantiles),
hidden_size=model_parameters["hidden_size"],
num_layers=model_parameters["num_layers"],
dropout=model_parameters["dropout"],
)
# non_linear_model = NonLinearRegression(
# lstm_model = GRUModel(
# time_embedding.output_dim(inputDim),
# len(quantiles),
# hiddenSize=model_parameters["hidden_size"],
# numLayers=model_parameters["num_layers"],
# hidden_size=model_parameters["hidden_size"],
# num_layers=model_parameters["num_layers"],
# dropout=model_parameters["dropout"],
# )
non_linear_model = NonLinearRegression(
time_embedding.output_dim(inputDim),
len(quantiles),
hiddenSize=model_parameters["hidden_size"],
numLayers=model_parameters["num_layers"],
dropout=model_parameters["dropout"],
)
# linear_model = LinearRegression(time_embedding.output_dim(inputDim), len(quantiles))
model = nn.Sequential(time_embedding, lstm_model)
model = nn.Sequential(time_embedding, non_linear_model)
model.output_size = 1
optimizer = torch.optim.Adam(model.parameters(), lr=model_parameters["learning_rate"])
@@ -119,16 +119,16 @@ trainer = AutoRegressiveQuantileTrainer(
data_processor,
quantiles,
"cuda",
policy_evaluator=None,
policy_evaluator=policy_evaluator,
debug=False,
)
trainer.add_metrics_to_track(
[PinballLoss(quantiles), MSELoss(), L1Loss(), CRPSLoss(quantiles)]
)
trainer.early_stopping(patience=25)
trainer.plot_every(15)
trainer.train(task=task, epochs=epochs, remotely=True)
trainer.early_stopping(patience=6)
trainer.plot_every(4)
trainer.train(task=task, epochs=epochs, remotely=False)
### Policy Evaluation ###
idx_samples = trainer.test_set_samples