125 lines
3.2 KiB
C#
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 < 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<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;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|