dotnet/machinelearning · error · NotImplementedException

{metric} is not supported!

Error message

{metric} is not supported!

What it means

GetMetric in MulticlassClassificationExperiment maps a MulticlassClassificationMetric enum value to the corresponding field of the evaluated metrics. Enum values not listed in the switch (MacroAccuracy, MicroAccuracy, LogLoss, LogLossReduction, TopKAccuracy are handled) hit the default arm and throw NotImplementedException.

Source

Thrown at src/Microsoft.ML.AutoML/API/MulticlassClassificationExperiment.cs:457

            {
                throw new OperationCanceledException(ex.Message, ex.InnerException);
            }
            catch (Exception)
            {
                throw;
            }
        }

        private double GetMetric(MulticlassClassificationMetric metric, MulticlassClassificationMetrics metrics)
        {
            return metric switch
            {
                MulticlassClassificationMetric.MacroAccuracy => metrics.MacroAccuracy,
                MulticlassClassificationMetric.MicroAccuracy => metrics.MicroAccuracy,
                MulticlassClassificationMetric.LogLoss => metrics.LogLoss,
                MulticlassClassificationMetric.LogLossReduction => metrics.LogLossReduction,
                MulticlassClassificationMetric.TopKAccuracy => metrics.TopKAccuracy,
                _ => throw new NotImplementedException($"{metric} is not supported!"),
            };
        }

        public void Dispose()
        {
            _context.CancelExecution();
            _context = null;
        }
    }
}

View on GitHub (pinned to 7b76e69cf9)

Solutions

  1. Restrict configured metrics to MacroAccuracy, MicroAccuracy, LogLoss, LogLossReduction, or TopKAccuracy.
  2. Whitelist/validate the metric enum value before running the experiment.
  3. Add a new switch arm in MulticlassClassificationExperiment.GetMetric if the metric must be supported.

Example fix

// before
var value = GetMetric(MulticlassClassificationMetric.TopKAccuracyForAllK); // throws
// after
if (metric is MulticlassClassificationMetric.MacroAccuracy or MulticlassClassificationMetric.MicroAccuracy
    or MulticlassClassificationMetric.LogLoss or MulticlassClassificationMetric.LogLossReduction
    or MulticlassClassificationMetric.TopKAccuracy)
{
    var value = GetMetric(metric);
}
Defensive patterns

Strategy: validation

Validate before calling

private static readonly MulticlassClassificationMetric[] SupportedMetrics =
{
    MulticlassClassificationMetric.MacroAccuracy,
    MulticlassClassificationMetric.MicroAccuracy,
    MulticlassClassificationMetric.LogLoss,
    MulticlassClassificationMetric.LogLossReduction,
    MulticlassClassificationMetric.TopKAccuracy
};
// before running:
if (!SupportedMetrics.Contains(metric)) throw new ArgumentException($"Metric {metric} not supported");

Type guard

bool IsSupported(MulticlassClassificationMetric m) => m is MulticlassClassificationMetric.MacroAccuracy or MulticlassClassificationMetric.MicroAccuracy or MulticlassClassificationMetric.LogLoss or MulticlassClassificationMetric.LogLossReduction or MulticlassClassificationMetric.TopKAccuracy;

Try / catch

try { var value = GetMetric(metric); }
catch (NotImplementedException) { metric = MulticlassClassificationMetric.MicroAccuracy; // safe default
    var value = GetMetric(metric); }

Prevention

When it happens

Trigger: Resolving a MulticlassClassificationMetric through this experiment's GetMetric with any enum member outside the five mapped ones (e.g. a newly added or extended metric enum value).

Common situations: Using a metric value valid in other ML.NET evaluation APIs but not wired into this AutoML mapping; enum additions in newer package versions not reflected in the switch; configuration files listing metric names converted to enum without validation.

Related errors


AI-assisted analysis of dotnet/machinelearning@7b76e69cf9 (2026-09-11). Data as JSON: /api/errors/4a973c80aacb8020. Report an issue: GitHub.