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
- Increase the dataset size or reduce numberOfCVFolds so each fold has rows.
- Check sampling/grouping key columns aren't skewing splits.
- 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
- Check row count vs fold count before splitting
- Lower folds for small datasets
- Verify sampling key columns don't create empty groups
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
- A PrimitiveDataViewType cannot have a disposable RawType
- Activation function not supported.
- argument should not be null.
- Cannot read the file Merge file.
- Cannot read the file Merge file.
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)