private static void CreateCountryModel(MLContext mlContext, string dataPath, string outputModelPath) { ConsoleExtensions.ConsoleWriteHeader("Training country forecasting model"); var trainindDataView = mlContext.Data.LoadFromTextFile <CountryData>(path: dataPath, hasHeader: true, separatorChar: ','); var trainer = mlContext.Regression.Trainers.FastTreeTweedie("Label", "Features", learningRate: 0.2); var trainingPipeline = mlContext.Transforms.Concatenate(outputColumnName: "NumFeatures", nameof(CountryData.year), nameof(CountryData.month), nameof(CountryData.max), nameof(CountryData.min), nameof(CountryData.std), nameof(CountryData.count), nameof(CountryData.sales), nameof(CountryData.med), nameof(CountryData.prev)) .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "CatFeatures", inputColumnName: nameof(CountryData.country))) .Append(mlContext.Transforms.Concatenate(outputColumnName: "Features", "NumFeatures", "CatFeatures")) .Append(mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: nameof(CountryData.next))) .Append(trainer); // Cross-Validate with single dataset (since we don't have two datasets, one for training and for evaluate) // in order to evaluate and get the model's accuracy metrics Console.WriteLine("=============== Cross-validating to get model's accuracy metrics ==============="); var crossValidationResults = mlContext.Regression.CrossValidate(data: trainindDataView, estimator: trainingPipeline, numberOfFolds: 6, labelColumnName: "Label"); ConsoleExtensions.PrintRegressionFoldsAverageMetrics(trainer.ToString(), crossValidationResults); // Create and Train the model var model = trainingPipeline.Fit(trainindDataView); //Save model mlContext.Model.Save(model, trainindDataView.Schema, outputModelPath); }