public static void Main()
var mlContext = new MLContext();
var dataset = mlContext.Data.LoadFromTextFile<ModelInput>(WriteDataset(numRows: 100), hasHeader: false);
var split = mlContext.Data.TrainTestSplit(dataset, testFraction: 0.3);
Console.WriteLine("Binary PriorPredictor...");
var baselineBinaryPipeline = mlContext.BinaryClassification.Trainers.Prior(labelColumnName: "Label");
var binaryModel = baselineBinaryPipeline.Fit(split.TrainSet);
var binaryPredictions = binaryModel.Transform(split.TestSet);
var baselineBinaryMetrics = mlContext.BinaryClassification.Evaluate(binaryPredictions, "Label", "Score");
PrintMetrics(baselineBinaryMetrics);
Console.WriteLine("\nMulticlass OVA-AveragedPerceptron...");
var ovaAveragedPerceptronPipeline = mlContext.Transforms.Conversion.MapValueToKey("Label", "Label")
.Append(mlContext.MulticlassClassification.Trainers.OneVersusAll(mlContext.BinaryClassification.Trainers.AveragedPerceptron(labelColumnName: "Label", featureColumnName: "Features"), labelColumnName: "Label"));
var ovaAveragedPerceptronModel = ovaAveragedPerceptronPipeline.Fit(split.TrainSet);
var ovaAveragedPerceptronPredictions = ovaAveragedPerceptronModel.Transform(split.TestSet);
var ovaAveragedPerceptronMulticlassMetrics = mlContext.MulticlassClassification.Evaluate(ovaAveragedPerceptronPredictions, "Label", "Score");
PrintMetrics(ovaAveragedPerceptronMulticlassMetrics);
Console.WriteLine("\nMulticlass OVA-PriorPredictor...");
var baselineMulticlassPipeline = mlContext.Transforms.Conversion.MapValueToKey("Label", "Label")
.Append(mlContext.MulticlassClassification.Trainers.OneVersusAll(mlContext.BinaryClassification.Trainers.Prior(labelColumnName: "Label"), labelColumnName: "Label"));
var multiclassModel = baselineMulticlassPipeline.Fit(split.TrainSet);
var multiclassPredictions = multiclassModel.Transform(split.TestSet);
var baselineMulticlassMetrics = mlContext.MulticlassClassification.Evaluate(multiclassPredictions, "Label", "Score");
PrintMetrics(baselineMulticlassMetrics);
private static void PrintMetrics<T>(T metrics) {
var options = new JsonSerializerOptions(){ WriteIndented = false };
var jsonString = JsonSerializer.Serialize(metrics, options);
Console.WriteLine(jsonString);
private static string WriteDataset(long numRows)
var random = new Random();
var dataDirectoryName = "DataDir";
Directory.CreateDirectory(dataDirectoryName);
var fileName = Path.Combine(dataDirectoryName, $"Data.csv");
using (var fs = File.CreateText(fileName))
for (int line = 0; line < numRows; line++)
var sb = new StringBuilder();
sb.Append(random.NextDouble() > 0.5 ? "true" : "false");
for (int i = 1; i <= 10; i++)
sb.Append($"\t{random.NextDouble()}");
fs.WriteLine(sb.ToString());
[ColumnName("Label"), LoadColumn(0)]
public bool Label { get; set; }
[ColumnName("Features"), LoadColumn(1, 10)]
public float Features { get; set; }