1
0
Files
TestMicrosoftML/testML/Program.cs

131 lines
3.5 KiB
C#

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<Data>();
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<Data, DataPrediction>(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;
}
}
}