Source code for ForeTiS.evaluation.eval_metrics

import sklearn
import numpy as np

def smape(y_true: np.array, y_pred: np.array) -> float:
    """
    Function delivering Symmetric Mean Absolute Percentage Error between prediction and actual values
    :param y_true: actual values
    :param y_pred: prediction values
    :return: sMAPE between prediction and actual values
    """
    return 100 / len(y_true) * np.sum(np.abs(y_pred - y_true) / ((np.abs(y_true) + np.abs(y_pred)) / 2))


[docs] def mape(y_true: np.array, y_pred: np.array) -> float: """ Function delivering Mean Absolute Percentage Error between prediction and actual values :param y_true: actual values :param y_pred: prediction values :return: MAPE between prediction and actual values """ return np.mean(np.abs((y_true - y_pred) / (y_true + 0.1))) * 100 # +0.1 to avoid div by zero
[docs] def get_evaluation_report(y_true: np.array, y_pred: np.array, prefix: str = '', current_model_name: str = None) -> dict: """ Get values for common evaluation metrics :param y_true: true values :param y_pred: predicted values :param prefix: prefix to be added to the key if multiple eval metrics are collected :param current_model_name: name of the current model according to naming of .py file in package model :return: dictionary with common metrics """ if len(y_pred) == (len(y_true) - 1): print('y_pred has one element less than y_true (e.g. due to batch size config) -> dropped last element') y_true = y_true[:-1] if current_model_name is not None and 'es' in current_model_name: if any(np.isnan(y_pred)): mask = ~np.isnan(y_pred) y_pred = y_pred[mask] y_true = y_true.array[mask] eval_report_dict = { prefix + 'mse': sklearn.metrics.mean_squared_error(y_true=y_true, y_pred=y_pred), prefix + 'rmse': sklearn.metrics.mean_squared_error(y_true=y_true, y_pred=y_pred, squared=False), prefix + 'r2_score': sklearn.metrics.r2_score(y_true=y_true, y_pred=y_pred), prefix + 'explained_variance': sklearn.metrics.explained_variance_score(y_true=y_true, y_pred=y_pred), prefix + 'MAPE': mape(y_true=y_true, y_pred=y_pred), prefix + 'sMAPE': smape(y_true=y_true, y_pred=y_pred) } return eval_report_dict