public static generateAssessmentConfusionMatrixMetricsAndHtmlTableWithConfusionMatrices()

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};
    // -----------------------------------------------------------------------
  }