Source code for test_suite.benchmarks.criteria
import numpy as np
import logging
logger = logging.getLogger('traveltimes')
[docs]def mean_absolute_percentage_error(y_true, y_pred):
_mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100
logger.debug("[Cost function] MAPE: %s.", _mape)
return _mape
[docs]def root_mean_squared_logarithmic_error(y_true, y_pred):
_pow = np.power(np.log(y_pred + 1) - np.log(y_true + 1), 2)
return np.sqrt(np.mean(_pow))
[docs]def mean_absolute_error(y_true, y_pred):
_abs = np.abs(y_true - y_pred)
return np.mean(_abs)
[docs]def root_mean_squared_error(y_true, y_pred):
_abs = np.power(y_true - y_pred, 2)
return np.sqrt(np.mean(_abs))
###################################################################
###################################################################
[docs]def camea_custom_error(y_true, y_pred):
diff = y_true - y_pred
# insensivity band
score = np.array(list(map(_insensivity, diff, y_true)))
return np.mean(score)
def _insensivity(val, y_true):
abs_val = abs(val)
rel_val = abs_val/y_true*100
if abs_val < 60:
return 0
elif rel_val < 5:
return _penalize(val, 1.5, 1)
elif rel_val < 10:
return _penalize(val, 2, 1.25)
elif rel_val < 20:
return _penalize(val, 2.5, 1.25)
else:
return _penalize(val, 3, 1.5)
def _penalize(val, positive_penalty, negative_penalty):
if val > 0:
return val**positive_penalty
return abs(val)**negative_penalty
###################################################################
###################################################################
[docs]def camea_custom_error_v2(y_true, y_pred):
tt_free = np.percentile(y_true, 10)
tt_free = [tt_free] * len(y_true)
out = list(map(_camea_err, y_pred, y_true, tt_free))
res = sum(map(lambda x: x if x >= 0.1 else 0, out))
# res = sum(out)
return res
def _camea_err(tt_calculated, tt_real, tt_free):
p = 0.5 * (tt_calculated - tt_real) if tt_real < tt_calculated else (tt_real - tt_calculated)
p2_maxmin = min(298,
max(120,
0.15 * max(1,
abs(tt_free - tt_real))))
p3_maxmin = min(600,
max(300, 0.5 * max(1,
abs(tt_free - tt_real))))
q = p < p2_maxmin
r1 = 0.1 * p / p2_maxmin
p3_q = p < p3_maxmin
p3_r1 = 1 - 0.9 * (p - p3_maxmin) / (p2_maxmin - p3_maxmin)
r2 = p3_r1 if p3_q else 1
r = r1 if q else r2
return r