def calculate_score(solution, prediction, task_type, metric, num_classes,
                    all_scoring_functions=False):
    if task_type == MULTICLASS_CLASSIFICATION:
        solution_binary = np.zeros((prediction.shape[0], num_classes))
        for i in range(solution_binary.shape[0]):
            label = solution[i]
            solution_binary[i, label] = 1
        solution = solution_binary

    elif task_type in [BINARY_CLASSIFICATION, REGRESSION]:
        if len(solution.shape) == 1:
            solution = solution.reshape((-1, 1))

    if task_type not in TASK_TYPES:
        raise NotImplementedError(task_type)


    # todo
    # надо чинить libscores
    scoring_func = getattr(classification_metrics, metric)
    if solution.shape != prediction.shape:
        raise ValueError('Solution shape %s != prediction shape %s' %
                         (solution.shape, prediction.shape))

    if all_scoring_functions:
        score = dict()
        if task_type in REGRESSION_TASKS:
            cprediction = sanitize_array(prediction)
            score['a_metric'] = a_metric(solution, cprediction,
                                                   task=task_type)
            score['r2_metric'] = r2_metric(solution, cprediction,
                                                     task=task_type)
        else:
            csolution, cprediction = normalize_array(solution,
                                                               prediction)
            score['bac_metric'] = bac_metric(csolution, cprediction,
                                                       task=task_type)
            score['auc_metric'] = auc_metric(csolution, cprediction,
                                                       task=task_type)
            score['f1_metric'] = f1_metric(csolution, cprediction,
                                                     task=task_type)
            score['pac_metric'] = pac_metric(csolution, cprediction,
                                                       task=task_type)
            score['acc_metric'] = acc_metric(csolution, cprediction,
                                                       task=task_type)

    else:
        if task_type in REGRESSION_TASKS:
            cprediction = sanitize_array(prediction)
            score = scoring_func(solution, cprediction, task=task_type)
        else:
            csolution, cprediction = normalize_array(solution,
                                                               prediction)
            score = scoring_func(csolution, cprediction, task=task_type)
    return score
Example #2
0
            try:
                # Compute the score prescribed by the info file (for regression
                # scores, no normalization)
                if info['metric'] == 'r2_metric' or info[
                        'metric'] == 'a_metric':
                    # Remove NaN and Inf for regression
                    solution = sanitize_array(solution)
                    prediction = sanitize_array(prediction)
                    score = eval(info['metric'] + '(solution, prediction, "' +
                                 info['task'] + '")')
                else:
                    # Compute version that is normalized (for classification
                    # scores). This does nothing if all values are already in
                    # [0, 1]
                    [csolution,
                     cprediction] = normalize_array(solution, prediction)
                    score = eval(info['metric'] + '(csolution, cprediction, "'
                                 + info['task'] + '")')
                print(
                    '======= Set %d' % set_num +
                    ' (' + predict_name.capitalize()
                    + '): score(' + score_name + ')=%0.12f =======' % score)
                html_file.write(
                    '======= Set %d' % set_num +
                    ' (' + predict_name.capitalize()
                    + '): score(' + score_name + ')=%0.12f =======\n' % score)
            except Exception:
                raise Exception(
                    'Error in calculation of the specific score of the task')

            if debug_mode > 0: