in flink-ml-lib/src/main/java/org/apache/flink/ml/evaluation/binaryclassification/BinaryClassificationEvaluator.java [411:452]
private static void updateBinaryMetrics(
Tuple3<Double, Boolean, Double> cur,
BinaryMetrics binaryMetrics,
long[] countValues,
double[] recordValues) {
if (binaryMetrics.count == 0) {
recordValues[0] = countValues[2] == 0 ? 1.0 : 1.0 * countValues[0] / countValues[2];
recordValues[1] = countValues[3] == 0 ? 1.0 : 1.0 * countValues[1] / countValues[3];
recordValues[2] =
countValues[0] + countValues[1] == 0
? 1.0
: 1.0 * countValues[0] / (countValues[0] + countValues[1]);
recordValues[3] =
1.0 * (countValues[0] + countValues[1]) / (countValues[2] + countValues[3]);
}
binaryMetrics.count++;
if (cur.f1) {
countValues[0]++;
} else {
countValues[1]++;
}
double tpr = countValues[2] == 0 ? 1.0 : 1.0 * countValues[0] / countValues[2];
double fpr = countValues[3] == 0 ? 1.0 : 1.0 * countValues[1] / countValues[3];
double precision =
countValues[0] + countValues[1] == 0
? 1.0
: 1.0 * countValues[0] / (countValues[0] + countValues[1]);
double positiveRate =
1.0 * (countValues[0] + countValues[1]) / (countValues[2] + countValues[3]);
binaryMetrics.areaUnderLorenz +=
((positiveRate - recordValues[3]) * (tpr + recordValues[0]) / 2);
binaryMetrics.areaUnderPR += ((tpr - recordValues[0]) * (precision + recordValues[2]) / 2);
binaryMetrics.ks = Math.max(Math.abs(fpr - tpr), binaryMetrics.ks);
recordValues[0] = tpr;
recordValues[1] = fpr;
recordValues[2] = precision;
recordValues[3] = positiveRate;
}