Source code for boa.metrics.metric_funcs
import json
import logging
import numpy as np
import scipy.stats as stats
import yaml
from sklearn.metrics import mean_squared_error
from boa.utils import get_dictionary_from_callable
logger = logging.getLogger(__name__)
def _metric_from_jsonlike(data, path_to_data):
for key in path_to_data:
try:
data = data[key]
except (IndexError, KeyError, TypeError) as e:
if len(e.args) >= 1:
e.args = (e.args[0] + "\nCan't load data from file because path to data is invalid!",) + e.args[1:]
raise
return data
[docs]def metric_from_json(filename, path_to_data, **kwargs):
with open(filename, "r") as f:
data = json.load(f)
return _metric_from_jsonlike(data, path_to_data)
[docs]def metric_from_yaml(filename, path_to_data, **kwargs):
with open(filename, "r") as f:
data = yaml.safe_load(f)
return _metric_from_jsonlike(data, path_to_data)
[docs]def normalized_root_mean_squared_error(y_true, y_pred, normalizer="iqr", **kwargs):
"""Normalized root mean squared error
Parameters
----------
y_true : array-like of shape (n_samples,) or (n_samples, n_outputs)
Ground truth (correct) target values.
y_pred : array-like of shape (n_samples,) or (n_samples, n_outputs)
Estimated target values.
normalizer : str
How to normalize the RMSE, options include iqr, std, mean, and range.
(default iqr)
**kwargs
see sklearn.metrics.mean_squared_error for additional options
Returns
-------
nrmse : float or ndarray of floats
A normalized version of RMSE
"""
rmse = mean_squared_error(y_true, y_pred, squared=False, **get_dictionary_from_callable(mean_squared_error, kwargs))
if normalizer == "iqr":
norm = stats.iqr(y_pred)
elif normalizer == "std":
norm = stats.tstd(y_pred)
elif normalizer == "mean":
norm = stats.tmean(y_pred)
elif normalizer == "range":
norm = np.ptp(y_pred)
else:
raise ValueError("normalizer must be 'iqr', 'std', 'mean', or 'range'.")
nrmse = rmse / norm
return nrmse