{"record":{"id":"dec9b7bb2fe52b06","repo":"dotnet/machinelearning","slug":"all-cross-validation-folds-have-empty-train-or-tes","errorCode":null,"errorMessage":"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.","messagePattern":"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\\.","errorType":"validation","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.ML.AutoML/Utils/SplitUtil.cs","lineNumber":38,"sourceCode":"\n            foreach (var split in splits)\n            {\n                if (DatasetDimensionsUtil.IsDataViewEmpty(split.TrainSet) ||\n                    DatasetDimensionsUtil.IsDataViewEmpty(split.TestSet))\n                {\n                    continue;\n                }\n\n                var trainDataset = DropAllColumnsExcept(context, split.TrainSet, originalColumnNames);\n                var validationDataset = DropAllColumnsExcept(context, split.TestSet, originalColumnNames);\n\n                trainDatasets.Add(trainDataset);\n                validationDatasets.Add(validationDataset);\n            }\n\n            if (!trainDatasets.Any())\n            {\n                throw new InvalidOperationException(\"All cross validation folds have empty train or test data. \" +\n                    \"Try increasing the number of rows provided in training data, or lowering specified number of \" +\n                    \"cross validation folds.\");\n            }\n\n            return (trainDatasets.ToArray(), validationDatasets.ToArray());\n        }\n\n        /// <summary>\n        /// Split the data into a single train/test split.\n        /// </summary>\n        public static (IDataView trainData, IDataView validationData) TrainValidateSplit(MLContext context, IDataView trainData,\n            string samplingKeyColumn)\n        {\n            var originalColumnNames = trainData.Schema.Select(c => c.Name);\n            var splitData = context.Data.TrainTestSplit(trainData, samplingKeyColumnName: samplingKeyColumn);\n            trainData = DropAllColumnsExcept(context, splitData.TrainSet, originalColumnNames);\n            var validationData = DropAllColumnsExcept(context, splitData.TestSet, originalColumnNames);\n            return (trainData, validationData);","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.ML.AutoML/Utils/SplitUtil.cs#L20-L56","documentation":"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.","triggerScenarios":"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.","commonSituations":"Very small datasets (e.g. 10 rows with 10+ folds), sampling/stratification key columns producing empty groups, or passing empty IDataViews.","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."],"exampleFix":"// before\nvar (train, test) = SplitUtil.CrossValSplit(context, tinyData, 10);\n// after\nuint folds = Math.Min(10, (uint)rowCount);\nvar (train, test) = SplitUtil.CrossValSplit(context, data, folds);","handlingStrategy":"validation","validationCode":"long rows = mlContext.Data.CreateEnumerable<Row>(data, reuseRowObject: false).Count(); // or schema/row cursor count\nif (rows < numberOfCVFolds) throw new ArgumentException(\"Rows must be >= CV folds\");","typeGuard":null,"tryCatchPattern":"try { var (train, test) = SplitUtil.CrossValSplit(ctx, data, folds); }\ncatch (InvalidOperationException ex) { logger.LogError(ex, \"Cross-val produced no usable folds\"); throw; }","preventionTips":["Check row count vs fold count before splitting","Lower folds for small datasets","Verify sampling key columns don't create empty groups"],"tags":["csharp","cross-validation","data"],"backgroundTag":"empty-result-set","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}