{"record":{"id":"0aa7e8d4e3891d77","repo":"dotnet/machinelearning","slug":"nameof-numberofcvfolds-must-be-at-least-2","errorCode":null,"errorMessage":"{nameof(numberOfCVFolds)} must be at least 2","messagePattern":"(.+?) must be at least 2","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.ML.AutoML/Utils/UserInputValidationUtil.cs","lineNumber":57,"sourceCode":"            ValidatePath(path);\n        }\n\n        public static void ValidateInferColumnsArgs(string path, string labelColumn)\n        {\n            ValidateLabelColumn(labelColumn);\n            ValidatePath(path);\n        }\n\n        public static void ValidateInferColumnsArgs(string path)\n        {\n            ValidatePath(path);\n        }\n\n        public static void ValidateNumberOfCVFoldsArg(uint numberOfCVFolds)\n        {\n            if (numberOfCVFolds <= 1)\n            {\n                throw new ArgumentException($\"{nameof(numberOfCVFolds)} must be at least 2\", nameof(numberOfCVFolds));\n            }\n        }\n\n        public static void ValidateSamplingKey(string samplingKeyColumnName, string groupIdColumnName, TaskKind task)\n        {\n            if (task == TaskKind.Ranking && samplingKeyColumnName != null && samplingKeyColumnName != groupIdColumnName)\n            {\n                throw new ArgumentException($\"If provided, {nameof(samplingKeyColumnName)} must be the same as {nameof(groupIdColumnName)} for Ranking Experiments\", samplingKeyColumnName);\n            }\n        }\n\n        private static void ValidateTrainData(IDataView trainData, ColumnInformation columnInformation)\n        {\n            if (trainData == null)\n            {\n                throw new ArgumentNullException(nameof(trainData), \"Training data cannot be null\");\n            }\n","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.ML.AutoML/Utils/UserInputValidationUtil.cs#L39-L75","documentation":"UserInputValidationUtil.ValidateNumberOfCVFoldsArg rejects cross-validation fold counts below 2 with ArgumentException naming the parameter — cross-validation requires at least a train/test split, so 0 or 1 folds is meaningless.","triggerScenarios":"Calling an AutoML experiment API (e.g. CreateExperiment/Execute with cross-validation) passing numberOfCVFolds = 0 or 1, typically from user-supplied settings or config defaults.","commonSituations":"Users configuring fold counts from app settings that default to 0/1; off-by-one when interpreting 'number of validation runs'; UI inputs allowing 1.","solutions":["Pass numberOfCVFolds >= 2 (call ValidateNumberOfCVFoldsArg early to fail fast).","Clamp user/config-supplied fold values to Math.Max(2, value) before calling the API.","Use non-cross-validation execution (train/validation split) if only one split is desired."],"exampleFix":"// before\nexperimentSettings.NumberOfCVFolds = 1;\n// after\nexperimentSettings.NumberOfCVFolds = Math.Max(2, userConfiguredFolds);","handlingStrategy":"validation","validationCode":"if (numberOfCVFolds < 2)\n    throw new ArgumentException(nameof(numberOfCVFolds), \"Must be at least 2\");\nUserInputValidationUtil.ValidateNumberOfCVFoldsArg(numberOfCVFolds);","typeGuard":"bool IsValidCvFolds(uint folds) => folds >= 2;","tryCatchPattern":"try { UserInputValidationUtil.ValidateNumberOfCVFoldsArg(folds); }\ncatch (ArgumentException ex) { folds = 5; logger.LogWarning(ex.Message + \"; defaulting to 5\"); }","preventionTips":["Clamp config/UI-supplied fold counts to >= 2","Call UserInputValidationUtil early in pipelines","Document that 1 fold is invalid for cross-validation"],"tags":["csharp","validation","arguments"],"backgroundTag":"argument-out-of-range","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}