dotnet/machinelearning · error · InvalidOperationException

All cross validation folds have empty train or test data…

Error message

All cross validation folds have empty train or test data. Try increasing the number of rows provided in training data, or lowering specified number of cross validation folds.

What it means

CrossValSplit produces train/test datasets per fold; if no fold yields a non-empty train set (trainDatasets list is empty after the loop) it throws InvalidOperationException advising to add rows or lower the fold count.

Solutions

  1. Increase the dataset size or reduce numberOfCVFolds so each fold has rows.
  2. Check sampling/grouping key columns aren't skewing splits.
  3. Validate row count >= folds before calling CrossValSplit.

Example fix

// before
var (train, test) = SplitUtil.CrossValSplit(context, tinyData, 10);
// after
uint folds = Math.Min(10, (uint)rowCount);
var (train, test) = SplitUtil.CrossValSplit(context, data, folds);
Defensive patterns

Strategy: validation

Validate before calling

long rows = mlContext.Data.CreateEnumerable<Row>(data, reuseRowObject: false).Count(); // or schema/row cursor count
if (rows < numberOfCVFolds) throw new ArgumentException("Rows must be >= CV folds");

Try / catch

try { var (train, test) = SplitUtil.CrossValSplit(ctx, data, folds); }
catch (InvalidOperationException ex) { logger.LogError(ex, "Cross-val produced no usable folds"); throw; }

Prevention

When it happens

Trigger: Calling CrossValSplit (via cross-validation AutoML experiments) with a dataset whose row count is smaller than the number of requested folds, so every fold ends up with an empty split and is skipped.

Common situations: Very small datasets (e.g. 10 rows with 10+ folds), sampling/stratification key columns producing empty groups, or passing empty IDataViews.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


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

Appendix: source

Thrown at src/Microsoft.ML.AutoML/Utils/SplitUtil.cs:38

            foreach (var split in splits)
            {
                if (DatasetDimensionsUtil.IsDataViewEmpty(split.TrainSet) ||
                    DatasetDimensionsUtil.IsDataViewEmpty(split.TestSet))
                {
                    continue;
                }

                var trainDataset = DropAllColumnsExcept(context, split.TrainSet, originalColumnNames);
                var validationDataset = DropAllColumnsExcept(context, split.TestSet, originalColumnNames);

                trainDatasets.Add(trainDataset);
                validationDatasets.Add(validationDataset);
            }

            if (!trainDatasets.Any())
            {
                throw new InvalidOperationException("All cross validation folds have empty train or test data. " +
                    "Try increasing the number of rows provided in training data, or lowering specified number of " +
                    "cross validation folds.");
            }

            return (trainDatasets.ToArray(), validationDatasets.ToArray());
        }

        /// <summary>
        /// Split the data into a single train/test split.
        /// </summary>
        public static (IDataView trainData, IDataView validationData) TrainValidateSplit(MLContext context, IDataView trainData,
            string samplingKeyColumn)
        {
            var originalColumnNames = trainData.Schema.Select(c => c.Name);
            var splitData = context.Data.TrainTestSplit(trainData, samplingKeyColumnName: samplingKeyColumn);
            trainData = DropAllColumnsExcept(context, splitData.TrainSet, originalColumnNames);
            var validationData = DropAllColumnsExcept(context, splitData.TestSet, originalColumnNames);
            return (trainData, validationData);

View on GitHub (pinned to 7b76e69cf9)