def evaluate_metrics(data_set, custom_metrics_dict):
    """
    Loops through the entries in custom_metrics_dict and calculates each metric on the given dataset

    :param DataSet data_set: A DataSet that has DataWrappers called "targets" and "predictions" as attributes.
    :param dict custom_metrics_dict: A dictionary of custom metrics of the form { {custom_metric_name: custom_metric_function}...}
    where custom_metric_function is a callable that takes the inputs "y_true" and "y_pred" and returns the scalar value of
    the calculated metric.

    :return: A dictionary of the form {{custom_metric_name: metric_value}, ...}
    """
    y_true = data_set.targets.underlying
    y_pred = data_set.predictions.underlying

    custom_metrics = {}

    if not custom_metrics_dict:
        return custom_metrics
    else:
        for custom_metric_name, evaluate_custom_metric in custom_metrics_dict.items():
            custom_metric_value = evaluate_custom_metric(y_true, y_pred)
            custom_metrics[custom_metric_name] = custom_metric_value

        return custom_metrics