¿Qué es ML.NET y cómo funciona?
ML.NET ofrece la capacidad de agregar aprendizaje automático a aplicaciones .NET, en escenarios en línea o sin conexión. Con esta funcionalidad, puede realizar predicciones automáticas mediante los datos disponibles para la aplicación. Las aplicaciones de aprendizaje automático usan patrones en los datos para realizar predicciones en lugar de tener que programarse explícitamente.
Fundamental en ML.NET es un modelo de aprendizaje automático . El modelo especifica los pasos necesarios para transformar los datos de entrada en una predicción. Con ML.NET, puede entrenar un modelo personalizado especificando un algoritmo o puede importar modelos de TensorFlow y Open Neural Network Exchange (ONNX) previamente entrenados.
Una vez que tenga un modelo, puede agregarlo a la aplicación para realizar las predicciones.
ML.NET se ejecuta en Windows, Linux y macOS mediante .NET o en Windows mediante .NET Framework. Se admiten 64 bits en todas las plataformas. Se admiten 32 bits en Windows, excepto la funcionalidad relacionada con TensorFlow, LightGBM y ONNX.
En la tabla siguiente se muestran ejemplos del tipo de predicciones que puede realizar con ML.NET.
Tipo de predicción | Ejemplo |
---|---|
Clasificación/Categorización | Divida automáticamente los comentarios de los clientes en categorías positivas y negativas. |
Regresión/predicción de valores continuos | Predecir el precio de las casas en función del tamaño y la ubicación. |
Detección de anomalías | Detectar transacciones bancarias fraudulentas. |
Recomendaciones | Sugerir productos que los compradores en línea podrían querer comprar, en función de sus compras anteriores. |
Series temporales o datos secuenciales | Previsión del tiempo o ventas de productos. |
Clasificación de imágenes | Clasificar las patologías en imágenes médicas. |
Clasificación de texto | Clasificar documentos en función de su contenido. |
Similitud de oraciones | Mida la similitud de dos oraciones. |
Aplicación de ML.NET sencilla
El código del fragmento de código siguiente muestra la aplicación ML.NET más sencilla. En este ejemplo se crea un modelo de regresión lineal para predecir los precios de las casas mediante los datos de tamaño y precio de las casas.
using Microsoft.ML;
using Microsoft.ML.Data;
class Program
{
public record HouseData
{
public float Size { get; set; }
public float Price { get; set; }
}
public record Prediction
{
[ColumnName("Score")]
public float Price { get; set; }
}
static void Main(string[] args)
{
MLContext mlContext = new();
// 1. Import or create training data.
HouseData[] houseData = [
new() { Size = 1.1F, Price = 1.2F },
new() { Size = 1.9F, Price = 2.3F },
new() { Size = 2.8F, Price = 3.0F },
new() { Size = 3.4F, Price = 3.7F }
];
IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);
// 2. Specify data preparation and model training pipeline.
EstimatorChain<RegressionPredictionTransformer<Microsoft.ML.Trainers.LinearRegressionModelParameters>> pipeline = mlContext.Transforms.Concatenate("Features", ["Size"])
.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));
// 3. Train model.
TransformerChain<RegressionPredictionTransformer<Microsoft.ML.Trainers.LinearRegressionModelParameters>> model = pipeline.Fit(trainingData);
// 4. Make a prediction.
HouseData size = new() { Size = 2.5F };
Prediction price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);
Console.WriteLine($"Predicted price for size: {size.Size * 1000} sq ft = {price.Price * 100:C}k");
// Predicted price for size: 2500 sq ft = $261.98k
}
}
Flujo de trabajo de código
En el diagrama siguiente se representa la estructura del código de la aplicación y el proceso iterativo del desarrollo del modelo:
- Recopilación y carga de datos de entrenamiento en un objeto de IDataView
- Especificación de una canalización de operaciones para extraer características y aplicar un algoritmo de aprendizaje automático
- Entrenar un modelo mediante una llamada a Fit(IDataView) en la canalización
- Evaluar el modelo e iterar para mejorar
- Guardar el modelo en formato binario, para su uso en una aplicación
- Volver a cargar el modelo en un objeto de ITransformer
- Realizar predicciones llamando a PredictionEngineBase<TSrc,TDst>.Predict
Vamos a profundizar un poco más en esos conceptos.
Modelo de Machine Learning
Un modelo ML.NET es un objeto que contiene transformaciones que se van a realizar en los datos de entrada para llegar a la salida prevista.
Básico
El modelo más básico es la regresión lineal bidimensional, donde una cantidad continua es proporcional a otra, como se muestra anteriormente en el ejemplo de precios de la vivienda.
El modelo es simplemente: $Price = b + Tamaño * w$. Los parámetros $b$ y $w$ se calculan ajustando una línea en un conjunto de pares (tamaño, precio). Los datos usados para buscar los parámetros del modelo se denominan datos de entrenamiento. Las entradas de un modelo de aprendizaje automático se denominan características de . En este ejemplo, $Size$ es la única característica. Los valores de verdad básica que se usan para entrenar un modelo de aprendizaje automático se denominan etiquetas . En este caso, los valores de $Precio$ en el conjunto de datos de entrenamiento son las etiquetas.
Más complejo
Un modelo más complejo clasifica las transacciones financieras en categorías mediante la descripción del texto de la transacción.
Cada descripción de transacción se divide en un conjunto de características quitando palabras y caracteres redundantes, y contando combinaciones de palabras y caracteres. El conjunto de características se usa para entrenar un modelo lineal basado en el conjunto de categorías de los datos de entrenamiento. Cuanto más similar sea una nueva descripción a las del conjunto de entrenamiento, más probable será que se asigne a la misma categoría.
Tanto el modelo de precios de la vivienda como el modelo de clasificación de texto son modelos lineales. Según la naturaleza de los datos y el problema que se va a resolver, también puede usar modelos de árbol de decisión y modelos aditivos generalizados, entre otros. Puede obtener más información sobre los modelos de Tasks.
Preparación de datos
En la mayoría de los casos, los datos que tiene disponibles no son adecuados para usarse directamente para entrenar un modelo de aprendizaje automático. Los datos sin procesar deben estar preparados o preprocesados para poder usarlos para buscar los parámetros del modelo. Es posible que los datos deban convertirse de valores de cadena a una representación numérica. Es posible que tenga información redundante en los datos de entrada. Es posible que tenga que reducir o expandir las dimensiones de los datos de entrada. Es posible que los datos deban normalizarse o escalarse.
Los tutoriales de ML.NET le enseñan sobre diferentes canalizaciones de procesamiento de datos para datos de texto, imagen, numéricos y series temporales usados para tareas específicas de aprendizaje automático.
Cómo preparar los datos muestra cómo aplicar la preparación de datos de forma más general.
Puede encontrar un apéndice de todas las transformaciones disponibles en la sección de recursos.
Evaluación del modelo
Una vez que haya entrenado el modelo, ¿cómo sabe qué tan bien hará predicciones futuras? Con ML.NET, puede evaluar el modelo con algunos datos de prueba nuevos.
Cada tipo de tarea de aprendizaje automático tiene métricas usadas para evaluar la precisión y precisión del modelo en el conjunto de datos de prueba.
El ejemplo del precio de la vivienda mostrado anteriormente usó la tarea de regresión . Para evaluar el modelo, agregue el código siguiente al ejemplo original.
HouseData[] testHouseData =
{
new HouseData() { Size = 1.1F, Price = 0.98F },
new HouseData() { Size = 1.9F, Price = 2.1F },
new HouseData() { Size = 2.8F, Price = 2.9F },
new HouseData() { Size = 3.4F, Price = 3.6F }
};
var testHouseDataView = mlContext.Data.LoadFromEnumerable(testHouseData);
var testPriceDataView = model.Transform(testHouseDataView);
var metrics = mlContext.Regression.Evaluate(testPriceDataView, labelColumnName: "Price");
Console.WriteLine($"R^2: {metrics.RSquared:0.##}");
Console.WriteLine($"RMS error: {metrics.RootMeanSquaredError:0.##}");
// R^2: 0.96
// RMS error: 0.19
Las métricas de evaluación indican que el error es bajo y que la correlación entre la salida prevista y la salida de prueba es alta. ¡Eso fue fácil! En ejemplos reales, se necesita más optimización para lograr buenas métricas del modelo.
arquitectura de ML.NET
En esta sección se describen los patrones arquitectónicos de ML.NET. Si es un desarrollador de .NET experimentado, algunos de estos patrones le resultarán familiares y algunos serán menos conocidos.
Una aplicación ML.NET comienza con un objeto MLContext. Este objeto singleton contiene catálogos. Un catálogo es una fábrica para cargar y guardar datos, transformaciones, instructores y componentes de la operación de modelos. Cada objeto de catálogo tiene métodos para crear los distintos tipos de componentes.
Tarea | Catálogo |
---|---|
Carga y guardado de datos | DataOperationsCatalog |
Preparación de datos | TransformsCatalog |
Clasificación binaria | BinaryClassificationCatalog |
Clasificación multiclase | MulticlassClassificationCatalog |
Detección de anomalías | AnomalyDetectionCatalog |
Agrupamiento | ClusteringCatalog |
Previsión | ForecastingCatalog |
Clasificación | RankingCatalog |
Regresión | RegressionCatalog |
Recomendación | RecommendationCatalog |
Serie temporal | TimeSeriesCatalog |
Uso del modelo | ModelOperationsCatalog |
Puede ir a los métodos de creación en cada una de las categorías enumeradas. Si usa Visual Studio, los catálogos también se muestran a través de IntelliSense.
Crear la canalización
Dentro de cada catálogo hay un conjunto de métodos de extensión que puede usar para crear una canalización de entrenamiento.
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));
En el fragmento de código, Concatenate
y Sdca
son métodos en el catálogo. Cada uno crea un objeto IEstimator que se anexa a la canalización.
En este momento, se han creado los objetos, pero no se ha producido ninguna ejecución.
Entrenamiento del modelo
Una vez creados los objetos de la canalización, los datos se pueden usar para entrenar el modelo.
var model = pipeline.Fit(trainingData);
Al llamar a Fit()
se usan los datos de entrenamiento de entrada para calcular los parámetros del modelo. Esto se conoce como entrenamiento del modelo. Recuerde que el modelo de regresión lineal mostrado anteriormente tenía dos parámetros de modelo: de sesgo y peso. Después de la llamada Fit()
, se conocen los valores de los parámetros. (La mayoría de los modelos tendrán muchos más parámetros que este).
Puede obtener más información sobre el entrenamiento de modelos en Cómo entrenar el modelo.
El objeto de modelo resultante implementa la interfaz ITransformer. Es decir, el modelo transforma los datos de entrada en predicciones.
IDataView predictions = model.Transform(inputData);
Uso del modelo
Puede transformar los datos de entrada en predicciones de forma masiva o una entrada a la vez. El ejemplo del precio de la vivienda hizo lo siguiente: de manera masiva para evaluar el modelo y una a la vez para realizar una nueva predicción. Echemos un vistazo a hacer predicciones individuales.
var size = new HouseData() { Size = 2.5F };
var predEngine = mlContext.CreatePredictionEngine<HouseData, Prediction>(model);
var price = predEngine.Predict(size);
El método CreatePredictionEngine()
toma una clase de entrada y una clase de salida. Los nombres de campo o los atributos de código determinan los nombres de las columnas de datos usadas durante el entrenamiento y la predicción del modelo. Para obtener más información, consulte Realizar predicciones con un modelo entrenado.
Modelos de datos y esquema
En el núcleo de una canalización de aprendizaje automático de ML.NET están los objetos DataView.
Cada transformación de la canalización tiene un esquema de entrada (nombres de datos, tipos y tamaños que la transformación espera ver en su entrada); y un esquema de salida (nombres de datos, tipos y tamaños que produce la transformación después de la transformación).
Si el esquema de salida de una transformación de la canalización no coincide con el esquema de entrada de la siguiente transformación, ML.NET producirá una excepción.
Un objeto de vista de datos tiene columnas y filas. Cada columna tiene un nombre y un tipo y una longitud. Por ejemplo, las columnas de entrada del ejemplo de precio de la vivienda son Tamaño y Precio. Son de tipo Single y son cantidades escalares en lugar de vectores.
ejemplo de vista de datos de
Todos los algoritmos ML.NET buscan una columna de entrada que es un vector. De forma predeterminada, esta columna vectorial se denomina Características. Este es el motivo por el que, en el ejemplo de precios de vivienda, concatenó la columna Tamaño en una nueva columna denominada Características.
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
Todos los algoritmos también crean nuevas columnas después de realizar una predicción. Los nombres fijos de estas nuevas columnas dependen del tipo de algoritmo de aprendizaje automático. Para la tarea de regresión, una de las nuevas columnas se llama Score, como se muestra en el atributo de datos "precio".
public class Prediction
{
[ColumnName("Score")]
public float Price { get; set; }
}
Puede obtener más información sobre las columnas de salida de diferentes tareas de aprendizaje automático en la guía de Machine Learning Tasks.
Una propiedad importante de los objetos DataView es que se evalúan de forma diferida. Las vistas de datos solo se cargan y operan durante el entrenamiento y evaluación del modelo, y la predicción de datos. Mientras escribe y prueba su aplicación ML.NET, puede utilizar el depurador de Visual Studio para echar un vistazo a cualquier objeto de vista de datos llamando al método Preview.
var debug = testPriceDataView.Preview();
Puede ver la variable debug
en el depurador y examinar su contenido.
Nota
No use el método Preview(IDataView, Int32) en el código de producción, ya que reduce significativamente el rendimiento.
Implementación de modelos
En las aplicaciones reales, el código de entrenamiento y evaluación del modelo será independiente de la predicción. De hecho, estas dos actividades suelen realizarse por equipos independientes. El equipo de desarrollo de modelos puede guardar el modelo para usarlo en la aplicación de predicción.
mlContext.Model.Save(model, trainingData.Schema, "model.zip");
Pasos siguientes
- Aprenda a crear aplicaciones mediante diferentes tareas de aprendizaje automático con conjuntos de datos más realistas en los tutoriales de .
- Obtenga información más detallada sobre temas específicos en las guías paso a paso.
- Sumérjase directamente en la documentación de referencia de la API.