in packages/dispatcher/src/mathematics/confusion_matrix/UtilityConfusionMatrix.ts [424:850]
public static aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(
binaryConfusionMatrices: BinaryConfusionMatrix[],
labelArrayAndMap: ILabelArrayAndMap,
confusionMatrixOutputLines: string[][],
confusionMatrixAverageOutputLines: string[][],
confusionMatrixAverageDescriptionOutputLines: string[][],
columnNamePreffix: string,
toObfuscate: boolean = false,
quantileConfiguration: number = 4): IMultiLabelObjectConfusionMatrixEvaluationStructure {
// -----------------------------------------------------------------------
const confusionMatrix: ConfusionMatrix =
new ConfusionMatrix(labelArrayAndMap.stringArray, labelArrayAndMap.stringMap);
// -----------------------------------------------------------------------
if (Utility.isEmptyArray(confusionMatrixOutputLines)) {
confusionMatrixOutputLines = [];
}
if (Utility.isEmptyArray(confusionMatrixAverageOutputLines)) {
confusionMatrixAverageOutputLines = [];
}
if (Utility.isEmptyArray(confusionMatrixAverageDescriptionOutputLines)) {
confusionMatrixAverageDescriptionOutputLines = [];
}
// -----------------------------------------------------------------------
Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices.length=${binaryConfusionMatrices.length}`);
for (let i: number = 0; i < binaryConfusionMatrices.length; i++) {
const label: string = Utility.carefullyAccessStringArray(labelArrayAndMap.stringArray, i);
const precision: number = Utility.round(binaryConfusionMatrices[i].getPrecision());
const recall: number = Utility.round(binaryConfusionMatrices[i].getRecall());
const f1: number = Utility.round(binaryConfusionMatrices[i].getF1Measure());
const accuracy: number = Utility.round(binaryConfusionMatrices[i].getAccuracy());
const truePositives: number = binaryConfusionMatrices[i].getTruePositives();
const falsePositives: number = binaryConfusionMatrices[i].getFalsePositives();
const trueNegatives: number = binaryConfusionMatrices[i].getTrueNegatives();
const falseNegatives: number = binaryConfusionMatrices[i].getFalseNegatives();
const support: number = binaryConfusionMatrices[i].getSupport();
const total: number = binaryConfusionMatrices[i].getTotal();
const confusionMatrixOutputLine: any[] = [
Utility.outputString(label, toObfuscate),
precision,
recall,
f1,
accuracy,
truePositives,
falsePositives,
trueNegatives,
falseNegatives,
support,
total,
];
confusionMatrixOutputLines.push(confusionMatrixOutputLine);
Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getTotal() =${binaryConfusionMatrices[i].getTotal()}`);
Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getTruePositives() =${binaryConfusionMatrices[i].getTruePositives()}`);
Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getFalsePositives()=${binaryConfusionMatrices[i].getFalsePositives()}`);
Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getTrueNegatives() =${binaryConfusionMatrices[i].getTrueNegatives()}`);
Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), binaryConfusionMatrices[${i}].getFalseNegatives()=${binaryConfusionMatrices[i].getFalseNegatives()}`);
}
const confusionMatrixMetricsHtml: string = Utility.convertDataArraysToIndexedHtmlTable(
"Confusion matrix metrics",
confusionMatrixOutputLines,
["Label", "Precision", "Recall", "F1", "Accuracy", "#TruePositives", "#FalsePositives", "#TrueNegatives", "#FalseNegatives", "Support", "Total"]);
// -----------------------------------------------------------------------
const microAverageMetrics: IConfusionMatrixBaseMicroAverageMetrics =
confusionMatrix.getMicroAverageMetrics(binaryConfusionMatrices);
const confusionMatrixOutputLineMicroAverage: any[] = [
UtilityConfusionMatrix.ColumnNameMicroAverage,
"N/A", // ---- Utility.round(microAverageMetrics.averagePrecisionRecallF1Accuracy), // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
"N/A", // ---- Utility.round(microAverageMetrics.averagePrecisionRecallF1Accuracy), // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
// tslint:disable-next-line: max-line-length
"N/A", // ---- Utility.round(microAverageMetrics.averagePrecisionRecallF1Accuracy), // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
// tslint:disable-next-line: max-line-length
Utility.getBolded(Utility.round(microAverageMetrics.averagePrecisionRecallF1Accuracy)), // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
microAverageMetrics.truePositives,
"N/A", // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
"N/A",
microAverageMetrics.falseNegatives,
"N/A",
microAverageMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMicroAverage);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameMicroAverage,
UtilityConfusionMatrix.DescriptionMicroAverage,
]);
// -----------------------------------------------------------------------
const microQuantileMetrics: IConfusionMatrixQuantileMetrics =
confusionMatrix.getMicroQuantileMetrics(binaryConfusionMatrices, quantileConfiguration);
const confusionMatrixOutputLineMicroQuantile1: any[] = [
UtilityConfusionMatrix.ColumnNameMicroFirstQuartile,
Utility.canAccessNumberArray(microQuantileMetrics.quantilesPrecisions, 1) ?
Utility.round(microQuantileMetrics.quantilesPrecisions[1]) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesRecalls, 1) ?
Utility.round(microQuantileMetrics.quantilesRecalls[1]) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesF1Scores, 1) ?
Utility.getBolded(Utility.round(microQuantileMetrics.quantilesF1Scores[1])) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesAccuracies, 1) ?
Utility.getBolded(Utility.round(microQuantileMetrics.quantilesAccuracies[1])) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesTruePositives, 1) ?
microQuantileMetrics.quantilesTruePositives[1] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalsePositives, 1) ?
microQuantileMetrics.quantilesFalsePositives[1] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesTrueNegatives, 1) ?
microQuantileMetrics.quantilesTrueNegatives[1] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalseNegatives, 1) ?
microQuantileMetrics.quantilesFalseNegatives[1] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesSupports, 1) ?
microQuantileMetrics.quantilesSupports[1] : "N/A",
microQuantileMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMicroQuantile1);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameMicroFirstQuartile,
UtilityConfusionMatrix.DescriptionMicroFirstQuartile,
]);
const confusionMatrixOutputLineMicroQuantile2: any[] = [
UtilityConfusionMatrix.ColumnNameMicroMedian,
Utility.canAccessNumberArray(microQuantileMetrics.quantilesPrecisions, 2) ?
Utility.round(microQuantileMetrics.quantilesPrecisions[2]) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesRecalls, 2) ?
Utility.round(microQuantileMetrics.quantilesRecalls[2]) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesF1Scores, 2) ?
Utility.getBolded(Utility.round(microQuantileMetrics.quantilesF1Scores[2])) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesAccuracies, 2) ?
Utility.getBolded(Utility.round(microQuantileMetrics.quantilesAccuracies[2])) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesTruePositives, 2) ?
microQuantileMetrics.quantilesTruePositives[2] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalsePositives, 2) ?
microQuantileMetrics.quantilesFalsePositives[2] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesTrueNegatives, 2) ?
microQuantileMetrics.quantilesTrueNegatives[2] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalseNegatives, 2) ?
microQuantileMetrics.quantilesFalseNegatives[2] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesSupports, 2) ?
microQuantileMetrics.quantilesSupports[2] : "N/A",
microQuantileMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMicroQuantile2);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameMicroMedian,
UtilityConfusionMatrix.DescriptionMicroMedian,
]);
const confusionMatrixOutputLineMicroQuantile3: any[] = [
UtilityConfusionMatrix.ColumnNameMicroThirdQuartile,
Utility.canAccessNumberArray(microQuantileMetrics.quantilesPrecisions, 3) ?
Utility.round(microQuantileMetrics.quantilesPrecisions[3]) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesRecalls, 3) ?
Utility.round(microQuantileMetrics.quantilesRecalls[3]) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesF1Scores, 3) ?
Utility.round(microQuantileMetrics.quantilesF1Scores[3]) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesAccuracies, 3) ?
Utility.round(microQuantileMetrics.quantilesAccuracies[3]) : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesTruePositives, 3) ?
microQuantileMetrics.quantilesTruePositives[3] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalsePositives, 3) ?
microQuantileMetrics.quantilesFalsePositives[3] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesTrueNegatives, 3) ?
microQuantileMetrics.quantilesTrueNegatives[3] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesFalseNegatives, 3) ?
microQuantileMetrics.quantilesFalseNegatives[3] : "N/A",
Utility.canAccessNumberArray(microQuantileMetrics.quantilesSupports, 3) ?
microQuantileMetrics.quantilesSupports[3] : "N/A",
microQuantileMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMicroQuantile3);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameMicroThirdQuartile,
UtilityConfusionMatrix.DescriptionMicroThirdQuartile,
]);
// -----------------------------------------------------------------------
const macroQuantileMetrics: IConfusionMatrixQuantileMetrics =
confusionMatrix.getMacroQuantileMetrics(binaryConfusionMatrices, quantileConfiguration);
const confusionMatrixOutputLineMacroQuantile1: any[] = [
UtilityConfusionMatrix.ColumnNameMacroFirstQuartile,
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesPrecisions, 1) ?
Utility.round(macroQuantileMetrics.quantilesPrecisions[1]) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesRecalls, 1) ?
Utility.round(macroQuantileMetrics.quantilesRecalls[1]) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesF1Scores, 1) ?
Utility.getBolded(Utility.round(macroQuantileMetrics.quantilesF1Scores[1])) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesAccuracies, 1) ?
Utility.getBolded(Utility.round(macroQuantileMetrics.quantilesAccuracies[1])) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTruePositives, 1) ?
macroQuantileMetrics.quantilesTruePositives[1] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalsePositives, 1) ?
macroQuantileMetrics.quantilesFalsePositives[1] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTrueNegatives, 1) ?
macroQuantileMetrics.quantilesTrueNegatives[1] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalseNegatives, 1) ?
macroQuantileMetrics.quantilesFalseNegatives[1] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesSupports, 1) ?
macroQuantileMetrics.quantilesSupports[1] : "N/A",
macroQuantileMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMacroQuantile1);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameMacroFirstQuartile,
UtilityConfusionMatrix.DescriptionMacroFirstQuartile,
]);
const confusionMatrixOutputLineMacroQuantile2: any[] = [
UtilityConfusionMatrix.ColumnNameMacroMedian,
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesPrecisions, 2) ?
Utility.round(macroQuantileMetrics.quantilesPrecisions[2]) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesRecalls, 2) ?
Utility.round(macroQuantileMetrics.quantilesRecalls[2]) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesF1Scores, 2) ?
Utility.getBolded(Utility.round(macroQuantileMetrics.quantilesF1Scores[2])) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesAccuracies, 2) ?
Utility.getBolded(Utility.round(macroQuantileMetrics.quantilesAccuracies[2])) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTruePositives, 2) ?
macroQuantileMetrics.quantilesTruePositives[2] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalsePositives, 2) ?
macroQuantileMetrics.quantilesFalsePositives[2] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTrueNegatives, 2) ?
macroQuantileMetrics.quantilesTrueNegatives[2] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalseNegatives, 2) ?
macroQuantileMetrics.quantilesFalseNegatives[2] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesSupports, 2) ?
macroQuantileMetrics.quantilesSupports[2] : "N/A",
macroQuantileMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMacroQuantile2);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameMacroMedian,
UtilityConfusionMatrix.DescriptionMacroMedian,
]);
const confusionMatrixOutputLineMacroQuantile3: any[] = [
UtilityConfusionMatrix.ColumnNameMacroThirdQuartile,
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesPrecisions, 3) ?
Utility.round(macroQuantileMetrics.quantilesPrecisions[3]) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesRecalls, 3) ?
Utility.round(macroQuantileMetrics.quantilesRecalls[3]) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesF1Scores, 3) ?
Utility.round(macroQuantileMetrics.quantilesF1Scores[3]) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesAccuracies, 3) ?
Utility.round(macroQuantileMetrics.quantilesAccuracies[3]) : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTruePositives, 3) ?
macroQuantileMetrics.quantilesTruePositives[3] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalsePositives, 3) ?
macroQuantileMetrics.quantilesFalsePositives[3] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesTrueNegatives, 3) ?
macroQuantileMetrics.quantilesTrueNegatives[3] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesFalseNegatives, 3) ?
macroQuantileMetrics.quantilesFalseNegatives[3] : "N/A",
Utility.canAccessNumberArray(macroQuantileMetrics.quantilesSupports, 3) ?
macroQuantileMetrics.quantilesSupports[3] : "N/A",
macroQuantileMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMacroQuantile3);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameMacroThirdQuartile,
UtilityConfusionMatrix.DescriptionMacroThirdQuartile,
]);
// -----------------------------------------------------------------------
const summationMicroAverageMetrics: IConfusionMatrixSummationMetrics =
confusionMatrix.getSummationMicroAverageMetrics(binaryConfusionMatrices);
const confusionMatrixOutputLineSummationMicroAverage: any[] = [
UtilityConfusionMatrix.ColumnNameSummationMicroAverage,
Utility.round(summationMicroAverageMetrics.summationPrecision),
Utility.round(summationMicroAverageMetrics.summationRecall),
Utility.getBolded(Utility.round(summationMicroAverageMetrics.summationF1Score)),
Utility.getBolded(Utility.round(summationMicroAverageMetrics.summationAccuracy)),
Utility.round(summationMicroAverageMetrics.summationTruePositives),
Utility.round(summationMicroAverageMetrics.summationFalsePositives),
Utility.round(summationMicroAverageMetrics.summationTrueNegatives),
Utility.round(summationMicroAverageMetrics.summationFalseNegatives),
Utility.round(summationMicroAverageMetrics.summationSupport),
"N/A", // ---- summationMicroAverageMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineSummationMicroAverage);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameSummationMicroAverage,
UtilityConfusionMatrix.DescriptionSummationMicroAverage,
]);
// -----------------------------------------------------------------------
const macroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getMacroAverageMetrics(binaryConfusionMatrices);
const confusionMatrixOutputLineMacroAverage: any[] = [
UtilityConfusionMatrix.ColumnNameMacroAverage,
Utility.round(macroAverageMetrics.averagePrecision),
Utility.round(macroAverageMetrics.averageRecall),
Utility.getBolded(Utility.round(macroAverageMetrics.averageF1Score)),
Utility.getBolded(Utility.round(macroAverageMetrics.averageAccuracy)),
"N/A", // ---- Utility.round(macroAverageMetrics.averageTruePositives),
"N/A", // ---- Utility.round(macroAverageMetrics.averageFalsePositives),
"N/A", // ---- Utility.round(macroAverageMetrics.averageTrueNegatives),
"N/A", // ---- Utility.round(macroAverageMetrics.averageFalseNegatives),
"N/A", // ---- Utility.round(macroAverageMetrics.averageSupport),
"N/A", // ---- macroAverageMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineMacroAverage);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameMacroAverage,
UtilityConfusionMatrix.DescriptionMacroAverage,
]);
// -----------------------------------------------------------------------
const summationMacroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getSummationMacroAverageMetrics(binaryConfusionMatrices);
const confusionMatrixOutputLineSummationMacroAverage: any[] = [
UtilityConfusionMatrix.ColumnNameSummationMacroAverage,
Utility.round(summationMacroAverageMetrics.averagePrecision),
Utility.round(summationMacroAverageMetrics.averageRecall),
Utility.round(summationMacroAverageMetrics.averageF1Score),
Utility.round(summationMacroAverageMetrics.averageAccuracy),
Utility.round(summationMacroAverageMetrics.averageTruePositives),
Utility.round(summationMacroAverageMetrics.averageFalsePositives),
Utility.round(summationMacroAverageMetrics.averageTrueNegatives),
Utility.round(summationMacroAverageMetrics.averageFalseNegatives),
Utility.round(summationMacroAverageMetrics.averageSupport),
"N/A", // ---- summationMacroAverageMetrics.total,
];
confusionMatrixAverageOutputLines.push(confusionMatrixOutputLineSummationMacroAverage);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameSummationMacroAverage,
UtilityConfusionMatrix.DescriptionSummationMacroAverage,
]);
// -----------------------------------------------------------------------
const positiveSupportLabelMacroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getPositiveSupportLabelMacroAverageMetrics(binaryConfusionMatrices);
const confusionMatrixOutputLinePositiveSupportLabelMacroAverage: any[] = [
UtilityConfusionMatrix.ColumnNamePositiveSupportMacroAverage,
Utility.round(positiveSupportLabelMacroAverageMetrics.averagePrecision),
Utility.round(positiveSupportLabelMacroAverageMetrics.averageRecall),
Utility.round(positiveSupportLabelMacroAverageMetrics.averageF1Score),
Utility.round(positiveSupportLabelMacroAverageMetrics.averageAccuracy),
"N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageTruePositives),
"N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageFalsePositives),
"N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageTrueNegatives),
"N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageFalseNegatives),
"N/A", // ---- Utility.round(positiveSupportLabelMacroAverageMetrics.averageSupport),
"N/A", // ---- positiveSupportLabelMacroAverageMetrics.total,
];
confusionMatrixAverageOutputLines.push(
confusionMatrixOutputLinePositiveSupportLabelMacroAverage);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNamePositiveSupportMacroAverage,
UtilityConfusionMatrix.DescriptionPositiveSupportMacroAverage,
]);
// -----------------------------------------------------------------------
const positiveSupportLabelSummationMacroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getPositiveSupportLabelSummationMacroAverageMetrics(binaryConfusionMatrices);
const confusionMatrixOutputLinePositiveSupportLabelSummationMacroAverage: any[] = [
UtilityConfusionMatrix.ColumnNamePositiveSupportSummationMacroAverage,
Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averagePrecision),
Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageRecall),
Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageF1Score),
Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageAccuracy),
Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageTruePositives),
Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageFalsePositives),
Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageTrueNegatives),
Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageFalseNegatives),
Utility.round(positiveSupportLabelSummationMacroAverageMetrics.averageSupport),
"N/A", // ---- positiveSupportLabelSummationMacroAverageMetrics.total,
];
confusionMatrixAverageOutputLines.push(
confusionMatrixOutputLinePositiveSupportLabelSummationMacroAverage);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNamePositiveSupportSummationMacroAverage,
UtilityConfusionMatrix.DescriptionPositiveSupportSummationMacroAverage,
]);
// -----------------------------------------------------------------------
const weightedMacroAverageMetrics: IConfusionMatrixMeanDerivedMetrics =
confusionMatrix.getWeightedMacroAverageMetrics(binaryConfusionMatrices);
const confusionMatrixOutputLineWeightedMacroAverage: any[] = [
UtilityConfusionMatrix.ColumnNameWeightedMacroAverage,
Utility.round(weightedMacroAverageMetrics.averagePrecision),
Utility.round(weightedMacroAverageMetrics.averageRecall),
Utility.round(weightedMacroAverageMetrics.averageF1Score),
Utility.round(weightedMacroAverageMetrics.averageAccuracy),
"N/A",
"N/A",
"N/A",
"N/A",
"N/A",
"N/A", // ---- weightedMacroAverageMetrics.total,
];
confusionMatrixAverageOutputLines.push(
confusionMatrixOutputLineWeightedMacroAverage);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameWeightedMacroAverage,
UtilityConfusionMatrix.DescriptionWeightedMacroAverage,
]);
// -----------------------------------------------------------------------
const summationWeightedMacroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getSummationWeightedMacroAverageMetrics(binaryConfusionMatrices);
const confusionMatrixOutputLineSummationWeightedMacroAverage: any[] = [
UtilityConfusionMatrix.ColumnNameWeightedSummationMacroAverage,
Utility.round(summationWeightedMacroAverageMetrics.averagePrecision),
Utility.round(summationWeightedMacroAverageMetrics.averageRecall),
Utility.round(summationWeightedMacroAverageMetrics.averageF1Score),
Utility.round(summationWeightedMacroAverageMetrics.averageAccuracy),
Utility.round(summationWeightedMacroAverageMetrics.averageTruePositives),
Utility.round(summationWeightedMacroAverageMetrics.averageFalsePositives),
Utility.round(summationWeightedMacroAverageMetrics.averageTrueNegatives),
Utility.round(summationWeightedMacroAverageMetrics.averageFalseNegatives),
Utility.round(summationWeightedMacroAverageMetrics.averageSupport),
"N/A", // ---- summationWeightedMacroAverageMetrics.total,
];
confusionMatrixAverageOutputLines.push(
confusionMatrixOutputLineSummationWeightedMacroAverage);
confusionMatrixAverageDescriptionOutputLines.push([
columnNamePreffix + UtilityConfusionMatrix.ColumnNameWeightedSummationMacroAverage,
UtilityConfusionMatrix.DescriptionWeightedSummationMacroAverage,
]);
// -----------------------------------------------------------------------
Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), confusionMatrix.getMicroAverageMetrics()= ${Utility.jsonStringify(confusionMatrix.getMicroAverageMetrics(binaryConfusionMatrices))}`);
Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), confusionMatrix.getMacroAverageMetrics()= ${Utility.jsonStringify(confusionMatrix.getMacroAverageMetrics(binaryConfusionMatrices))}`);
Utility.debuggingLog(`aggregateBinaryConfusionMatrixArrayIntoEvaluationOutputs(), confusionMatrix.getWeightedMacroAverageMetrics()=${Utility.jsonStringify(confusionMatrix.getWeightedMacroAverageMetrics(binaryConfusionMatrices))}`);
// -----------------------------------------------------------------------
const confusionMatrixAverageMetricsHtml: string = Utility.convertDataArraysToIndexedHtmlTable(
"Average confusion matrix metrics",
confusionMatrixAverageOutputLines,
["Type", "Precision", "Recall", "F1", "Accuracy", "#TruePositives", "#FalsePositives", "#TrueNegatives", "#FalseNegatives", "Support", "Total"]);
const confusionMatrixAverageDescriptionMetricsHtml: string = Utility.convertDataArraysToIndexedHtmlTable(
"Average confusion matrix metric descriptions",
confusionMatrixAverageDescriptionOutputLines,
["Type", "Description"]);
// -----------------------------------------------------------------------
return {
binaryConfusionMatrices,
confusionMatrixOutputLines,
confusionMatrixMetricsHtml,
confusionMatrixAverageOutputLines,
confusionMatrixAverageMetricsHtml,
confusionMatrixAverageDescriptionOutputLines,
confusionMatrixAverageDescriptionMetricsHtml,
};
// -----------------------------------------------------------------------
}