Skip to content

Commit 9bfc892

Browse files
committed
add mape to estimate result
Signed-off-by: Sunyanan Choochotkaew <[email protected]>
1 parent 117c566 commit 9bfc892

File tree

5 files changed

+29
-4
lines changed

5 files changed

+29
-4
lines changed

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)