{"record":{"id":"8941cde1f7a7b6e8","repo":"dotnet/machinelearning","slug":"validation-data-has-0-rows","errorCode":null,"errorMessage":"Validation data has 0 rows","messagePattern":"Validation data has 0 rows","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.ML.AutoML/Utils/UserInputValidationUtil.cs","lineNumber":193,"sourceCode":"                throw new ArgumentException($\"File '{path}' does not exist\", nameof(path));\n            }\n\n            if (fileInfo.Length == 0)\n            {\n                throw new ArgumentException($\"File at path '{path}' cannot be empty\", nameof(path));\n            }\n        }\n\n        private static void ValidateValidationData(IDataView trainData, IDataView validationData)\n        {\n            if (validationData == null)\n            {\n                return;\n            }\n\n            if (DatasetDimensionsUtil.IsDataViewEmpty(validationData))\n            {\n                throw new ArgumentException(\"Validation data has 0 rows\", nameof(validationData));\n            }\n\n            const string schemaMismatchError = \"Training data and validation data schemas do not match.\";\n\n            if (trainData.Schema.Count(c => !c.IsHidden) != validationData.Schema.Count(c => !c.IsHidden))\n            {\n                throw new ArgumentException($\"{schemaMismatchError} Train data has '{trainData.Schema.Count}' columns,\" +\n                    $\"and validation data has '{validationData.Schema.Count}' columns.\", nameof(validationData));\n            }\n\n            // Validate that every active column in the train data corresponds to an active column in the validation data.\n            // (Indirectly, since we asserted above that the train and validation data have the same number of active columns, this also\n            // ensures the reverse -- that every active column in the validation data corresponds to an active column in the train data.)\n            foreach (var trainCol in trainData.Schema)\n            {\n                if (trainCol.IsHidden)\n                {\n                    continue;","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.ML.AutoML/Utils/UserInputValidationUtil.cs#L175-L211","documentation":"When validation (or test) data is supplied to an AutoML experiment, ValidateValidationData rejects it if the IDataView has zero rows, detected via DatasetDimensionsUtil.IsDataViewEmpty. An empty validation set yields no meaningful evaluation metrics, so the experiment is refused.","triggerScenarios":"Calling Experiment API (ValidateExperimentExecuteArgs) with a validationData IDataView built from an empty source — e.g. an empty train/test split, a filtered DataView whose predicate matched nothing, or an empty file loaded via LoadFromTextFile.","commonSituations":"Over-aggressive filters (e.g. `where row > allRows`); split fraction or seed yielding an empty holdout on tiny datasets; reading an empty CSV as validation data.","solutions":["Check `data.GetRowCursor(...).MoveNext()` or row count before passing as validationData.","Reduce filter strictness or fix the split so the validation set has rows.","For small datasets, use cross-validation instead of an explicit validation set."],"exampleFix":"// before\nvar validationData = trainData.WhereFilter... // may be empty\ncontext.AutoML(experimentSettings)... .Execute(trainData, validationData, ...);\n// after\nvar rows = validationData.GetRowCursor(validationData.Schema).MoveNext();\nif (!rows) throw new ArgumentException(\"validation data is empty\");\nresult.Execute(trainData, validationData, ...);","handlingStrategy":"validation","validationCode":"using var cursor = validationData.GetRowCursor(validationData.Schema);\nbool hasRows = cursor.MoveNext();\nif (!hasRows) throw new ArgumentException(\"validationData is empty\");","typeGuard":"bool HasRows(IDataView data) => data.GetRowCursor(data.Schema).MoveNext();","tryCatchPattern":"try { result = experiment.Execute(trainData, validationData, columnInfo, settings); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"Validation data has 0 rows\")) { /* fall back to cross-validation */ }","preventionTips":["Assert validation split has rows before Execute","For small datasets use cross-validation instead of a holdout","Log row counts of all inputs before experiments"],"tags":["validation","idataview","automl"],"backgroundTag":"empty-required-field","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}