def getROCArea(cls, tcurve: Instances): n = tcurve.numInstances() if cls.RELATION_NAME != tcurve.relationName() or n == 0: return float('nan') tpInd = tcurve.attribute(cls.TRUE_POS_NAME).index() fpInd = tcurve.attribute(cls.FALSE_POS_NAME).index() tpVals = tcurve.attributeToDoubleArray(tpInd) fpVals = tcurve.attributeToDoubleArray(fpInd) area = cumNeg = 0 totalPos = tpVals[0] totalNeg = fpVals[0] for i in range(n): if i < n - 1: cip = tpVals[i] - tpVals[i + 1] cin = fpVals[i] - fpVals[i + 1] else: cip = tpVals[n - 1] cin = fpVals[n - 1] area += cip * (cumNeg + (0.5 * cin)) cumNeg += cin if totalNeg * totalPos == 0: if area == 0: return float("nan") elif area > 0: return float("inf") else: return float("-inf") area /= (totalNeg * totalPos) return area
def getPRCArea(cls, tcurve: Instances): n = tcurve.numInstances() if cls.RELATION_NAME != tcurve.relationName() or n == 0: return float('nan') pInd = tcurve.attribute(cls.PRECISION_NAME).index() rInd = tcurve.attribute(cls.RECALL_NAME).index() pVals = tcurve.attributeToDoubleArray(pInd) rVals = tcurve.attributeToDoubleArray(rInd) area = 0 xlast = rVals[n - 1] for i in range(n - 2, -1, -1): recallDelta = rVals[i] - xlast area += pVals[i] * recallDelta xlast = rVals[i] if area == 0: return Utils.missingValue() return area