| import pandas as pd |
| import matplotlib.pyplot as plt |
| import seaborn as sns |
| import numpy as np |
|
|
| sns.set_theme(style="whitegrid", font="Noto Sans", |
| font_scale=1) |
| this_graph_palette = sns.color_palette("husl", 4) |
| sns.set_palette(this_graph_palette) |
|
|
|
|
| def plotting_learning_curve(epoch_error, element_learning_rate, model_learning_rate): |
| fig, ax = plt.subplots(1, 2, figsize=(8, 4)) |
|
|
| ax[0].plot( |
| epoch_error["epoch"], |
| epoch_error["error"], |
| label="Training", |
| linewidth=2 |
| ) |
| ax[0].plot( |
| epoch_error["epoch"], |
| epoch_error["validate_error"], |
| label="Validation", linewidth=2 |
| ) |
| ax[0].set_title( |
| f"Learning Curve {model_learning_rate}/{element_learning_rate} in MSE", |
| fontdict={"fontsize": 12}, |
| ) |
| ax[1].plot( |
| epoch_error["epoch"], |
| epoch_error["error_percent"], |
| label="Training", |
| linewidth=2 |
| ) |
| ax[1].plot( |
| epoch_error["epoch"], |
| epoch_error["validate_error_percent"], |
| label="Validation", linewidth=2 |
| ) |
| ax[1].set_ylim( |
| 0, 100) |
| ax[1].set_xlim( |
| 0, 100) |
|
|
| ax[1].set_title( |
| f"Learning Curve {model_learning_rate}/{element_learning_rate} in RMSPE", |
| fontdict={"fontsize": 12}, |
| ) |
| ax[0].legend(loc="lower right") |
| ax[1].legend(loc="lower right") |
| fig.tight_layout(pad=3.0) |
|
|
|
|
| def plot_model_level_weight(adjustment_data, epoch_error): |
| fig, ax = plt.subplots(1, 3, figsize=(14, 3)) |
|
|
| ax[0].plot( |
| adjustment_data["model_weight_1"], |
| label="Material Element Weight", |
| ) |
| ax[0].plot( |
| adjustment_data["model_weight_2"], |
| label="Labor Element Weight", |
| ) |
| ax[0].plot( |
| adjustment_data["model_weight_3"], |
| label="Utiltiy Cost Element Weight", |
| ) |
|
|
| 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[0].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[0].set_xticks([]) |
| ax[0].legend(loc="lower right") |
| ax[0].set_title( |
| "All Model Level Weight", |
| fontdict={"fontsize": 12}, |
| ) |
|
|
| ax[1].plot( |
| adjustment_data["model_weight_1"], |
| label="Material Element Weight", |
| ) |
| ax[1].legend(loc="lower right") |
| ax[1].set_title( |
| "Material Element Weight", |
| fontdict={"fontsize": 12}, |
| ) |
|
|
| ax[2].plot( |
| adjustment_data["model_weight_2"], |
| label="Labor Element Weight", |
| ) |
| ax[2].plot( |
| adjustment_data["model_weight_3"], |
| label="Utiltiy Cost Element Weight", |
| ) |
| ax[2].legend(loc="lower right") |
| ax[2].set_title( |
| "Labor and Utility Cost Element Weight", |
| fontdict={"fontsize": 12}, |
| ) |
|
|
|
|
| def plot_element_level_weight(adjustment_data, material_columns, labor_columns, utility_columns): |
|
|
| fig, ax = plt.subplots(1, 3, figsize=(14, 3)) |
| for column in material_columns: |
| ax[0].plot( |
| adjustment_data[column], |
| label=column, |
| ) |
|
|
| for column in labor_columns: |
| ax[1].plot( |
| adjustment_data[column], |
| label=column, |
| ) |
|
|
| for column in utility_columns: |
| ax[2].plot( |
| adjustment_data[column], |
| label=column, |
| ) |
|
|
| ax[0].legend(loc="lower right") |
| ax[2].legend(loc="lower right") |
|
|
| ax[0].set_title( |
| "Material Element Weight", |
| fontdict={"fontsize": 12}, |
| ) |
|
|
| ax[1].set_title( |
| "Labor Element Weight", |
| fontdict={"fontsize": 12}, |
| ) |
|
|
| ax[2].set_title( |
| "Utility Cost Element Weight", |
| fontdict={"fontsize": 12}, |
| ) |
|
|
| fig.tight_layout(pad=2.0) |
|
|