| import sklearn |
| import numpy as np |
| from scipy.sparse import csr_matrix |
| from scipy.sparse.csgraph import laplacian |
| from scipy.sparse.linalg import eigs |
| from sklearn.metrics import accuracy_score |
| from sklearn.metrics import f1_score |
| from sklearn.metrics import hamming_loss |
| from sklearn.metrics import roc_auc_score |
| import pandas as pd |
| from random import sample |
|
|
| |
| class Metric(object): |
| def __init__(self,output,label): |
| self.output = output |
| self.label = label |
| |
| def accuracy_subset(self,threash=0.5): |
| y_pred =self.output |
| y_true = self.label |
| y_pred=np.where(y_pred>threash,1,0) |
| accuracy=accuracy_score(y_true,y_pred) |
| return accuracy |
| |
| def accuracy(self,threash=0.5): |
| y_pred =self.output |
| y_true = self.label |
| y_pred=np.where(y_pred>threash,1,0) |
| accuracy=sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None) |
| return accuracy |
| |
| def accuracy_multiclass(self): |
| y_pred =self.output |
| y_true = self.label |
| accuracy=accuracy_score(np.argmax(y_pred,1),np.argmax(y_true,1)) |
| return accuracy |
| |
| def micfscore(self,threash=0.5,type='micro'): |
| y_pred =self.output |
| y_true = self.label |
| y_pred=np.where(y_pred>threash,1,0) |
| return f1_score(y_pred,y_true,average=type) |
|
|
| def macfscore(self,threash=0.5,type='macro'): |
| y_pred =self.output |
| y_true = self.label |
| y_pred=np.where(y_pred>threash,1,0) |
| return f1_score(y_pred,y_true,average=type) |
| |
| def hamming_distance(self,threash=0.5): |
| y_pred =self.output |
| y_true = self.label |
| y_pred=np.where(y_pred>threash,1,0) |
| return hamming_loss(y_true,y_pred) |
| |
| def fscore_class(self,type='micro'): |
| y_pred =self.output |
| y_true = self.label |
| return f1_score(np.argmax(y_pred,1),np.argmax(y_true,1),average=type) |
| |
| def auROC(self): |
| y_pred =self.output |
| y_true = self.label |
| row,col = y_true.shape |
| temp = [] |
| ROC = 0 |
| for i in range(col): |
| try: |
| ROC = roc_auc_score(y_true[:,i], y_pred[:,i], average='micro', sample_weight=None) |
| except: |
| ROC == 0.5 |
| temp.append(ROC) |
| for i in range(col): |
| ROC += float(temp[i]) |
| return ROC/(col+1),temp |
| |
| def MacroAUC(self): |
| y_pred =self.output |
| y_true = self.label |
| num_instance,num_class = y_pred.shape |
| count = np.zeros((num_class,1)) |
| num_P_instance = np.zeros((num_class,1)) |
| num_N_instance = np.zeros((num_class,1)) |
| auc = np.zeros((num_class,1)) |
| count_valid_label = 0 |
| for i in range(num_class): |
| num_P_instance[i,0] = sum(y_true[:,i] == 1) |
| num_N_instance[i,0] = num_instance - num_P_instance[i,0] |
| |
| |
| if num_P_instance[i,0] == 0 or num_N_instance[i,0] == 0: |
| auc[i,0] = 0 |
| count_valid_label = count_valid_label + 1 |
| else: |
| temp_P_Outputs = np.zeros((int(num_P_instance[i,0]), num_class)) |
| temp_N_Outputs = np.zeros((int(num_N_instance[i,0]), num_class)) |
| |
| temp_P_Outputs[:,i] = y_pred[y_true[:,i]==1,i] |
| temp_N_Outputs[:,i] = y_pred[y_true[:,i]==0,i] |
| for m in range(int(num_P_instance[i,0])): |
| for n in range(int(num_N_instance[i,0])): |
| if(temp_P_Outputs[m,i] > temp_N_Outputs[n,i] ): |
| count[i,0] = count[i,0] + 1 |
| elif(temp_P_Outputs[m,i] == temp_N_Outputs[n,i]): |
| count[i,0] = count[i,0] + 0.5 |
| |
| auc[i,0] = count[i,0]/(num_P_instance[i,0]*num_N_instance[i,0]) |
| macroAUC1 = sum(auc)/(num_class-count_valid_label) |
| return float(macroAUC1), auc |
|
|
|
|
| def bootstrap_auc(label, output, classes, bootstraps=5, fold_size=1000): |
| statistics = np.zeros((len(classes), bootstraps)) |
| for c in range(len(classes)): |
| for i in range(bootstraps): |
| L=[] |
| for k in range(len(label)): |
| L.append([output[k],label[k]]) |
| if fold_size <= len(L): |
| X = sample(L, fold_size) |
| else: |
| fold_size == len(L) |
| X = sample(L, fold_size) |
| for b in range(len(X)): |
| if b ==0: |
| Output = np.array([X[b][0]]) |
| Label = np.array([X[b][1]]) |
| Output = np.concatenate((Output, np.array([X[b][0]])),axis=0) |
| Label = np.concatenate((Label, np.array([X[b][1]])),axis=0) |
| |
| myMetic = Metric(Output,Label) |
| AUROC1, auc = myMetic.auROC() |
| statistics[c][i] = AUROC1 |
| return statistics |
| |
|
|
|
|
|
|