Source code for pyhealth.evaluation.multilabel

# -*- coding: utf-8 -*-

# Author: Zhi Qiao <mingshan_ai@163.com>

# License: BSD 2 clause

import numpy as np
import pickle
import os

from sklearn.metrics import hamming_loss
from sklearn.metrics import average_precision_score
from sklearn.metrics import jaccard_score
from sklearn.metrics import roc_auc_score
from sklearn.metrics import f1_score
from sklearn.metrics import coverage_error
from sklearn.metrics import label_ranking_average_precision_score
from sklearn.metrics import label_ranking_loss

[docs]def get_top_k_results(hat_y, y, k=1): format_hat_y = np.zeros(np.shape(hat_y)) for i in range(len(hat_y)): i_s = np.argsort(hat_y[i, :])[-k:] for j in i_s: format_hat_y[i, j] = 1. values = {} values['hamming_loss'+'@'+str(k)] = hamming_loss(y, format_hat_y) # values['jaccard_score_micro'+'@'+str(k)] = jaccard_score(y, format_hat_y, average = 'micro') # values['jaccard_score_macro'+'@'+str(k)] = jaccard_score(y, format_hat_y, average = 'macro') values['recall'+'@'+str(k)] = np.mean(np.sum(format_hat_y * y, axis=1)/ np.sum(y, axis=1)) values['precision'+'@'+str(k)] = np.mean(np.sum(format_hat_y * y, axis=1)/ np.sum(format_hat_y, axis=1)) return values
[docs]def get_avg_results(hat_y, y): values = {} values['avg_precision_micro'] = average_precision_score(y, hat_y, average = 'micro') # values['avg_precision_macro'] = average_precision_score(y, hat_y, average = 'macro') values['roc_auc_score_micro'] = roc_auc_score(y, hat_y, average = 'micro') # values['roc_auc_score_macro'] = roc_auc_score(y, hat_y, average = 'macro') values['coverage_error'] = coverage_error(y, hat_y) values['label_ranking_average_precision_score'] = label_ranking_average_precision_score(y, hat_y) values['label_ranking_loss'] = label_ranking_loss(y, hat_y) return values
[docs]def evaluator(hat_y, y): values = get_avg_results(hat_y, y) values_2 = get_top_k_results(hat_y, y, k=1) values_3 = get_top_k_results(hat_y, y, k=3) values.update(values_2) values.update(values_3) return values
if __name__ == '__main__': y = np.array([[0., 1., 0.],[1., 0., 1.]]) hat_y = np.array([[0.3, 0.7, 0.1],[0.1, 0.2, 0.8]]) z = phenotyping(hat_y, y) print (z)