using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Trainers; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace testML { internal class Program { static string[] tags = new string[] { "Rojo", "Amarillo", "Verde claro", "Verde oscuro", "Violeta", "Naranja", "Azul", "Blanco" }; static Random rnd = new Random(); static void Main(string[] args) { #region Preparamos los datos de entrenamiento var tmpData = new List(); for (var c = 0; c < 100000; c++) { var d = CreateRandomData(); tmpData.Add(d); } #endregion MLContext mlContext = new MLContext(); var data = mlContext.Data.LoadFromEnumerable(tmpData); #region Cortamos los datos de entrenamiento en (Datos para entenar y Datos para hacer el test de precisión) DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.1); IDataView trainData = dataSplit.TrainSet; IDataView testData = dataSplit.TestSet; #endregion #region Preparamos los datos de entrada y salida var trainer = mlContext.Regression.Trainers.Sdca(maximumNumberOfIterations:1000); //var trainer = mlContext.Regression.Trainers.OnlineGradientDescent(numberOfIterations: 100, learningRate: 0.01f ); var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "IntegerNumber") //.Append(mlContext.Transforms.Text.NormalizeText("StringTest")) //.Append(mlContext.Transforms.Text.FeaturizeText("StringTest")) .Append(mlContext.Transforms.Concatenate("Features", "Enum1", "Enum2", "Enum3", "Enum4")) .Append(mlContext.Transforms.NormalizeMinMax("Features")) .Append(trainer); #endregion //Entrenamos el modelo ITransformer model = pipeline.Fit(trainData); #region Hacemos un test para medir el % de error // Use trained model to make inferences on test data IDataView testDataPredictions = model.Transform(testData); // Extract model metrics and get RSquared RegressionMetrics trainedModelMetrics = mlContext.Regression.Evaluate(testDataPredictions); double rSquared = trainedModelMetrics.RSquared; Console.WriteLine("ModelMetrics: {0}", rSquared); #endregion #region Ponemos a prueba haciendo algunas predicciones var predictionFunction = mlContext.Model.CreatePredictionEngine(model); for (var c = 0; c < 1000; c++) { var test = CreateRandomData(); var expected = test.IntegerNumber; test.IntegerNumber = 0; var p = predictionFunction.Predict(test); //p.IntegerNumber = (float)Math.Round(p.IntegerNumber); Console.WriteLine("{4} {3}, Found: {0:#,##0.00}\tExpected: {1:#,##0.00}\t\tDiff: {2:#,##0.00}", p.IntegerNumber, expected , expected- p.IntegerNumber, test.Enum4, test.Enum2); } #endregion Console.WriteLine(); Console.WriteLine("Press enter to Exit"); Console.ReadLine(); } private static Data CreateRandomData() { var d = new Data() { Accession = rnd.Next(0, 99999999).ToString("00000000"), Enum1 = rnd.Next(1, 4), Enum2 = rnd.Next(1, 11), Enum3 = rnd.Next(1, 6), Enum4 = rnd.Next(1, 4), StringTest = tags[rnd.Next(0, tags.Length)] }; switch (d.Enum4) { case 1: d.IntegerNumber = 1; break; case 2: d.IntegerNumber = rnd.NextDouble() > 0.5 ? 1 : 0; break; case 3: d.IntegerNumber = 0; break; } return d; } } }