# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # pylint: disable=doc-string-missing, doc-string-with-all-args, doc-string-with-returns def tied_rank(x): """ Computes the tied rank of elements in x. This function computes the tied rank of elements in x. Parameters ---------- x : list of numbers, numpy array Returns ------- score : list of numbers The tied rank f each element in x """ sorted_x = sorted(zip(x, range(len(x)))) r = [0 for k in x] cur_val = sorted_x[0][0] last_rank = 0 for i in range(len(sorted_x)): if cur_val != sorted_x[i][0]: cur_val = sorted_x[i][0] for j in range(last_rank, i): r[sorted_x[j][1]] = float(last_rank + 1 + i) / 2.0 last_rank = i if i == len(sorted_x) - 1: for j in range(last_rank, i + 1): r[sorted_x[j][1]] = float(last_rank + i + 2) / 2.0 return r def auc(actual, posterior): """ Computes the area under the receiver-operater characteristic (AUC) This function computes the AUC error metric for binary classification. Parameters ---------- actual : list of binary numbers, numpy array The ground truth value posterior : same type as actual Defines a ranking on the binary numbers, from most likely to be positive to least likely to be positive. Returns ------- score : double The mean squared error between actual and posterior """ r = tied_rank(posterior) num_positive = len([0 for x in actual if x == 1]) num_negative = len(actual) - num_positive sum_positive = sum([r[i] for i in range(len(r)) if actual[i] == 1]) auc = ((sum_positive - num_positive * (num_positive + 1) / 2.0) / (num_negative * num_positive)) return auc