Added diffusion validation set

This commit is contained in:
Victor Mylle
2024-05-17 16:11:17 +00:00
parent 11ae0e1949
commit 8a219d0d19
24 changed files with 64 additions and 36 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Binary file not shown.

View File

@@ -50,8 +50,8 @@ class DataProcessor:
datetime(year=2022, month=11, day=30, tzinfo=pytz.UTC), datetime(year=2022, month=11, day=30, tzinfo=pytz.UTC),
) )
self.val_range = ( self.val_range = (
datetime(year=2022, month=10, day=1, tzinfo=pytz.UTC), datetime(year=2022, month=11, day=1, tzinfo=pytz.UTC),
datetime(year=2022, month=11, day=30, tzinfo=pytz.UTC), datetime(year=2022, month=12, day=30, tzinfo=pytz.UTC),
) )
self.test_range = (datetime(year=2023, month=1, day=1, tzinfo=pytz.UTC), np.inf) self.test_range = (datetime(year=2023, month=1, day=1, tzinfo=pytz.UTC), np.inf)
@@ -297,10 +297,10 @@ class DataProcessor:
): ):
val_df = self.all_features.copy() val_df = self.all_features.copy()
if self.test_range[0] != -np.inf: if self.val_range[0] != -np.inf:
val_df = val_df[(val_df["datetime"] >= self.val_range[0])] val_df = val_df[(val_df["datetime"] >= self.val_range[0])]
if self.test_range[1] != np.inf: if self.val_range[1] != np.inf:
val_df = val_df[(val_df["datetime"] <= self.val_range[1])] val_df = val_df[(val_df["datetime"] <= self.val_range[1])]
if transform: if transform:

View File

@@ -15,7 +15,17 @@ class PolicyEvaluator:
self.baseline_policy = baseline_policy self.baseline_policy = baseline_policy
self.ipc = ImbalancePriceCalculator(data_path="") self.ipc = ImbalancePriceCalculator(data_path="")
self.dates = baseline_policy.test_data["DateTime"].dt.date.unique() self.dates = baseline_policy.test_data["DateTime"].dt.date.unique()
# also add dates from last 2 months of 2023
self.dates = np.append(
self.dates,
pd.date_range(
start="2022-11-01", end="2022-12-31", freq="D"
).to_pydatetime(),
)
self.dates = pd.to_datetime(self.dates) self.dates = pd.to_datetime(self.dates)
### Load Imbalance Prices ### ### Load Imbalance Prices ###
@@ -116,6 +126,10 @@ class PolicyEvaluator:
# Calculate the gradient (difference) between the simulated and target charge cycles # Calculate the gradient (difference) between the simulated and target charge cycles
gradient = simulated_charge_cycles - target_charge_cycles gradient = simulated_charge_cycles - target_charge_cycles
if abs(gradient) < tolerance:
print(f"Optimal penalty found after {iteration+1} iterations")
break
# Optionally, adjust learning rate based on the change of gradient direction to avoid oscillation # Optionally, adjust learning rate based on the change of gradient direction to avoid oscillation
if previous_gradient is not None and gradient * previous_gradient < 0: if previous_gradient is not None and gradient * previous_gradient < 0:
learning_rate *= learning_rate_decay learning_rate *= learning_rate_decay
@@ -129,9 +143,7 @@ class PolicyEvaluator:
previous_gradient = gradient previous_gradient = gradient
# Check if the charge cycles are close enough to the target # Check if the charge cycles are close enough to the target
if abs(gradient) < tolerance:
print(f"Optimal penalty found after {iteration+1} iterations")
break
else: else:
print( print(
@@ -218,7 +230,7 @@ class PolicyEvaluator:
raise KeyboardInterrupt raise KeyboardInterrupt
except Exception as e: except Exception as e:
print(e) # print(e)
pass pass
self.profits = pd.DataFrame( self.profits = pd.DataFrame(
@@ -243,6 +255,8 @@ class PolicyEvaluator:
loggings = [] loggings = []
total_dates = 0
for date in tqdm(self.dates): for date in tqdm(self.dates):
try: try:
( (
@@ -272,15 +286,18 @@ class PolicyEvaluator:
} }
loggings.append(new_info) loggings.append(new_info)
total_dates += 1
except KeyboardInterrupt: except KeyboardInterrupt:
print("Interrupted") print("Interrupted")
raise KeyboardInterrupt raise KeyboardInterrupt
except Exception as e: except Exception as e:
print(e) # print(e)
pass pass
print(f"Total Evaluated Dates: {total_dates}")
if log_metrics: if log_metrics:
log_df = pd.DataFrame(loggings) log_df = pd.DataFrame(loggings)

View File

@@ -98,7 +98,7 @@ class DiffusionTrainer:
self.best_score = None self.best_score = None
self.policy_evaluator = policy_evaluator self.policy_evaluator = policy_evaluator
self.prev_optimal_penalty = 0 self.prev_optimal_penalty = 600
def noise_time_series(self, x: torch.tensor, t: int): def noise_time_series(self, x: torch.tensor, t: int):
"""Add noise to time series """Add noise to time series
@@ -198,6 +198,8 @@ class DiffusionTrainer:
early_stopping = 0 early_stopping = 0
best_crps = None best_crps = None
best_profit = None
best_charge_cycles = None
if task: if task:
self.init_clearml_task(task) self.init_clearml_task(task)
@@ -206,6 +208,12 @@ class DiffusionTrainer:
predict_sequence_length=self.ts_length, validation=True predict_sequence_length=self.ts_length, validation=True
) )
# val loader total samples
val_loader_total_samples = len(val_loader.dataset)
print("Train Loader Total Samples: ", len(train_loader.dataset))
print(f"Val Loader Total Samples: {val_loader_total_samples}")
print(f"Test Loader Total Samples: {len(test_loader.dataset)}")
train_sample_indices = self.random_samples(train=True, num_samples=5) train_sample_indices = self.random_samples(train=True, num_samples=5)
test_sample_indices = self.random_samples(train=False, num_samples=5) test_sample_indices = self.random_samples(train=False, num_samples=5)
@@ -229,16 +237,16 @@ class DiffusionTrainer:
running_loss /= len(train_loader.dataset) running_loss /= len(train_loader.dataset)
if epoch % 75 == 0 and epoch != 0: if epoch % 30 == 0 and epoch != 0:
crps, _ = self.test(val_loader, epoch, task) crps, profit, charge_cycles, _ = self.test(val_loader, epoch, task)
if best_crps is None or crps < best_crps: if best_profit is None or profit > best_profit:
best_crps = crps best_profit = profit
early_stopping = 0 early_stopping = 0
else: else:
early_stopping += 1 early_stopping += 1
if early_stopping > 5: if early_stopping > 20:
break break
if task: if task:
@@ -249,7 +257,7 @@ class DiffusionTrainer:
value=loss.item(), value=loss.item(),
) )
if epoch % 150 == 0 and epoch != 0: if epoch % 300 == 0 and epoch != 0:
self.debug_plots( self.debug_plots(
task, True, train_loader, train_sample_indices, epoch task, True, train_loader, train_sample_indices, epoch
) )
@@ -580,15 +588,12 @@ class DiffusionTrainer:
name="test_MSELoss", value=mean_inversed_mse name="test_MSELoss", value=mean_inversed_mse
) )
if self.best_score is None or mean_crps < self.best_score:
self.save_checkpoint(mean_crps, task, epoch)
if task: if task:
task.get_logger().report_scalar( task.get_logger().report_scalar(
title="CRPS", series="val", value=mean_crps, iteration=epoch title="CRPS", series="val", value=mean_crps, iteration=epoch
) )
if self.policy_evaluator: if self.policy_evaluator and epoch != -1:
_, val_loader, _ = self.data_processor.get_dataloaders( _, val_loader, _ = self.data_processor.get_dataloaders(
predict_sequence_length=self.ts_length, predict_sequence_length=self.ts_length,
full_day_skip=True, full_day_skip=True,
@@ -600,10 +605,10 @@ class DiffusionTrainer:
idx_samples=generated_samples, idx_samples=generated_samples,
test_loader=val_loader, test_loader=val_loader,
initial_penalty=self.prev_optimal_penalty, initial_penalty=self.prev_optimal_penalty,
target_charge_cycles=283, target_charge_cycles=58*400/356,
initial_learning_rate=1, initial_learning_rate=20,
max_iterations=50, max_iterations=50,
tolerance=1, tolerance=0.3,
iteration=epoch, iteration=epoch,
) )
) )
@@ -612,22 +617,28 @@ class DiffusionTrainer:
task.get_logger().report_scalar( task.get_logger().report_scalar(
title="Optimal Penalty", title="Optimal Penalty",
series="test", series="val",
value=optimal_penalty, value=optimal_penalty,
iteration=epoch, iteration=epoch,
) )
task.get_logger().report_scalar( 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( task.get_logger().report_scalar(
title="Optimal Charge Cycles", title="Optimal Charge Cycles",
series="test", series="val",
value=charge_cycles, value=charge_cycles,
iteration=epoch, iteration=epoch,
) )
if self.best_score is None or profit > self.best_score:
self.save_checkpoint(profit, task, epoch)
return mean_crps, profit, charge_cycles, generated_samples
return mean_crps, generated_samples return mean_crps, generated_samples
def save_checkpoint(self, val_loss, task, iteration: int): def save_checkpoint(self, val_loss, task, iteration: int):

View File

@@ -2,9 +2,9 @@ from src.utils.clearml import ClearMLHelper
clearml_helper = ClearMLHelper(project_name="Thesis/NrvForecast") clearml_helper = ClearMLHelper(project_name="Thesis/NrvForecast")
task = clearml_helper.get_task( task = clearml_helper.get_task(
task_name="Diffusion Training: hidden_sizes=[256, 256] (100 steps), lr=0.0001, time_dim=8", task_name="Diffusion Training: hidden_sizes=[512, 512] (100 steps), lr=0.0001, time_dim=8",
) )
task.execute_remotely(queue_name="default", exit_process=True) # task.execute_remotely(queue_name="default", exit_process=True)
from src.models import * from src.models import *
from src.losses import * from src.losses import *
@@ -19,16 +19,16 @@ from src.policies.PolicyEvaluator import PolicyEvaluator
data_config = DataConfig() data_config = DataConfig()
data_config.NRV_HISTORY = True data_config.NRV_HISTORY = True
data_config.LOAD_HISTORY = False data_config.LOAD_HISTORY = True
data_config.LOAD_FORECAST = False data_config.LOAD_FORECAST = True
data_config.PV_FORECAST = False data_config.PV_FORECAST = True
data_config.PV_HISTORY = False data_config.PV_HISTORY = True
data_config.WIND_FORECAST = False data_config.WIND_FORECAST = True
data_config.WIND_HISTORY = False data_config.WIND_HISTORY = True
data_config.NOMINAL_NET_POSITION = False data_config.NOMINAL_NET_POSITION = True
data_config = task.connect(data_config, name="data_features") data_config = task.connect(data_config, name="data_features")
@@ -42,7 +42,7 @@ print("Input dim: ", inputDim)
model_parameters = { model_parameters = {
"epochs": 15000, "epochs": 15000,
"learning_rate": 0.0001, "learning_rate": 0.0001,
"hidden_sizes": [256, 256], "hidden_sizes": [512, 512],
"time_dim": 8, "time_dim": 8,
} }