in packages/orchestratorlib/src/utility.ts [1423:1937]
public static generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(
confusionMatrix: IConfusionMatrix,
multiLabelObjectConfusionMatrixExact: MultiLabelObjectConfusionMatrixExact,
multiLabelObjectConfusionMatrixSubset: MultiLabelObjectConfusionMatrixSubset,
labelArrayAndMap: ILabelArrayAndMap): {
'confusionMatrix': IConfusionMatrix;
'multiLabelObjectConfusionMatrixExact': MultiLabelObjectConfusionMatrixExact;
'multiLabelObjectConfusionMatrixSubset': MultiLabelObjectConfusionMatrixSubset;
'predictingConfusionMatrixOutputLines': string[][];
'confusionMatrixMetricsHtml': string;
'confusionMatrixAverageMetricsHtml': string;
'confusionMatrixAverageDescriptionMetricsHtml': string;
} {
// -----------------------------------------------------------------------
const predictingConfusionMatrixOutputLines: string[][] = [];
const binaryConfusionMatrices: BinaryConfusionMatrix[] = confusionMatrix.getBinaryConfusionMatrices();
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), 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 predictingConfusionMatrixOutputLine: any[] = [
Utility.outputStringUtility(label),
precision,
recall,
f1,
accuracy,
truePositives,
falsePositives,
trueNegatives,
falseNegatives,
support,
total,
];
predictingConfusionMatrixOutputLines.push(predictingConfusionMatrixOutputLine);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), binaryConfusionMatrices[${i}].getTotal() =${binaryConfusionMatrices[i].getTotal()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), binaryConfusionMatrices[${i}].getTruePositives() =${binaryConfusionMatrices[i].getTruePositives()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), binaryConfusionMatrices[${i}].getFalsePositives()=${binaryConfusionMatrices[i].getFalsePositives()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), binaryConfusionMatrices[${i}].getTrueNegatives() =${binaryConfusionMatrices[i].getTrueNegatives()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), binaryConfusionMatrices[${i}].getFalseNegatives()=${binaryConfusionMatrices[i].getFalseNegatives()}`);
}
const confusionMatrixMetricsHtml: string = Utility.convertDataArraysToIndexedHtmlTable(
'Confusion matrix metrics',
predictingConfusionMatrixOutputLines,
['Label', 'Precision', 'Recall', 'F1', 'Accuracy', '#TruePositives', '#FalsePositives', '#TrueNegatives', '#FalseNegatives', 'Support', 'Total']);
// -----------------------------------------------------------------------
const predictingConfusionMatrixAverageOutputLines: string[][] = [];
const predictingConfusionMatrixAverageDescriptionOutputLines: string[][] = [];
// -----------------------------------------------------------------------
const microAverageMetrics: {
'averagePrecisionRecallF1Accuracy': number;
'truePositives': number;
'falsePositives': number;
'falseNegatives': number;
'total': number;
} = confusionMatrix.getMicroAverageMetrics([]);
const predictingConfusionMatrixOutputLineMicroAverage: any[] = [
Utility.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.
'N/A', // ---- Utility.round(microAverageMetrics.averagePrecisionRecallF1Accuracy), // ---- NOTE ---- in multi-class, there is no negative, so calculation of precision is equal to that of recall.
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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineMicroAverage);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMicroAverage,
Utility.DescriptionMicroAverage,
]);
// -----------------------------------------------------------------------
const microQuantileMetrics: {
'quantilesPrecisions': number[];
'quantilesRecalls': number[];
'quantilesF1Scores': number[];
'quantilesTruePositives': number[];
'quantilesFalsePositives': number[];
'quantilesTrueNegatives': number[];
'quantilesFalseNegatives': number[];
'quantilesAccuracies': number[];
'quantilesSupports': number[];
'total': number;
} = confusionMatrix.getMicroQuantileMetrics([], 4);
const predictingConfusionMatrixOutputLineMicroQuantile1: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineMicroQuantile1);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMicroFirstQuartile,
Utility.DescriptionMicroFirstQuartile,
]);
const predictingConfusionMatrixOutputLineMicroQuantile2: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineMicroQuantile2);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMicroMedian,
Utility.DescriptionMicroMedian,
]);
const predictingConfusionMatrixOutputLineMicroQuantile3: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineMicroQuantile3);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMicroThirdQuartile,
Utility.DescriptionMicroThirdQuartile,
]);
// -----------------------------------------------------------------------
const macroQuantileMetrics: {
'quantilesPrecisions': number[];
'quantilesRecalls': number[];
'quantilesF1Scores': number[];
'quantilesTruePositives': number[];
'quantilesFalsePositives': number[];
'quantilesTrueNegatives': number[];
'quantilesFalseNegatives': number[];
'quantilesAccuracies': number[];
'quantilesSupports': number[];
'total': number;
} = confusionMatrix.getMacroQuantileMetrics([], 4);
const predictingConfusionMatrixOutputLineMacroQuantile1: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineMacroQuantile1);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMacroFirstQuartile,
Utility.DescriptionMacroFirstQuartile,
]);
const predictingConfusionMatrixOutputLineMacroQuantile2: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineMacroQuantile2);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMacroMedian,
Utility.DescriptionMacroMedian,
]);
const predictingConfusionMatrixOutputLineMacroQuantile3: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineMacroQuantile3);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMacroThirdQuartile,
Utility.DescriptionMacroThirdQuartile,
]);
// -----------------------------------------------------------------------
const summationMicroAverageMetrics: {
'summationPrecision': number;
'summationRecall': number;
'summationF1Score': number;
'summationAccuracy': number;
'summationTruePositives': number;
'summationFalsePositives': number;
'summationTrueNegatives': number;
'summationFalseNegatives': number;
'summationSupport': number;
'total': number;
} = confusionMatrix.getSummationMicroAverageMetrics([]);
const predictingConfusionMatrixOutputLineSummationMicroAverage: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineSummationMicroAverage);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameSummationMicroAverage,
Utility.DescriptionSummationMicroAverage,
]);
// -----------------------------------------------------------------------
const macroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getMacroAverageMetrics([]);
const predictingConfusionMatrixOutputLineMacroAverage: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineMacroAverage);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMacroAverage,
Utility.DescriptionMacroAverage,
]);
// -----------------------------------------------------------------------
const summationMacroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getSummationMacroAverageMetrics([]);
const predictingConfusionMatrixOutputLineSummationMacroAverage: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineSummationMacroAverage);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameSummationMacroAverage,
Utility.DescriptionSummationMacroAverage,
]);
// -----------------------------------------------------------------------
const positiveSupportLabelMacroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getPositiveSupportLabelMacroAverageMetrics([]);
const predictingConfusionMatrixOutputLinePositiveSupportLabelMacroAverage: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLinePositiveSupportLabelMacroAverage);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNamePositiveSupportMacroAverage,
Utility.DescriptionPositiveSupportMacroAverage,
]);
// -----------------------------------------------------------------------
const positiveSupportLabelSummationMacroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getPositiveSupportLabelSummationMacroAverageMetrics([]);
const predictingConfusionMatrixOutputLinePositiveSupportLabelSummationMacroAverage: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLinePositiveSupportLabelSummationMacroAverage);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNamePositiveSupportSummationMacroAverage,
Utility.DescriptionPositiveSupportSummationMacroAverage,
]);
// -----------------------------------------------------------------------
const weightedMacroAverageMetrics: IConfusionMatrixMeanDerivedMetrics =
confusionMatrix.getWeightedMacroAverageMetrics([]);
const predictingConfusionMatrixOutputLineWeightedMacroAverage: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineWeightedMacroAverage);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameWeightedMacroAverage,
Utility.DescriptionWeightedMacroAverage,
]);
// -----------------------------------------------------------------------
const summationWeightedMacroAverageMetrics: IConfusionMatrixMeanMetrics =
confusionMatrix.getSummationWeightedMacroAverageMetrics([]);
const predictingConfusionMatrixOutputLineSummationWeightedMacroAverage: any[] = [
Utility.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,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineSummationWeightedMacroAverage);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameWeightedSummationMacroAverage,
Utility.DescriptionWeightedSummationMacroAverage,
]);
// -----------------------------------------------------------------------
const exactMacroAggregateMetrics: IConfusionMatrixMeanMetrics =
multiLabelObjectConfusionMatrixExact.getMacroAverageMetrics([]);
if (exactMacroAggregateMetrics.total > 0) {
const predictingConfusionMatrixOutputLineExactMacroAggregate: any[] = [
Utility.ColumnNameMultiLabelExactAggregate,
Utility.round(exactMacroAggregateMetrics.averagePrecision),
Utility.round(exactMacroAggregateMetrics.averageRecall),
Utility.getBolded(Utility.round(exactMacroAggregateMetrics.averageF1Score)),
Utility.getBolded(Utility.round(exactMacroAggregateMetrics.averageAccuracy)),
Utility.round(exactMacroAggregateMetrics.averageTruePositives),
Utility.round(exactMacroAggregateMetrics.averageFalsePositives),
Utility.round(exactMacroAggregateMetrics.averageTrueNegatives),
Utility.round(exactMacroAggregateMetrics.averageFalseNegatives),
Utility.round(exactMacroAggregateMetrics.averageSupport),
exactMacroAggregateMetrics.total,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineExactMacroAggregate);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMultiLabelExactAggregate,
Utility.DescriptionMultiLabelExactAggregate,
]);
}
// -----------------------------------------------------------------------
const subsetMacroAggregateMetrics: IConfusionMatrixMeanMetrics =
multiLabelObjectConfusionMatrixSubset.getMacroAverageMetrics([]);
if (subsetMacroAggregateMetrics.total > 0) {
const predictingConfusionMatrixOutputLineSubsetMacroAggregate: any[] = [
Utility.ColumnNameMultiLabelSubsetAggregate,
Utility.round(subsetMacroAggregateMetrics.averagePrecision),
Utility.round(subsetMacroAggregateMetrics.averageRecall),
Utility.getBolded(Utility.round(subsetMacroAggregateMetrics.averageF1Score)),
Utility.getBolded(Utility.round(subsetMacroAggregateMetrics.averageAccuracy)),
Utility.round(subsetMacroAggregateMetrics.averageTruePositives),
Utility.round(subsetMacroAggregateMetrics.averageFalsePositives),
Utility.round(subsetMacroAggregateMetrics.averageTrueNegatives),
Utility.round(subsetMacroAggregateMetrics.averageFalseNegatives),
Utility.round(subsetMacroAggregateMetrics.averageSupport),
subsetMacroAggregateMetrics.total,
];
predictingConfusionMatrixAverageOutputLines.push(predictingConfusionMatrixOutputLineSubsetMacroAggregate);
predictingConfusionMatrixAverageDescriptionOutputLines.push([
Utility.ColumnNameMultiLabelSubsetAggregate,
Utility.DescriptionMultiLabelSubsetAggregate,
]);
}
// -----------------------------------------------------------------------
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), confusionMatrix.getMicroAverageMetrics()= ${Utility.jsonStringify(confusionMatrix.getMicroAverageMetrics([]))}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), confusionMatrix.getMacroAverageMetrics()= ${Utility.jsonStringify(confusionMatrix.getMacroAverageMetrics([]))}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), confusionMatrix.getWeightedMacroAverageMetrics()= ${Utility.jsonStringify(confusionMatrix.getWeightedMacroAverageMetrics([]))}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixExact.getMicroAverageMetrics()= ${Utility.jsonStringify(multiLabelObjectConfusionMatrixExact.getMicroAverageMetrics([]))}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixExact.getMacroAverageMetrics()= ${Utility.jsonStringify(multiLabelObjectConfusionMatrixExact.getMacroAverageMetrics([]))}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixExact.getWeightedMacroAverageMetrics()= ${Utility.jsonStringify(multiLabelObjectConfusionMatrixExact.getWeightedMacroAverageMetrics([]))}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getTotal()= ${multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getTotal()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getTruePositives() =${multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getTruePositives()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getFalsePositives()=${multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getFalsePositives()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getTrueNegatives() =${multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getTrueNegatives()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getFalseNegatives()=${multiLabelObjectConfusionMatrixExact.getBinaryConfusionMatrix().getFalseNegatives()}`);
Utility.debuggingLog('Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), finished generating {MODEL_EVALUATION} content');
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixSubset.getMicroAverageMetrics()= ${Utility.jsonStringify(multiLabelObjectConfusionMatrixSubset.getMicroAverageMetrics([]))}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixSubset.getMacroAverageMetrics()= ${Utility.jsonStringify(multiLabelObjectConfusionMatrixSubset.getMacroAverageMetrics([]))}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixSubset.getWeightedMacroAverageMetrics()= ${Utility.jsonStringify(multiLabelObjectConfusionMatrixSubset.getWeightedMacroAverageMetrics([]))}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getTotal() =${multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getTotal()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getTruePositives() =${multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getTruePositives()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getFalsePositives()=${multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getFalsePositives()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getTrueNegatives() =${multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getTrueNegatives()}`);
Utility.debuggingLog(`Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getFalseNegatives()=${multiLabelObjectConfusionMatrixSubset.getBinaryConfusionMatrix().getFalseNegatives()}`);
Utility.debuggingLog('Utility.generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices(), finished generating {MODEL_EVALUATION} content');
// -----------------------------------------------------------------------
const confusionMatrixAverageMetricsHtml: string = Utility.convertDataArraysToIndexedHtmlTable(
'Average confusion matrix metrics',
predictingConfusionMatrixAverageOutputLines,
['Type', 'Precision', 'Recall', 'F1', 'Accuracy', '#TruePositives', '#FalsePositives', '#TrueNegatives', '#FalseNegatives', 'Support', 'Total']);
const confusionMatrixAverageDescriptionMetricsHtml: string = Utility.convertDataArraysToIndexedHtmlTable(
'Average confusion matrix metric descriptions',
predictingConfusionMatrixAverageDescriptionOutputLines,
['Type', 'Description']);
// -----------------------------------------------------------------------
return {
confusionMatrix,
multiLabelObjectConfusionMatrixExact,
multiLabelObjectConfusionMatrixSubset,
predictingConfusionMatrixOutputLines,
confusionMatrixMetricsHtml,
confusionMatrixAverageMetricsHtml,
confusionMatrixAverageDescriptionMetricsHtml};
// -----------------------------------------------------------------------
}