Updated some stuff

This commit is contained in:
2024-03-20 22:14:18 +01:00
parent acaa8ff054
commit dad64d00be
7 changed files with 105 additions and 75 deletions

View File

@@ -1,4 +1,4 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdflatex 2023.9.17) 20 MAR 2024 16:47
This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=pdflatex 2023.9.17) 20 MAR 2024 22:13
entering extended mode
restricted \write18 enabled.
file:line:error style messages enabled.
@@ -1055,7 +1055,27 @@ Underfull \hbox (badness 10000) in paragraph at lines 226--233
[]
[3{/usr/local/texlive/2023/texmf-dist/fonts/enc/dvips/libertinust1math/libusMI.enc}] [4] (./verslag.aux)
[3{/usr/local/texlive/2023/texmf-dist/fonts/enc/dvips/libertinust1math/libusMI.enc}]
Underfull \hbox (badness 10000) in paragraph at lines 237--246
[]
Underfull \hbox (badness 10000) in paragraph at lines 237--246
[]
Underfull \hbox (badness 10000) in paragraph at lines 237--246
[]
Underfull \hbox (badness 10000) in paragraph at lines 237--246
[]
[4] (./verslag.aux)
Package rerunfilecheck Info: File `verslag.out' has not changed.
(rerunfilecheck) Checksum: 93BB3520344D4F0680BD23B0E2A0C01A;781.
Package logreq Info: Writing requests to 'verslag.run.xml'.
@@ -1071,7 +1091,7 @@ Here is how much of TeX's memory you used:
1141 hyphenation exceptions out of 8191
72i,11n,108p,1343b,5180s stack positions out of 10000i,1000n,20000p,200000b,200000s
</usr/local/texlive/2023/texmf-dist/fonts/type1/public/libertinust1math/LibertinusT1Math.pfb></usr/local/texlive/2023/texmf-dist/fonts/type1/public/libertine/LinBiolinumT.pfb></usr/local/texlive/2023/texmf-dist/fonts/type1/public/libertine/LinBiolinumTB.pfb></usr/local/texlive/2023/texmf-dist/fonts/type1/public/libertine/LinLibertineT.pfb></usr/local/texlive/2023/texmf-dist/fonts/type1/public/libertine/LinLibertineTB.pfb>
Output written on verslag.pdf (5 pages, 435646 bytes).
Output written on verslag.pdf (5 pages, 436330 bytes).
PDF statistics:
97 PDF objects out of 1000 (max. 8388607)
75 compressed objects within 1 object stream

Binary file not shown.

Binary file not shown.

View File

@@ -231,9 +231,21 @@ The imbalance price calculation includes the following variables: \\
% TODO: Add more information about the imbalance price calculation, alpha?
TODO: Add more information about the imbalance price calculation, alpha?
The imbalance price can be reconstructed given the bids of a certain quarter / day and the System Imbalance. During this thesis, the system imbalance is assumed to be almost the same as the Net Regulation Volume. This is a simplification but it is a good approximation. The goal of this thesis is to model the Net Regulation Volume which can then be used to reconstruct the imbalance price and to make decisions on when to buy or sell electricity.
The imbalance price can be reconstructed given the bids of a certain quarter/day and the System Imbalance. During this thesis, the system imbalance is assumed to be almost the same as the Net Regulation Volume. This is a simplification but it is a good approximation. The goal of this thesis is to model the Net Regulation Volume which can then be used to reconstruct the imbalance price and to make decisions on when to buy or sell electricity.
\subsection{Generative modeling}
Simple forecasting of the NRV is often not accurate and defining a policy using this forecast will lead to wrong decisions. A better method would be to try to model the NRV and sample multiple generations of the NRV. This gives a better prediction and confidence intervals can be calculated from this.
\\\\
Generative modeling is a type of machine learning that is used to generate new data samples. The goal of generative modeling is to learn the true data distribution of the training data. From this learned distribution, new samples can be generated. Generative modeling is used in many different fields including image generation, text generation etc.
\\\\
TODO: Formulas of generative modeling
\\\\
In this thesis, generative modeling can be used to model the NRV of the Belgian electricity market using different input features like the weather, the electricity price etc. The model can then be used to generate new samples of the NRV.
\\\\
Multiple methods can be used to generatively model the NRV.
\section{Literature Study}

View File

@@ -558,8 +558,7 @@ class NonAutoRegressiveQuantileRegression(Trainer):
outputs = self.model(inputs)
outputted_samples = [
sample_from_dist(self.quantiles, output.cpu().numpy())
for output in outputs
sample_from_dist(self.quantiles, output.cpu()) for output in outputs
]
outputted_samples = torch.tensor(outputted_samples)
@@ -618,20 +617,24 @@ class NonAutoRegressiveQuantileRegression(Trainer):
def debug_plots(self, task, train: bool, data_loader, sample_indices, epoch):
for actual_idx, idx in sample_indices.items():
initial, target, _ = data_loader.dataset[idx]
features, target, _ = data_loader.dataset[idx]
# get predictions
initial = initial.to(self.device)
features = features.to(self.device)
target = target.to(self.device)
predicted_quantiles = self.model(initial)
predictions = predicted_quantiles.reshape(-1, len(self.quantiles))
self.model.eval()
with torch.no_grad():
predicted_quantiles = self.model(features)
predictions = predicted_quantiles.reshape(-1, len(self.quantiles))
samples = [
sample_from_dist(self.quantiles, predictions) for _ in range(100)
]
samples = torch.tensor(samples)
fig = self.get_plot(initial, target, samples, show_legend=(0 == 0))
fig, fig2 = self.get_plot(
features[:96], target, samples, show_legend=(0 == 0)
)
task.get_logger().report_matplotlib_figure(
title="Training" if train else "Testing",
@@ -640,17 +643,12 @@ class NonAutoRegressiveQuantileRegression(Trainer):
figure=fig,
)
fig, ax = plt.subplots(figsize=(20, 10))
for i in range(10):
ax.plot(samples[i], label=f"Sample {i}")
ax.plot(target, label="Real NRV", linewidth=3)
ax.legend()
task.get_logger().report_matplotlib_figure(
title="Training" if train else "Testing",
series=f"Sample {actual_idx} Samples",
title="Training Samples" if train else "Testing Samples",
series=f"Sample {actual_idx} samples",
iteration=epoch,
figure=fig,
figure=fig2,
report_interactive=False,
)
plt.close()
@@ -750,6 +748,8 @@ class NonAutoRegressiveQuantileRegression(Trainer):
]
)
ax.set_ylim(-1500, 1500)
fig2, ax2 = plt.subplots(figsize=(20, 10))
for i in range(10):
ax2.plot(predictions_np[i], label=f"Sample {i}")
@@ -757,6 +757,8 @@ class NonAutoRegressiveQuantileRegression(Trainer):
ax2.plot(next_day_np, label="Real NRV", linewidth=3)
ax2.legend()
ax2.set_ylim(-1500, 1500)
return fig, fig2
def calculate_crps_from_samples(self, task, dataloader, epoch: int):
@@ -812,26 +814,36 @@ class NonAutoRegressiveQuantileRegression(Trainer):
# using the policy evaluator, evaluate the policy with the generated samples
if self.policy_evaluator is not None:
_, test_loader = self.data_processor.get_dataloaders(
predict_sequence_length=self.model.output_size, full_day_skip=True
optimal_penalty, profit, charge_cycles = (
self.policy_evaluator.optimize_penalty_for_target_charge_cycles(
idx_samples=generated_samples,
test_loader=dataloader,
initial_penalty=500,
target_charge_cycles=283,
learning_rate=2,
max_iterations=100,
tolerance=1,
)
)
self.policy_evaluator.evaluate_test_set(generated_samples, test_loader)
df = self.policy_evaluator.get_profits_as_scalars()
# for each row, report the profits
for idx, row in df.iterrows():
task.get_logger().report_scalar(
title="Profit",
series=f"penalty_{row['Penalty']}",
value=row["Total Profit"],
iteration=epoch,
)
print(
f"Optimal Penalty: {optimal_penalty}, Profit: {profit}, Charge Cycles: {charge_cycles}"
)
df = self.policy_evaluator.get_profits_till_400()
for idx, row in df.iterrows():
task.get_logger().report_scalar(
title="Profit_till_400",
series=f"penalty_{row['Penalty']}",
value=row["Profit_till_400"],
iteration=epoch,
)
task.get_logger().report_scalar(
title="Optimal Penalty",
series="test",
value=optimal_penalty,
iteration=epoch,
)
task.get_logger().report_scalar(
title="Optimal Profit", series="test", value=profit, iteration=epoch
)
task.get_logger().report_scalar(
title="Optimal Charge Cycles",
series="test",
value=charge_cycles,
iteration=epoch,
)

View File

@@ -7,6 +7,7 @@ import numpy as np
from plotly.subplots import make_subplots
from clearml.config import running_remotely
from torchinfo import summary
import matplotlib.pyplot as plt
class Trainer:
@@ -329,18 +330,7 @@ class Trainer:
return fig
def debug_plots(self, task, train: bool, data_loader, sample_indices, epoch):
num_samples = len(sample_indices)
rows = num_samples # One row per sample since we only want one column
cols = 1
fig = make_subplots(
rows=rows,
cols=cols,
subplot_titles=[f"Sample {i+1}" for i in range(num_samples)],
)
for i, idx in enumerate(sample_indices):
for actual_idx, idx in sample_indices.items():
features, target, _ = data_loader.dataset[idx]
features = features.to(self.device)
@@ -350,30 +340,26 @@ class Trainer:
with torch.no_grad():
predictions = self.model(features).cpu()
sub_fig = self.get_plot(
features[:96], target, predictions, show_legend=(i == 0)
fig, fig2 = self.get_plot(
features[:96], target, predictions, show_legend=(0 == 0)
)
row = i + 1
col = 1
task.get_logger().report_matplotlib_figure(
title="Training" if train else "Testing",
series=f"Sample {actual_idx}",
iteration=epoch,
figure=fig,
)
for trace in sub_fig.data:
fig.add_trace(trace, row=row, col=col)
task.get_logger().report_matplotlib_figure(
title="Training Samples" if train else "Testing Samples",
series=f"Sample {actual_idx} samples",
iteration=epoch,
figure=fig2,
report_interactive=False,
)
# loss = self.criterion(predictions.to(self.device), target.squeeze(-1).to(self.device)).item()
# fig['layout']['annotations'][i].update(text=f"{loss.__class__.__name__}: {loss:.6f}")
# y axis same for all plots
# fig.update_yaxes(range=[-1, 1], col=1)
fig.update_layout(height=1000 * rows)
task.get_logger().report_plotly(
title=f"{'Training' if train else 'Test'} Samples",
series="full_day",
iteration=epoch,
figure=fig,
)
plt.close()
def debug_scatter_plot(self, task, train: bool, samples, epoch):
X, y = samples

View File

@@ -85,7 +85,7 @@ time_embedding = TimeEmbedding(
non_linear_model = NonLinearRegression(
time_embedding.output_dim(inputDim),
len(quantiles),
len(quantiles) * 96,
hiddenSize=model_parameters["hidden_size"],
numLayers=model_parameters["num_layers"],
dropout=model_parameters["dropout"],
@@ -94,7 +94,7 @@ non_linear_model = NonLinearRegression(
# linear_model = LinearRegression(time_embedding.output_dim(inputDim), len(quantiles))
model = nn.Sequential(time_embedding, non_linear_model)
model.output_size = 1
model.output_size = 96
optimizer = torch.optim.Adam(model.parameters(), lr=model_parameters["learning_rate"])
### Policy Evaluator ###