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) { var tmpData = new List(); for (var c = 0; c < 300; c++) { var d = CreateRandomData(); tmpData.Add(d); } MLContext mlContext = new MLContext(); var data = mlContext.Data.LoadFromEnumerable(tmpData); DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2); IDataView trainData = dataSplit.TrainSet; IDataView testData = dataSplit.TestSet; 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", "StringTest")) .Append(mlContext.Transforms.NormalizeMinMax("Features")) .Append(trainer); ITransformer model = pipeline.Fit(trainData); // 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); 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); Console.WriteLine("Found: {0:#,##0.00}\tExpected: {1:#,##0.00}\t\tDiff: {2:#,##0.00}", p.IntegerNumber, expected , expected- p.IntegerNumber); } } 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, 6), StringTest = tags[rnd.Next(0, tags.Length)] }; // Ponemos algunos datos que tengan alguna relación (la red neuronal debería calibrarse para comprender esta formula) d.IntegerNumber = (((d.Enum1 + d.Enum2) - (d.Enum3 + d.Enum4)) * 5.25f) + d.StringTest.Length; d.DecimalNumber = (d.Enum2 / d.Enum1) * (2.0f + (1.0f / d.StringTest.Length)); if (d.StringTest == "Azul") { d.IntegerNumber += 10; d.OrigenResultNumber = 1; } if (d.StringTest == "Rojo") { d.IntegerNumber += 5f; d.OrigenResultNumber = 1; } return d; } } }