1
0
Files
TestMicrosoftML/testML/Program.cs

125 lines
3.2 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)
{
var tmpData = new List<Data>();
for (var c = 0; c < 1000; 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<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);
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;
}
}
}