Skip to content

Commit 53b1020

Browse files
authored
Merge pull request #233 from sunya-ch/exporter
add MAPE to estimator result and update exported figure
2 parents 37ddc04 + 9bfc892 commit 53b1020

File tree

6 files changed

+31
-5
lines changed

6 files changed

+31
-5
lines changed

cmd/cmd_plot.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def metadata_plot(args, energy_source, metadata_df, output_folder, name):
134134
ax = axes
135135
else:
136136
ax = axes[i]
137-
sns.boxplot(data=metadata_df, x="feature_group", y="mae", hue="trainer", ax=ax, hue_order=sorted(metadata_df['trainer'].unique()), showfliers=False, palette="Set3")
137+
sns.barplot(data=metadata_df, x="feature_group", y="mae", hue="trainer", ax=ax, hue_order=sorted(metadata_df['trainer'].unique()), errorbar=None, palette="Set3")
138138
ax.set_title(component)
139139
ax.set_ylabel("MAE (Watt)")
140140
ax.set_xlabel("Feature Group")
@@ -144,6 +144,7 @@ def metadata_plot(args, energy_source, metadata_df, output_folder, name):
144144
# ax.legend(bbox_to_anchor=(1.05, 1.05))
145145
plt.suptitle("Pipieline metadata of {} {}".format(energy_source.upper(), args.output_type))
146146
plt.tight_layout()
147+
plt.legend(frameon=False)
147148
filename = os.path.join(output_folder, name + ".png")
148149
fig.savefig(filename)
149150
plt.close()

cmd/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,10 +547,11 @@ def estimate(args):
547547
label_power_columns = [col for col in power_labels if energy_component in col and col != predicted_power_colname]
548548
sum_power_label = data.groupby([TIMESTAMP_COL]).mean()[label_power_columns].sum(axis=1).sort_index()
549549
sum_predicted_power = data_with_prediction.groupby([TIMESTAMP_COL]).sum().sort_index()[predicted_power_colname]
550-
mae, mse = compute_error(sum_power_label, sum_predicted_power)
550+
mae, mse, mape = compute_error(sum_power_label, sum_predicted_power)
551551
summary_item = dict()
552552
summary_item["MAE"] = mae
553553
summary_item["MSE"] = mse
554+
summary_item["MAPE"] = mape
554555
summary_item["n"] = len(sum_predicted_power)
555556
summary_item["energy_component"] = energy_component
556557
summary_item["energy_source"] = energy_source

src/estimate/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
from estimate_common import compute_error
1010

1111
from model import load_model, get_background_containers
12-
from model import default_predicted_col_func, get_predicted_power_colname, get_predicted_background_power_colname, get_dynamic_power_colname, get_predicted_dynamic_power_colname, get_predicted_dynamic_background_power_colname, get_label_power_colname, get_reconstructed_power_colname
12+
from model import default_predicted_col_func, get_predicted_power_colname, get_predicted_background_power_colname, get_dynamic_power_colname, get_predicted_dynamic_power_colname, get_predicted_dynamic_background_power_colname, get_label_power_colname, get_reconstructed_power_colname, default_idle_predicted_col_func

src/estimate/model/estimate_common.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
keras_enabled = True
22
import cpuinfo
3+
import numpy as np
34

45
cpu_info = cpuinfo.get_cpu_info()
56

@@ -61,7 +62,20 @@ def load_model_by_keras(model_path, model_filename):
6162
def load_model_by_json(model_path, model_filename):
6263
return load_json(model_path, model_filename)
6364

65+
# return mae, mse, mape
6466
def compute_error(predicted_power, actual_powers):
6567
mse = mean_squared_error(actual_powers, predicted_power)
6668
mae = mean_absolute_error(actual_powers, predicted_power)
67-
return mae, mse
69+
actual_power_values = list(actual_powers)
70+
predicted_power_values = list(predicted_power)
71+
if len(actual_powers) == 0:
72+
mape = -1
73+
else:
74+
non_zero_predicted_powers = np.array([predicted_power_values[i] for i in range(len(predicted_power_values)) if actual_power_values[i] > 0])
75+
if len(non_zero_predicted_powers) == 0:
76+
mape = -1
77+
else:
78+
non_zero_y_test = np.array([y for y in actual_powers if y > 0])
79+
absolute_percentage_errors = np.abs((non_zero_y_test - non_zero_predicted_powers) / non_zero_y_test) * 100
80+
mape = np.mean(absolute_percentage_errors)
81+
return mae, mse, mape

src/estimate/model/model.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
def default_predicted_col_func(energy_component):
3131
return "default_{}_power".format(energy_component)
3232

33+
def default_idle_predicted_col_func(energy_component):
34+
return "default_idle_{}_power".format(energy_component)
35+
3336
def get_background_containers(idle_data):
3437
return pd.unique(idle_data[valid_container_query]["container_name"])
3538

@@ -122,6 +125,12 @@ def append_prediction(self, data, predicted_col_func=default_predicted_col_func)
122125
def print_log(self, message):
123126
print("{} model: {}".format(self.model_name, message))
124127

128+
def append_idle_prediction(self, data, predicted_col_func=default_idle_predicted_col_func):
129+
idle_data = data.copy()
130+
features = self.estimator.features
131+
idle_data[features] = 0
132+
return self.append_prediction(idle_data, predicted_col_func)
133+
125134
def load_model(model_path):
126135
metadata = load_metadata(model_path)
127136
if metadata is not None:

tests/estimator_model_test.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def test_model(group_path, model_name, test_data_with_label, power_columns, powe
3535
predicted_power_colname = default_predicted_col_func(energy_component)
3636
sum_power_label = test_data_with_label.groupby([TIMESTAMP_COL]).mean()[label_power_columns].sum(axis=1).sort_index()
3737
sum_predicted_power = data_with_prediction.groupby([TIMESTAMP_COL]).sum().sort_index()[predicted_power_colname]
38-
mae, mse = compute_error(sum_power_label, sum_predicted_power)
38+
mae, mse, mape = compute_error(sum_power_label, sum_predicted_power)
3939
if power_range is None:
4040
power_range = sum_power_label.max() - sum_power_label.min()
4141
percent = mae/power_range
@@ -44,6 +44,7 @@ def test_model(group_path, model_name, test_data_with_label, power_columns, powe
4444
item['mae'] = mae
4545
item['mse'] = mse
4646
item['%mae'] = percent * 100
47+
item['mape'] = mape
4748
items += [item]
4849
return pd.DataFrame(items), data_with_prediction, model
4950

0 commit comments

Comments
 (0)