#MLNET – Cambios en la API con la nueva version 0.6.0

Buenas!

Hace unos días se libero la version 0.6.0 de Machine Learning .Net y una de las novedades mas importantes de la misma fue que la API de uso de ML.Net cambio de una forma muy importante. En mis sesiones siempre suelo comentar el escenario de predicción del Label de una persona para ver si es niño, bebe o adolescente de acuerdo con su edad y género. El set de datos con el que trabajo tiene la siguiente estructura

01 mlnet age range data

Como se puede ver en la imagen anterior, mi training data set posee las columnas Name, Age, Gender y Label. Pues bien, un detalle importante es que también necesito 2 clases con campos para representar las filas de mis trainings datasets y el resultado esperado.


public class AgeRangeData
{
[Column(ordinal: "0")]
public float AgeStart;
[Column(ordinal: "1")]
public float AgeEnd;
[Column(ordinal: "2", name: "Label")]
public string Label;
}
public class AgeRangePrediction
{
[ColumnName("PredictedLabel")]
public string PredictedLabels;
}

Hasta la version 0.5.0 de ML.Net la forma de trabajo se basaba en crear un pipeline con los siguientes pasos

  • Definir el modelo de datos y cargar los mismos
  • Definir las Features y Labels
  • Seleccionar un Trainer y entrenar el modelo

El modelo generado permitía realizar predicciones. El siguiente ejemplo lo explica en 20 líneas de código


static void Main(string[] args)
{
var fileName = "AgeRanges.csv";
var pipeline = new LearningPipeline();
pipeline.Add(new TextLoader(fileName).CreateFrom<AgeRange>(separator: ',', useHeader: true));
pipeline.Add(new Dictionarizer("Label"));
pipeline.Add(new ColumnConcatenator("Features", "Age"));
pipeline.Add(new StochasticDualCoordinateAscentClassifier());
pipeline.Add(new PredictedLabelColumnOriginalValueConverter {PredictedLabelColumn = "PredictedLabel" });
var model = pipeline.Train<AgeRange, AgeRangePrediction>();
Predict(model, "john", 9, "M");
Predict(model, "mary", 14, "M");
Predict(model, "laura", 2, "M");
Console.ReadLine();
}

Pues bien, con la version 0.6.0, la forma en la que se utiliza la API ha cambiado. Lo mejor en este punto es leer el post original de Cesar De la Torre donde explica las novedades de esta version (ver referencias). Sin embargo, creo que dejar un ejemplo del mismo código da una idea de lo flexible que es la nueva API


static void Main(string[] args)
{
var dataPath = "AgeRangeData.csv";
var env = new LocalEnvironment();
var reader = TextLoader.CreateReader(env, ctx => (
Age: ctx.LoadFloat(1),
Label: ctx.LoadText(3)),
separator: ',', hasHeader: true);
var trainData = reader.Read(new MultiFileSource(dataPath));
var classification = new MulticlassClassificationContext(env);
var learningPipeline = reader.MakeNewEstimator()
.Append(r => (
r.Label,
Predictions: classification.Trainers.Sdca
(label: r.Label.ToKey(),
features: r.Age.AsVector())))
.Append(r => r.Predictions.predictedLabel.ToValue());
var model = learningPipeline.Fit(trainData);
var predictionFunc = model.AsDynamic.MakePredictionFunction<AgeRangeNewApi, AgeRangePredictionNewApi>(env);
var example = new AgeRangeNewApi()
{
Age = 6,
Name = "John",
Gender = "M"
};
var prediction = predictionFunc.Predict(example);
Console.WriteLine("prediction: " + prediction.PredictedLabel);
Console.ReadLine();
}

Los cambios principales los podemos encontrar en

  • Líneas 5 a 9, carga del archivo inicial de datos para training
  • Líneas 11 a 18, definición de Features y label para el training
  • Línea 20, entrenamiento y creación del modelo
  • Línea 22, creación de una función para realizar predicciones
  • Líneas 24 a 32, ejemplo de una predicción

El ejemplo completo se puede ver aquí https://github.com/elbruno/Blog/tree/master/20181011%20MLNET%200.6%20NewAPI

Happy coding!

Saludos @ Toronto

El Bruno

References

My Posts

1 comment

Leave a comment

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: