tdce-basic / functions /plotting_summarize.py
Tin Theethawat Savastham
♻️ Strcuture Function in Folder Function
1eca236
Raw
History Blame Contribute Delete
59.9 kB
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
import numpy as np
sns.set_theme(style="whitegrid", font="Noto Sans",
font_scale=1.5)
this_graph_palette = sns.color_palette("husl", 4)
sns.set_palette(this_graph_palette)
dataset_names = ["1-munchkin",
"3-vicheanmas", "2-chinchilla", "4-scottishfold"]
# cademic_dataset_names = ["Dataset 1", "Dataset 3", "Dataset 2", "Dataset 4"]
academic_dataset_names = [
"Simple Dataset", "Complicated Dataset", "Actual Dataset", "Extended Random Dataset"]
learning_rate = [0.005, 0.01, 0.05, 0.1, 0.5]
overall_accuracy_df = pd.DataFrame()
model_learning_rates = ["1e-07", "1e-08"]
iteration = 100
modifiers = [
"",
"_remove_outlier",
"_augmented",
"_remove_outlier_augmented",
"_early_stopping",
"_remove_outlier_early_stopping",
"_augmented_early_stopping",
"_remove_outlier_augmented_early_stopping",
]
displayed_modifiers = [
"Original",
"Remove Outlier",
"Augmentation",
"Remove Outlier + Augmentation",
"Early Stopping",
"Remove Outlier + Early Stopping",
"Augmentation + Early Stopping",
"Remove Outlier + Augmentation + Early Stopping",
]
def to_kebab_case(value):
return "-".join(value.lower().split())
def plotting_learning_curve(use_academic_name=False, round_no=0,
model_version=1):
dataset_index = 0
for dataset_name in dataset_names:
modifier_index = 0
for modifer in modifiers:
accuracy_list = []
# Find Best Accuracy
# For Each Model Learning Rate
fig, ax = plt.subplots(2, 5, figsize=(20, 8))
model_learning_rate_index = 0
learning_rate_index = 0
if use_academic_name:
fig.suptitle(
f"Learning Curve of {academic_dataset_names[dataset_index]} - {displayed_modifiers[modifier_index]}",
fontdict={"fontsize": 20, "fontweight": "bold"},
)
else:
fig.suptitle(
f"Learning Curve of {academic_dataset_names[dataset_index]} - {displayed_modifiers[modifier_index]}",
fontdict={"fontsize": 20, "fontweight": "bold"},
)
for model_learning_rate in model_learning_rates:
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{modifer}"
# For Each Learning Rate
for lr in learning_rate:
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{lr}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
ax[model_learning_rate_index][learning_rate_index].plot(
epoch_error["epoch"],
epoch_error["error_percent"],
label="Training",
linewidth=4
)
ax[model_learning_rate_index][learning_rate_index].plot(
epoch_error["epoch"],
epoch_error["validate_error_percent"],
label="Validation", linewidth=4
)
ax[model_learning_rate_index][learning_rate_index].set_title(
f"{lr}/{model_learning_rate}",
fontdict={"fontsize": 16},
)
# ax[model_learning_rate_index][learning_rate_index].set_xlabel(
# "Epoch"
# )
# ax[model_learning_rate_index][learning_rate_index].set_ylabel(
# "Error RMSPE"
# )
ax[model_learning_rate_index][learning_rate_index].set_ylim(
0, 100)
ax[model_learning_rate_index][learning_rate_index].set_xlim(
0, 100)
# ax[model_learning_rate_index][learning_rate_index].legend(
# loc="lower right"
# )
learning_rate_index += 1
model_learning_rate_index += 1
learning_rate_index = 0
handles, labels = ax[0][0].get_legend_handles_labels()
fig.legend(handles, labels, loc="lower center",
ncol=2, fontsize=12)
fig.tight_layout(pad=2.0)
plt.tight_layout()
os.makedirs(
f"result/learning_curve/by-modifer/{dataset_name}", exist_ok=True
)
if modifer == "":
modifer = "original"
plt.savefig(
f"result/learning_curve/by-modifer/{dataset_name}/{modifer}.png"
)
plt.close(fig)
accuracy_list = pd.DataFrame(accuracy_list)
modifier_index += 1
dataset_index += 1
def plotting_learning_curve_by_rate(use_academic_name=False, round_no=0,
model_version=1):
dataset_index = 0
for dataset_name in dataset_names:
# Find Best Accuracy
# For Each Model Learning Rate
model_learning_rate_index = 0
learning_rate_index = 0
for model_learning_rate in model_learning_rates:
# For Each Learning Rate
for lr in learning_rate:
fig, ax = plt.subplots(2, 4, figsize=(20, 8))
for modifier_index, modifer in enumerate(modifiers):
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{modifer}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{lr}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
row_index = 0 if modifier_index < 4 else 1
col_index = modifier_index % 4
ax[row_index][col_index].plot(
epoch_error["epoch"],
epoch_error["error_percent"],
label="Training",
)
ax[row_index][col_index].plot(
epoch_error["epoch"],
epoch_error["validate_error_percent"],
label="Validation",
)
if use_academic_name:
ax[row_index][col_index].set_title(
f"{academic_dataset_names[dataset_index]}\n{displayed_modifiers[modifier_index]}\n{lr}/{model_learning_rate}",
fontdict={"fontsize": 12},
)
else:
ax[row_index][col_index].set_title(
f"{dataset_name}\n{displayed_modifiers[modifier_index]}\n{lr}/{model_learning_rate}",
fontdict={"fontsize": 12},
)
ax[row_index][col_index].set_xlabel(
f'Epoch\n Lasted Training Error {epoch_error.iloc[-1]["error_percent"]:.2f} \n Lasted Validation Error {epoch_error.iloc[-1]["validate_error_percent"]:.2f}'
)
ax[row_index][col_index].set_ylabel("Error RMSPE")
ax[row_index][col_index].set_ylim(0, 100)
ax[row_index][col_index].set_xlim(0, 100)
ax[row_index][col_index].legend(loc="lower right")
learning_rate_index += 1
fig.tight_layout(pad=2.0)
os.makedirs(
f"result/learning_curve/by-rate/{dataset_name}", exist_ok=True
)
plt.savefig(
f"result/learning_curve/by-rate/{dataset_name}/{model_learning_rate}-{lr}.png"
)
plt.close(fig)
model_learning_rate_index += 1
learning_rate_index = 0
dataset_index += 1
def plot_graph_grid(use_academic_name=False, use_early_stopping=False, round_no=0, model_version=1):
dataset_index = 0
early_stopping_title = "With Early Stopping" if use_early_stopping else ""
for dataset_name in dataset_names:
# Find Best Accuracy
# For Each Model Learning Rate
if use_early_stopping:
filter_modifier = modifiers[4:]
filter_display_modifier = displayed_modifiers[4:]
else:
filter_modifier = modifiers[:4]
filter_display_modifier = displayed_modifiers[:4]
model_learning_rate_index = 0
learning_rate_index = 0
for model_learning_rate in model_learning_rates:
# For Each Learning Rate
fig, ax = plt.subplots(5, 4, figsize=(20, 14))
if use_academic_name:
fig.suptitle(
f"Learning Curve of {academic_dataset_names[dataset_index]} - β ={model_learning_rate} {early_stopping_title}",
fontdict={"fontsize": 14, "fontweight": "bold"},
)
else:
fig.suptitle(
f"Learning Curve of {academic_dataset_names[dataset_index]} - β ={model_learning_rate} {early_stopping_title}",
fontdict={"fontsize": 14, "fontweight": "bold"},
)
learning_rate_index = 0
for lr in learning_rate:
for modifier_index, modifer in enumerate(filter_modifier):
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{modifer}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{lr}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
col_index = modifier_index
ax[learning_rate_index][col_index].plot(
epoch_error["epoch"],
epoch_error["error_percent"],
label="Training",
linewidth=4,
)
ax[learning_rate_index][col_index].plot(
epoch_error["epoch"],
epoch_error["validate_error_percent"],
label="Validation",
linewidth=4,
)
if use_academic_name:
ax[learning_rate_index][col_index].set_title(
f"{filter_display_modifier[modifier_index]}\n α = {lr}",
fontdict={"fontsize": 20},
)
# best_train_epoch = epoch_error[
# epoch_error["error_percent"]
# == epoch_error["error_percent"].min()
# ]
# best_validate_epoch = epoch_error[
# epoch_error["validate_error_percent"]
# == epoch_error["validate_error_percent"].min()
# ]
# try:
# best_train_epoch = best_train_epoch.iloc[0]
# best_train_epoch = best_train_epoch["epoch"]
# best_validate_epoch = best_validate_epoch.iloc[0]
# best_validate_epoch = best_validate_epoch["epoch"]
# except:
# best_train_epoch = np.nan
# best_validate_epoch = np.nan
# ax[learning_rate_index][col_index].set_xlabel(
# f'Train Err {epoch_error.iloc[-1]["error_percent"]:.2f} , Validate Err {epoch_error.iloc[-1]["validate_error_percent"]:.2f} \n Best Epoch Train {best_train_epoch:.0f} , Validate {best_validate_epoch:.0f}'
# )
# ax[learning_rate_index][col_index].set_ylabel(
# 'Error RMSPE')
ax[learning_rate_index][col_index].set_ylim(0, 100)
ax[learning_rate_index][col_index].set_xlim(0, 100)
# ax[learning_rate_index][col_index].legend(
# loc='lower right')
learning_rate_index += 1
handles, labels = ax[0][0].get_legend_handles_labels()
fig.legend(handles, labels, loc="lower center",
ncol=2, fontsize=12)
fig.tight_layout(pad=2.0)
early_stopping_modifier = "/early-stopping" if use_early_stopping else ""
if round_no > 0:
early_stopping_modifier = f"/round-{round_no}/{early_stopping_modifier}"
os.makedirs(
f"result/learning_curve/grid-rate-modifier/{dataset_name}{early_stopping_modifier}",
exist_ok=True,
)
plt.savefig(
f"result/learning_curve/grid-rate-modifier/{dataset_name}{early_stopping_modifier}/{model_learning_rate}.png"
)
plt.close(fig)
model_learning_rate_index += 1
learning_rate_index = 0
dataset_index += 1
# TODO: Not Implement
def plot_model_weight(use_academic_name=False, use_early_stopping=False, round_no=0, model_version=1):
dataset_index = 0
early_stopping_title = "With Early Stopping" if use_early_stopping else ""
for dataset_name in dataset_names:
# Find Best Accuracy
# For Each Model Learning Rate
if use_early_stopping:
filter_modifier = modifiers[4:]
filter_display_modifier = displayed_modifiers[4:]
else:
filter_modifier = modifiers[:4]
filter_display_modifier = displayed_modifiers[:4]
model_learning_rate_index = 0
learning_rate_index = 0
for model_learning_rate in model_learning_rates:
# For Each Learning Rate
fig, ax = plt.subplots(5, 4, figsize=(15, 14))
if use_academic_name:
fig.suptitle(
f"Weight Adjustment of {academic_dataset_names[dataset_index]} - β ={model_learning_rate} {early_stopping_title}",
fontdict={"fontsize": 14, "fontweight": "bold"},
)
else:
fig.suptitle(
f"Weight Adjustment of {academic_dataset_names[dataset_index]} - β ={model_learning_rate} {early_stopping_title}",
fontdict={"fontsize": 14, "fontweight": "bold"},
)
learning_rate_index = 0
for lr in learning_rate:
for modifier_index, modifer in enumerate(filter_modifier):
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{modifer}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{lr}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
adjustment_file = (
f"{directory_name}/round{round_no + 1}/sample-payload-list-{iteration}-{lr}.csv"
)
adjustment_data = pd.read_csv(adjustment_file)
col_index = modifier_index
ax[learning_rate_index][col_index].plot(
adjustment_data["model_weight_1"],
label="Material Element Weight",
)
ax[learning_rate_index][col_index].plot(
adjustment_data["model_weight_2"],
label="Labor Element Weight",
)
ax[learning_rate_index][col_index].plot(
adjustment_data["model_weight_3"],
label="Utiltiy Cost Element Weight",
)
if use_academic_name:
ax[learning_rate_index][col_index].set_title(
f"{filter_display_modifier[modifier_index]}\n α = {lr}",
fontdict={"fontsize": 12},
)
best_train_epoch = epoch_error[
epoch_error["error_percent"]
== epoch_error["error_percent"].min()
]
best_validate_epoch = epoch_error[
epoch_error["validate_error_percent"]
== epoch_error["validate_error_percent"].min()
]
try:
best_train_epoch = best_train_epoch.iloc[0]
best_train_epoch = best_train_epoch["epoch"]
best_validate_epoch = best_validate_epoch.iloc[0]
best_validate_epoch = best_validate_epoch["epoch"]
except Exception as e:
best_train_epoch = np.nan
best_validate_epoch = np.nan
ax[learning_rate_index][col_index].set_xlabel(
f'Train Err {epoch_error.iloc[-1]["error_percent"]:.2f} , Validate Err {epoch_error.iloc[-1]["validate_error_percent"]:.2f} \n Best Epoch Train {best_train_epoch:.0f} , Validate {best_validate_epoch:.0f}'
)
ax[learning_rate_index][col_index].set_xticks([])
learning_rate_index += 1
handles, labels = ax[0][0].get_legend_handles_labels()
fig.legend(handles, labels, loc="lower center",
ncol=2, fontsize=12)
fig.tight_layout(pad=2.0)
early_stopping_modifier = "/early-stopping" if use_early_stopping else ""
if round_no > 0:
early_stopping_modifier = f"/round-{round_no}/{early_stopping_modifier}"
os.makedirs(
f"result/learning_curve/hyperparameter/model-weight-{dataset_name}{early_stopping_modifier}",
exist_ok=True,
)
plt.savefig(
f"result/learning_curve/hyperparameter/model-weight-{dataset_name}{early_stopping_modifier}/{model_learning_rate}.png"
)
plt.close(fig)
model_learning_rate_index += 1
learning_rate_index = 0
dataset_index += 1
def find_amount_of_employee(sample_df):
column_list = sample_df.columns.tolist()
employee_column_list = [
col for col in column_list if "employee_weight_" in col]
number_of_employee = len(employee_column_list)
return number_of_employee
def plot_element_weights(use_academic_name=False, use_early_stopping=False, round_no=0, model_version=1):
dataset_index = 0
early_stopping_title = "With Early Stopping" if use_early_stopping else ""
for dataset_name in dataset_names:
# Find Best Accuracy
# For Each Model Learning Rate
if use_early_stopping:
filter_modifier = modifiers[4:]
filter_display_modifier = displayed_modifiers[4:]
else:
filter_modifier = modifiers[:4]
filter_display_modifier = displayed_modifiers[:4]
model_learning_rate_index = 0
learning_rate_index = 0
for model_learning_rate in model_learning_rates:
# For Each Learning Rate
fig, ax = plt.subplots(5, 4, figsize=(18, 17))
if use_academic_name:
fig.suptitle(
f"Bias Adjustment of {academic_dataset_names[dataset_index]} - β ={model_learning_rate} {early_stopping_title}",
fontdict={"fontsize": 14, "fontweight": "bold"},
)
else:
fig.suptitle(
f"Model Element Weight Adjustment of {academic_dataset_names[dataset_index]} - β ={model_learning_rate} {early_stopping_title}",
fontdict={"fontsize": 14, "fontweight": "bold"},
)
learning_rate_index = 0
for lr in learning_rate:
for modifier_index, modifer in enumerate(filter_modifier):
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{modifer}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{lr}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
adjustment_file = (
f"{directory_name}/round{round_no + 1}/sample-payload-list-{iteration}-{lr}.csv"
)
adjustment_data = pd.read_csv(adjustment_file)
col_index = modifier_index
# Material Weights
ax[learning_rate_index][col_index].plot(
adjustment_data["material_weight_1"],
label="A Crab", color="LightPink"
)
ax[learning_rate_index][col_index].plot(
adjustment_data["material_weight_2"],
label="C Crab", color="SkyBlue"
)
# In Case of Not Exist Material Weight 4 in Actual Case
try:
ax[learning_rate_index][col_index].plot(
adjustment_data["material_weight_4"],
label="Loss Crab", color="MediumPurple"
)
ax[learning_rate_index][col_index].plot(
adjustment_data["material_weight_3"],
label="Small Crab", color="LightGreen"
)
except:
ax[learning_rate_index][col_index].plot(
adjustment_data["material_weight_3"],
label="Small and Loss Crab", color="MediumPurple"
)
# Employee Weights
number_of_employee = find_amount_of_employee(
adjustment_data)
employee_colors = ["PaleTurquoise", "Cyan",
"LightCyan", "Turquoise", "DarkTurquoise"]
emp_index = 0
for emp in range(number_of_employee):
ax[learning_rate_index][col_index].plot(
adjustment_data[f"employee_weight_{emp + 1}"],
label=f"Employee {emp}",
color=employee_colors[emp % len(employee_colors)]
)
emp_index += 1
# Utility Cost Weights
ax[learning_rate_index][col_index].plot(
adjustment_data["capital_cost_weight_1"],
label="Electricity Cost",
color="gold"
)
ax[learning_rate_index][col_index].plot(
adjustment_data["capital_cost_weight_2"],
label="Water Supply Cost",
color="yellow"
)
if use_academic_name:
ax[learning_rate_index][col_index].set_title(
f"{filter_display_modifier[modifier_index]}\n α = {lr}",
fontdict={"fontsize": 12},
)
best_train_epoch = epoch_error[
epoch_error["error_percent"]
== epoch_error["error_percent"].min()
]
best_validate_epoch = epoch_error[
epoch_error["validate_error_percent"]
== epoch_error["validate_error_percent"].min()
]
try:
best_train_epoch = best_train_epoch.iloc[0]
best_train_epoch = best_train_epoch["epoch"]
best_validate_epoch = best_validate_epoch.iloc[0]
best_validate_epoch = best_validate_epoch["epoch"]
except Exception as e:
best_train_epoch = np.nan
best_validate_epoch = np.nan
# ax[learning_rate_index][col_index].set_xlabel(
# f'Train Err {epoch_error.iloc[-1]["error_percent"]:.2f} , Validate Err {epoch_error.iloc[-1]["validate_error_percent"]:.2f} \n Best Epoch Train {best_train_epoch:.0f} , Validate {best_validate_epoch:.0f}'
# )
ax[learning_rate_index][col_index].set_xticks([])
ax[learning_rate_index][col_index].set_ylim(-2000, 10000)
# Ensure all values are positive before setting the y-axis to logarithmic scale
# if (adjustment_data.select_dtypes(include=[np.number]) > 0).all().all():
# ax[learning_rate_index][col_index].set_yscale('log')
# else:
# print(
# f"Warning: Non-positive values detected in dataset {dataset_name}, modifier {modifer}, learning rate {lr}. Skipping logarithmic scale.")
learning_rate_index += 1
handles, labels = ax[0][0].get_legend_handles_labels()
fig.legend(handles, labels, loc="lower center",
ncol=8, fontsize=12)
fig.tight_layout(pad=3.0)
early_stopping_modifier = "/early-stopping" if use_early_stopping else ""
if round_no > 0:
early_stopping_modifier = f"/round-{round_no}/{early_stopping_modifier}"
os.makedirs(
f"result/learning_curve/hyperparameter/element-weight-{dataset_name}{early_stopping_modifier}",
exist_ok=True,
)
plt.savefig(
f"result/learning_curve/hyperparameter/element-weight-{dataset_name}{early_stopping_modifier}/{model_learning_rate}.png"
)
plt.close(fig)
model_learning_rate_index += 1
learning_rate_index = 0
dataset_index += 1
def plot_element_bias(use_academic_name=False, use_early_stopping=False, round_no=0, model_version=1):
dataset_index = 0
early_stopping_title = "With Early Stopping" if use_early_stopping else ""
for dataset_name in dataset_names:
# Find Best Accuracy
# For Each Model Learning Rate
if use_early_stopping:
filter_modifier = modifiers[4:]
filter_display_modifier = displayed_modifiers[4:]
else:
filter_modifier = modifiers[:4]
filter_display_modifier = displayed_modifiers[:4]
model_learning_rate_index = 0
learning_rate_index = 0
for model_learning_rate in model_learning_rates:
# For Each Learning Rate
fig, ax = plt.subplots(5, 4, figsize=(15, 14))
if use_academic_name:
fig.suptitle(
f"Biases Adjustment of {academic_dataset_names[dataset_index]} - β ={model_learning_rate} {early_stopping_title}",
fontdict={"fontsize": 14, "fontweight": "bold"},
)
else:
fig.suptitle(
f"Biases Adjustment of {academic_dataset_names[dataset_index]} - β ={model_learning_rate} {early_stopping_title}",
fontdict={"fontsize": 14, "fontweight": "bold"},
)
learning_rate_index = 0
for lr in learning_rate:
for modifier_index, modifer in enumerate(filter_modifier):
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{modifer}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{lr}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
adjustment_file = (
f"{directory_name}/round{round_no + 1}/sample-payload-list-{iteration}-{lr}.csv"
)
adjustment_data = pd.read_csv(adjustment_file)
col_index = modifier_index
ax[learning_rate_index][col_index].plot(
adjustment_data["material_bias_1"],
label="Material Element Bias",
)
ax[learning_rate_index][col_index].plot(
adjustment_data["employee_bias_1"],
label="Labor Element Bias",
)
ax[learning_rate_index][col_index].plot(
adjustment_data["capital_cost_bias_1"],
label="Utility Cost Element Bias",
)
ax[learning_rate_index][col_index].plot(
adjustment_data["model_bias"],
label="Model Bias",
)
if use_academic_name:
ax[learning_rate_index][col_index].set_title(
f"{filter_display_modifier[modifier_index]}\n α = {lr}",
fontdict={"fontsize": 12},
)
best_train_epoch = epoch_error[
epoch_error["error_percent"]
== epoch_error["error_percent"].min()
]
best_validate_epoch = epoch_error[
epoch_error["validate_error_percent"]
== epoch_error["validate_error_percent"].min()
]
try:
best_train_epoch = best_train_epoch.iloc[0]
best_train_epoch = best_train_epoch["epoch"]
best_validate_epoch = best_validate_epoch.iloc[0]
best_validate_epoch = best_validate_epoch["epoch"]
except Exception as e:
best_train_epoch = np.nan
best_validate_epoch = np.nan
ax[learning_rate_index][col_index].set_xlabel(
f'Train Err {epoch_error.iloc[-1]["error_percent"]:.2f} , Validate Err {epoch_error.iloc[-1]["validate_error_percent"]:.2f} \n Best Epoch Train {best_train_epoch:.0f} , Validate {best_validate_epoch:.0f}'
)
ax[learning_rate_index][col_index].set_xticks([])
learning_rate_index += 1
handles, labels = ax[0][0].get_legend_handles_labels()
fig.legend(handles, labels, loc="lower center",
ncol=2, fontsize=12)
fig.tight_layout(pad=2.0)
early_stopping_modifier = "/early-stopping" if use_early_stopping else ""
if round_no > 0:
early_stopping_modifier = f"/round-{round_no}/{early_stopping_modifier}"
os.makedirs(
f"result/learning_curve/hyperparameter/bias-{dataset_name}{early_stopping_modifier}",
exist_ok=True,
)
plt.savefig(
f"result/learning_curve/hyperparameter/bias-{dataset_name}{early_stopping_modifier}/{model_learning_rate}.png"
)
plt.close(fig)
model_learning_rate_index += 1
learning_rate_index = 0
dataset_index += 1
def plot_each_case(use_academic_name=False, use_early_stopping=False, round_no=0, model_version=1, selected_case=""):
modifier_index = modifiers.index(selected_case)
model_learning_rate_index = 0
for model_learning_rate in model_learning_rates:
dataset_index = 0
fig, ax = plt.subplots(4, 5, figsize=(24, 15))
fig.suptitle(
f"Learning Curve of {displayed_modifiers[modifier_index]} Dataset with Model Learning Rate (β) of {model_learning_rate}",
fontdict={"fontsize": 18, "fontweight": "bold"},
)
for dataset_name in dataset_names:
learning_rate_index = 0
# For Each Learning Rate
learning_rate_index = 0
for lr in (learning_rate):
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{selected_case}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{lr}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
ax[dataset_index][learning_rate_index].plot(
epoch_error["epoch"],
epoch_error["error_percent"],
label="Training",
linewidth=4
)
ax[dataset_index][learning_rate_index].plot(
epoch_error["epoch"],
epoch_error["validate_error_percent"],
label="Validation",
linewidth=4
)
if learning_rate_index == 0:
ax[dataset_index][learning_rate_index].set_title(
f"{academic_dataset_names[dataset_index]} \nα={lr}",
fontsize=20,
)
else:
ax[dataset_index][learning_rate_index].set_title(
f"\nα={lr}",
fontsize=20,
)
# best_train_epoch = epoch_error[
# epoch_error["error_percent"]
# == epoch_error["error_percent"].min()
# ]
# best_validate_epoch = epoch_error[
# epoch_error["validate_error_percent"]
# == epoch_error["validate_error_percent"].min()
# ]
# try:
# best_train_epoch = best_train_epoch.iloc[0]
# best_train_epoch = best_train_epoch["epoch"]
# best_validate_epoch = best_validate_epoch.iloc[0]
# best_validate_epoch = best_validate_epoch["epoch"]
# except:
# best_train_epoch = np.nan
# best_validate_epoch = np.nan
# ax[dataset_index][learning_rate_index].set_xlabel(
# f'Train Err {epoch_error.iloc[-1]["error_percent"]:.2f} , Val Err {epoch_error.iloc[-1]["validate_error_percent"]:.2f} \n Lowest Point Iteration on Train {best_train_epoch:.0f} , Validate {best_validate_epoch:.0f}'
# )
# ax[learning_rate_index][col_index].set_ylabel(
# 'Error RMSPE')
ax[dataset_index][learning_rate_index].set_ylim(0, 115)
ax[dataset_index][learning_rate_index].set_xlim(0, 100)
# ax[learning_rate_index][col_index].legend(
# loc='lower right')
learning_rate_index += 1
dataset_index += 1
handles, labels = ax[0][0].get_legend_handles_labels()
fig.legend(handles, labels, loc="lower center",
ncol=2, fontsize=18)
fig.tight_layout(pad=2.0)
early_stopping_modifier = "/early-stopping" if use_early_stopping else ""
if round_no > 0:
early_stopping_modifier = f"/round-{round_no}/{early_stopping_modifier}"
casename = to_kebab_case(displayed_modifiers[modifier_index])
os.makedirs(
f"result/learning_curve/by-case/{casename}{early_stopping_modifier}",
exist_ok=True,
)
plt.savefig(
f"result/learning_curve/by-case/{casename}{early_stopping_modifier}/{model_learning_rate}.png"
)
plt.close(fig)
model_learning_rate_index += 1
def plot_each_case_reversed(use_academic_name=False, use_early_stopping=False, round_no=0, model_version=1, selected_case=""):
modifier_index = modifiers.index(selected_case)
model_learning_rate_index = 0
for model_learning_rate in model_learning_rates:
dataset_index = 0
fig, ax = plt.subplots(5, 4, figsize=(24, 20))
fig.suptitle(
f"Learning Curve of {displayed_modifiers[modifier_index]} Dataset with Model Learning Rate (β) of {model_learning_rate}",
fontdict={"fontsize": 20, "fontweight": "bold"},
)
learning_rate_index = 0
for lr in (learning_rate):
dataset_index = 0
# For Each Learning Rate
for dataset_name in dataset_names:
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{selected_case}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{lr}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
ax[learning_rate_index][dataset_index].plot(
epoch_error["epoch"],
epoch_error["error_percent"],
label="Training",
linewidth=4
)
ax[learning_rate_index][dataset_index].plot(
epoch_error["epoch"],
epoch_error["validate_error_percent"],
label="Validation",
linewidth=4
)
if dataset_index == 0:
ax[learning_rate_index][dataset_index].set_title(
f"α={lr}\n{academic_dataset_names[dataset_index]}",
fontsize=24,
)
else:
ax[learning_rate_index][dataset_index].set_title(
f"\n{academic_dataset_names[dataset_index]}",
fontsize=24,
)
# best_train_epoch = epoch_error[
# epoch_error["error_percent"]
# == epoch_error["error_percent"].min()
# ]
# best_validate_epoch = epoch_error[
# epoch_error["validate_error_percent"]
# == epoch_error["validate_error_percent"].min()
# ]
# try:
# best_train_epoch = best_train_epoch.iloc[0]
# best_train_epoch = best_train_epoch["epoch"]
# best_validate_epoch = best_validate_epoch.iloc[0]
# best_validate_epoch = best_validate_epoch["epoch"]
# except:
# best_train_epoch = np.nan
# best_validate_epoch = np.nan
# ax[learning_rate_index][dataset_index].set_xlabel(
# f'Train Err {epoch_error.iloc[-1]["error_percent"]:.2f} , Val Err {epoch_error.iloc[-1]["validate_error_percent"]:.2f} \n Lowest Point Iteration on Train {best_train_epoch:.0f} , Validate {best_validate_epoch:.0f}'
# )
# ax[learning_rate_index][col_index].set_ylabel(
# 'Error RMSPE')
ax[learning_rate_index][dataset_index].set_ylim(0, 115)
ax[learning_rate_index][dataset_index].set_xlim(0, 100)
# ax[learning_rate_index][col_index].legend(
# loc='lower right')
dataset_index += 1
learning_rate_index += 1
handles, labels = ax[0][0].get_legend_handles_labels()
fig.legend(handles, labels, loc="lower center",
ncol=2, fontsize=18)
fig.tight_layout(pad=2.0)
early_stopping_modifier = "/early-stopping" if use_early_stopping else ""
if round_no > 0:
early_stopping_modifier = f"/round-{round_no}/{early_stopping_modifier}"
casename = to_kebab_case(displayed_modifiers[modifier_index])
os.makedirs(
f"result/learning_curve/by-case/{casename}{early_stopping_modifier}",
exist_ok=True,
)
plt.savefig(
f"result/learning_curve/by-case/{casename}{early_stopping_modifier}/{model_learning_rate}-reversed.png"
)
plt.close(fig)
model_learning_rate_index += 1
def plot_each_element_weights(use_academic_name=False, use_early_stopping=False, round_no=0, model_version=1, selected_case="", learning_rate=0.01):
early_stopping_title = "With Early Stopping" if use_early_stopping else ""
model_learning_rate_index = 0
modifier_index = modifiers.index(selected_case)
this_graph_palette = sns.color_palette("husl", 9)
sns.set_palette(this_graph_palette)
for model_learning_rate in model_learning_rates:
# For Each Learning Rate
dataset_index = 0
fig, ax = plt.subplots(1, 4, figsize=(18, 5))
if use_academic_name:
fig.suptitle(
f"Model Element Weight Adjustment of {displayed_modifiers[modifier_index]} {academic_dataset_names[dataset_index]} \n β ={model_learning_rate} α = {learning_rate} {early_stopping_title}",
fontdict={"fontsize": 16, "fontweight": "bold"},
)
else:
fig.suptitle(
f"Model Element Weight Adjustment of {displayed_modifiers[modifier_index]} {academic_dataset_names[dataset_index]} \n β ={model_learning_rate}α = {learning_rate} {early_stopping_title}",
fontdict={"fontsize": 16, "fontweight": "bold"},
)
for dataset_name in dataset_names:
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{selected_case}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{learning_rate}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
adjustment_file = (
f"{directory_name}/round{round_no + 1}/sample-payload-list-{iteration}-{learning_rate}.csv"
)
adjustment_data = pd.read_csv(adjustment_file)
# Material Weights
ax[dataset_index].plot(
adjustment_data["material_weight_1"],
label="A Crab"
)
ax[dataset_index].plot(
adjustment_data["material_weight_2"],
label="C Crab"
)
# In Case of Not Exist Material Weight 4 in Actual Case
try:
ax[dataset_index].plot(
adjustment_data["material_weight_4"],
label="Loss Crab"
)
ax[dataset_index].plot(
adjustment_data["material_weight_3"],
label="Small Crab"
)
except Exception as e:
print(e)
ax[dataset_index].plot(
adjustment_data["material_weight_3"],
label="Small and Loss Crab"
)
# Utility Cost Weights
ax[dataset_index].plot(
adjustment_data["capital_cost_weight_1"],
label="Electricity Cost",
)
ax[dataset_index].plot(
adjustment_data["capital_cost_weight_2"],
label="Water Supply Cost",
)
# Employee Weights
number_of_employee = find_amount_of_employee(
adjustment_data)
employee_colors = ["PaleTurquoise", "Cyan",
"LightCyan", "Turquoise", "DarkTurquoise"]
emp_index = 0
for emp in range(number_of_employee):
ax[dataset_index].plot(
adjustment_data[f"employee_weight_{emp + 1}"],
label=f"Employee {emp}",
linestyle="--",
# color=employee_colors[emp % len(employee_colors)]
)
emp_index += 1
if use_academic_name:
ax[dataset_index].set_title(
f"{academic_dataset_names[dataset_index]}",
fontsize=18,
)
best_train_epoch = epoch_error[
epoch_error["error_percent"]
== epoch_error["error_percent"].min()
]
best_validate_epoch = epoch_error[
epoch_error["validate_error_percent"]
== epoch_error["validate_error_percent"].min()
]
try:
best_train_epoch = best_train_epoch.iloc[0]
best_train_epoch = best_train_epoch["epoch"]
best_validate_epoch = best_validate_epoch.iloc[0]
best_validate_epoch = best_validate_epoch["epoch"]
except Exception as e:
best_train_epoch = np.nan
best_validate_epoch = np.nan
# ax[dataset_index].set_xlabel(
# f'Train Err {epoch_error.iloc[-1]["error_percent"]:.2f} , Validate Err {epoch_error.iloc[-1]["validate_error_percent"]:.2f} \n Best Epoch Train {best_train_epoch:.0f} , Validate {best_validate_epoch:.0f}'
# )
ax[dataset_index].set_xticks([])
ax[dataset_index].set_ylim(0, 10000)
# Ensure all values are positive before setting the y-axis to logarithmic scale
# if (adjustment_data.select_dtypes(include=[np.number]) > 0).all().all():
# ax[dataset_index].set_yscale('log')
# else:
# print(
# f"Warning: Non-positive values detected in dataset {dataset_name}. Skipping logarithmic scale.")
dataset_index += 1
handles, labels = ax[3].get_legend_handles_labels()
print('labels', labels)
# Group employee labels together
employee_labels = [
label for label in labels if label.startswith("Employee")]
other_labels = [
label for label in labels if not label.startswith("Employee")]
# Combine employee labels into a single entry
if employee_labels:
other_labels.append("Employees")
labels = other_labels
fig.legend(handles, labels, loc="lower center",
ncol=8, fontsize=16)
fig.tight_layout(pad=2.0)
early_stopping_modifier = "/early-stopping" if use_early_stopping else ""
if round_no > 0:
early_stopping_modifier = f"/round-{round_no}/{early_stopping_modifier}"
casename = to_kebab_case(displayed_modifiers[modifier_index])
os.makedirs(
f"result/learning_curve/hyperparameter/element-weight-{learning_rate}{early_stopping_modifier}",
exist_ok=True,
)
plt.savefig(
f"result/learning_curve/hyperparameter/element-weight-{learning_rate}{early_stopping_modifier}/{casename}-{model_learning_rate}.png"
)
plt.close(fig)
model_learning_rate_index += 1
dataset_index += 1
sns.set_palette(sns.color_palette())
def plot_each_element_weights_select(use_academic_name=False, use_early_stopping=False, round_no=0, model_version=1, selected_case="", learning_rate=0.01, is_tail=False, round=1000):
early_stopping_title = "With Early Stopping" if use_early_stopping else ""
model_learning_rate_index = 0
modifier_index = modifiers.index(selected_case)
this_graph_palette = sns.color_palette("husl", 9)
sns.set_palette(this_graph_palette)
prefix_modifier = is_tail and f"Last {round} Round" or f"First {round} Round"
for model_learning_rate in model_learning_rates:
# For Each Learning Rate
dataset_index = 0
fig, ax = plt.subplots(1, 4, figsize=(18, 5))
if use_academic_name:
fig.suptitle(
f"Model Element Weight Adjustment of {displayed_modifiers[modifier_index]} {academic_dataset_names[dataset_index]} \n β ={model_learning_rate} α = {learning_rate} {early_stopping_title}",
fontdict={"fontsize": 16, "fontweight": "bold"},
)
else:
fig.suptitle(
f"Model Element Weight Adjustment of {displayed_modifiers[modifier_index]} {academic_dataset_names[dataset_index]} \n β ={model_learning_rate}α = {learning_rate} {early_stopping_title}",
fontdict={"fontsize": 16, "fontweight": "bold"},
)
for dataset_name in dataset_names:
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{selected_case}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{learning_rate}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
adjustment_file = (
f"{directory_name}/round{round_no + 1}/sample-payload-list-{iteration}-{learning_rate}.csv"
)
adjustment_data = pd.read_csv(adjustment_file)
if is_tail:
# Select the last 1000 rows of the DataFrame
adjustment_data = adjustment_data.tail(round)
else:
adjustment_data = adjustment_data.head(round)
# Material Weights
ax[dataset_index].plot(
adjustment_data["material_weight_1"],
label="A Crab"
)
ax[dataset_index].plot(
adjustment_data["material_weight_2"],
label="C Crab"
)
# In Case of Not Exist Material Weight 4 in Actual Case
try:
ax[dataset_index].plot(
adjustment_data["material_weight_4"],
label="Loss Crab"
)
ax[dataset_index].plot(
adjustment_data["material_weight_3"],
label="Small Crab"
)
except Exception as e:
print(e)
ax[dataset_index].plot(
adjustment_data["material_weight_3"],
label="Small and Loss Crab"
)
# Employee Weights
number_of_employee = find_amount_of_employee(
adjustment_data)
employee_colors = ["PaleTurquoise", "Cyan",
"LightCyan", "Turquoise", "DarkTurquoise"]
emp_index = 0
for emp in range(number_of_employee):
ax[dataset_index].plot(
adjustment_data[f"employee_weight_{emp + 1}"],
label=f"Employee {emp}",
# color=employee_colors[emp % len(employee_colors)]
)
emp_index += 1
# Utility Cost Weights
ax[dataset_index].plot(
adjustment_data["capital_cost_weight_1"],
label="Electricity Cost",
)
ax[dataset_index].plot(
adjustment_data["capital_cost_weight_2"],
label="Water Supply Cost",
)
if use_academic_name:
ax[dataset_index].set_title(
f"{academic_dataset_names[dataset_index]}",
fontsize=16,
)
best_train_epoch = epoch_error[
epoch_error["error_percent"]
== epoch_error["error_percent"].min()
]
best_validate_epoch = epoch_error[
epoch_error["validate_error_percent"]
== epoch_error["validate_error_percent"].min()
]
try:
best_train_epoch = best_train_epoch.iloc[0]
best_train_epoch = best_train_epoch["epoch"]
best_validate_epoch = best_validate_epoch.iloc[0]
best_validate_epoch = best_validate_epoch["epoch"]
except Exception as e:
best_train_epoch = np.nan
best_validate_epoch = np.nan
# ax[dataset_index].set_xlabel(
# f'Train Err {epoch_error.iloc[-1]["error_percent"]:.2f} , Validate Err {epoch_error.iloc[-1]["validate_error_percent"]:.2f} \n Best Epoch Train {best_train_epoch:.0f} , Validate {best_validate_epoch:.0f}'
# )
ax[dataset_index].set_xticks([])
ax[dataset_index].set_ylim(0, 10000)
# Ensure all values are positive before setting the y-axis to logarithmic scale
# if (adjustment_data.select_dtypes(include=[np.number]) > 0).all().all():
# ax[dataset_index].set_yscale('log')
# else:
# print(
# f"Warning: Non-positive values detected in dataset {dataset_name}. Skipping logarithmic scale.")
dataset_index += 1
handles, labels = ax[3].get_legend_handles_labels()
print('labels', labels)
# Group employee labels together
employee_labels = [
label for label in labels if label.startswith("Employee")]
other_labels = [
label for label in labels if not label.startswith("Employee")]
# Combine employee labels into a single entry
if employee_labels:
other_labels.append("Employees")
labels = other_labels
fig.legend(handles, labels, loc="lower center",
ncol=8, fontsize=12)
fig.tight_layout(pad=2.0)
early_stopping_modifier = "/early-stopping" if use_early_stopping else ""
if round_no > 0:
early_stopping_modifier = f"/round-{round_no}/{early_stopping_modifier}"
prefix_filename = is_tail and f"tail-{round}" or f"head-{round}"
os.makedirs(
f"result/learning_curve/hyperparameter/element-weight-{learning_rate}{early_stopping_modifier}",
exist_ok=True,
)
plt.savefig(
f"result/learning_curve/hyperparameter/element-weight-{learning_rate}{early_stopping_modifier}/{prefix_filename}-{model_learning_rate}.png"
)
plt.close(fig)
model_learning_rate_index += 1
dataset_index += 1
sns.set_palette(sns.color_palette())
def plot_each_weights(use_academic_name=False, use_early_stopping=False, round_no=0, model_version=1, selected_case="", learning_rate=0.01):
early_stopping_title = "With Early Stopping" if use_early_stopping else ""
model_learning_rate_index = 0
modifier_index = modifiers.index(selected_case)
this_graph_palette = sns.color_palette("husl", 4)
sns.set_palette(this_graph_palette)
for model_learning_rate in model_learning_rates:
# For Each Learning Rate
dataset_index = 0
fig, ax = plt.subplots(1, 4, figsize=(18, 5))
if use_academic_name:
fig.suptitle(
f"Model Level Weight Adjustment of {displayed_modifiers[modifier_index]} {academic_dataset_names[dataset_index]} \n β ={model_learning_rate} α = {learning_rate} {early_stopping_title}",
fontdict={"fontsize": 16, "fontweight": "bold"},
)
else:
fig.suptitle(
f"Model Level Weight Adjustment of {displayed_modifiers[modifier_index]} {academic_dataset_names[dataset_index]} \n β ={model_learning_rate}α = {learning_rate} {early_stopping_title}",
fontdict={"fontsize": 16, "fontweight": "bold"},
)
for dataset_name in dataset_names:
directory_name = f"result/{dataset_name}/{dataset_name}_{model_version}_{model_learning_rate}{selected_case}"
epoch_error_file = (
f"{directory_name}/round{round_no + 1}/{iteration}-{learning_rate}.csv"
)
epoch_error = pd.read_csv(epoch_error_file)
adjustment_file = (
f"{directory_name}/round{round_no + 1}/sample-payload-list-{iteration}-{learning_rate}.csv"
)
adjustment_data = pd.read_csv(adjustment_file)
ax[dataset_index].plot(
adjustment_data["model_weight_1"],
label="Material Element Weight",
)
ax[dataset_index].plot(
adjustment_data["model_weight_2"],
label="Labor Element Weight", linewidth=3,
# linestyle='-',
)
ax[dataset_index].plot(
adjustment_data["model_weight_3"],
label="Utiltiy Cost Element Weight",
linewidth=3,
linestyle=':', color=sns.palettes.hls_palette(6)[4]
)
if use_academic_name:
ax[dataset_index].set_title(
f"{academic_dataset_names[dataset_index]}",
fontsize=20,
)
best_train_epoch = epoch_error[
epoch_error["error_percent"]
== epoch_error["error_percent"].min()
]
best_validate_epoch = epoch_error[
epoch_error["validate_error_percent"]
== epoch_error["validate_error_percent"].min()
]
try:
best_train_epoch = best_train_epoch.iloc[0]
best_train_epoch = best_train_epoch["epoch"]
best_validate_epoch = best_validate_epoch.iloc[0]
best_validate_epoch = best_validate_epoch["epoch"]
except Exception as e:
best_train_epoch = np.nan
best_validate_epoch = np.nan
# ax[dataset_index].set_xlabel(
# f'Train Err {epoch_error.iloc[-1]["error_percent"]:.2f} , Validate Err {epoch_error.iloc[-1]["validate_error_percent"]:.2f} \n Best Epoch Train {best_train_epoch:.0f} , Validate {best_validate_epoch:.0f}'
# )
ax[dataset_index].set_xticks([])
ax[dataset_index].set_ylim(0, 30)
# Ensure all values are positive before setting the y-axis to logarithmic scale
# if (adjustment_data.select_dtypes(include=[np.number]) > 0).all().all():
# ax[dataset_index].set_yscale('log')
# else:
# print(
# f"Warning: Non-positive values detected in dataset {dataset_name}. Skipping logarithmic scale.")
dataset_index += 1
handles, labels = ax[3].get_legend_handles_labels()
print('labels', labels)
# Group employee labels together
employee_labels = [
label for label in labels if label.startswith("Employee")]
other_labels = [
label for label in labels if not label.startswith("Employee")]
# Combine employee labels into a single entry
if employee_labels:
other_labels.append("Employees")
labels = other_labels
fig.legend(handles, labels, loc="lower center",
ncol=8, fontsize=16)
fig.tight_layout(pad=2.0)
early_stopping_modifier = "/early-stopping" if use_early_stopping else ""
if round_no > 0:
early_stopping_modifier = f"/round-{round_no}/{early_stopping_modifier}"
os.makedirs(
f"result/learning_curve/hyperparameter/model-weight-{learning_rate}{early_stopping_modifier}",
exist_ok=True,
)
plt.savefig(
f"result/learning_curve/hyperparameter/model-weight-{learning_rate}{early_stopping_modifier}/{model_learning_rate}-{selected_case}.png"
)
plt.close(fig)
model_learning_rate_index += 1
dataset_index += 1
sns.set_palette(sns.color_palette())