Compartir vía


Tutorial: Categorización de flores iris mediante agrupación en clústeres k-means con ML.NET

En este tutorial se muestra cómo usar ML.NET para crear un modelo de agrupación en clústeres para el conjunto de datos de flores iris.

En este tutorial, aprenderá a:

  • Comprender el problema
  • Selección de la tarea de aprendizaje automático adecuada
  • Preparación de los datos
  • Carga y transformación de los datos
  • Elección de un algoritmo de aprendizaje
  • Entrenamiento del modelo
  • Uso del modelo para predicciones

Prerrequisitos

Comprender el problema

Este problema consiste en dividir el conjunto de flores iris en diferentes grupos basados en las características de la flor. Esas características son la longitud y el ancho de un sépalo y la longitud y el ancho de un pétalo. En este tutorial, supongamos que el tipo de cada flor es desconocido. Quiere aprender la estructura de un conjunto de datos a partir de las características y predecir cómo una instancia de datos específica se ajusta a esta estructura.

Selección de la tarea de aprendizaje automático adecuada

Como no sabe a qué grupo pertenece cada flor, elija la tarea de aprendizaje automático no supervisado . Para dividir un conjunto de datos en grupos de tal manera que los elementos del mismo grupo sean más similares entre sí que los de otros grupos, use una tarea de aprendizaje automático de agrupación en clústeres .

Creación de una aplicación de consola

  1. Cree una aplicación de consola de C# denominada "IrisFlowerClustering". Haga clic en el botón Siguiente .

  2. Elija .NET 8 como marco de trabajo que se va a usar. Haga clic en el botón Crear.

  3. Cree un directorio denominado Data en el proyecto para almacenar el conjunto de datos y los archivos de modelo:

    En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>nueva carpeta. Escriba "Datos" y seleccione Entrar.

  4. Instale el paquete NuGet de Microsoft.ML :

    Nota:

    En este ejemplo se usa la versión estable más reciente de los paquetes NuGet mencionados a menos que se indique lo contrario.

    En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Administrar paquetes NuGet. Elija "nuget.org" como origen del paquete, seleccione la pestaña Examinar , busque Microsoft.ML y seleccione Instalar. Seleccione el botón Aceptar en el cuadro de diálogo Vista previa de cambios y, a continuación, seleccione el botón Acepto en el cuadro de diálogo Aceptación de licencia si está de acuerdo con los términos de licencia de los paquetes enumerados.

Preparación de los datos

  1. Descargue el conjunto de datos iris.data y guárdelo en la carpeta Datos que ha creado en el paso anterior. Para obtener más información sobre el conjunto de datos iris, consulte la página de Wikipedia Iris flower data set (Conjunto de datos de la flor iris) y la página Iris Data Set (Conjunto de datos iris), que es la fuente del conjunto de datos.

  2. En el Explorador de soluciones, haga clic con el botón derecho en el archivo iris.data y seleccione Propiedades. En Avanzado, cambie el valor de Copiar al directorio de salida a Copiar si es más reciente.

El archivo iris.data contiene cinco columnas que representan:

  • longitud del sépalo en centímetros
  • ancho del sépalo en centímetros
  • longitud de pétalo en centímetros
  • ancho de pétalo en centímetros
  • tipo de flor de iris

Para el ejemplo de agrupación en clústeres, este tutorial omite la última columna.

Creación de clases de datos

Cree clases para los datos de entrada y las predicciones:

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>nuevo elemento.

  2. En el cuadro de diálogo Agregar nuevo elemento , seleccione Clase y cambie el campo Nombre a IrisData.cs. A continuación, seleccione Agregar.

  3. Agregue la siguiente using directiva al nuevo archivo:

    using Microsoft.ML.Data;
    

Quite la definición de clase existente y agregue el código siguiente, que define las clases IrisData y ClusterPrediction, al archivo IrisData.cs :

public class IrisData
{
    [LoadColumn(0)]
    public float SepalLength;

    [LoadColumn(1)]
    public float SepalWidth;

    [LoadColumn(2)]
    public float PetalLength;

    [LoadColumn(3)]
    public float PetalWidth;
}

public class ClusterPrediction
{
    [ColumnName("PredictedLabel")]
    public uint PredictedClusterId;

    [ColumnName("Score")]
    public float[]? Distances;
}

IrisData es la clase de datos de entrada y tiene definiciones para cada característica del conjunto de datos. Use el atributo LoadColumn para especificar los índices de las columnas de origen en el archivo del conjunto de datos.

La ClusterPrediction clase representa la salida del modelo de agrupación en clústeres aplicado a una IrisData instancia. Use el atributo ColumnName para enlazar los PredictedClusterId campos y Distances a las columnas PredictedLabel y Score respectivamente. En el caso de la tarea de agrupación en clústeres, esas columnas tienen el siguiente significado:

  • La columna PredictedLabel contiene el identificador del clúster previsto.
  • La columna Score contiene un array con distancias euclidianas cuadradas a los centroides de los clústeres. La longitud de la matriz es igual al número de clústeres.

Nota:

Use el float tipo para representar valores de punto flotante en las clases de datos de entrada y predicción.

Definición de rutas de acceso de datos y modelos

Vuelva al archivo Program.cs y agregue dos campos para contener las rutas de acceso al archivo del conjunto de datos y al archivo para guardar el modelo:

  • _dataPath contiene la ruta de acceso al archivo con el conjunto de datos usado para entrenar el modelo.
  • _modelPath contiene la ruta de acceso al archivo donde se almacena el modelo entrenado.

Agregue el código siguiente en las using directivas para especificar esas rutas de acceso:

string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");

Crear contexto de aprendizaje automático

Agregue las siguientes directivas adicionales using a la parte superior del archivo Program.cs :

using Microsoft.ML;
using IrisFlowerClustering;

Reemplace la Console.WriteLine("Hello World!"); línea por el código siguiente:

var mlContext = new MLContext(seed: 0);

La Microsoft.ML.MLContext clase representa el entorno de aprendizaje automático y proporciona mecanismos para registrar y puntos de entrada para la carga de datos, el entrenamiento del modelo, la predicción y otras tareas. Esto es comparable conceptualmente al uso DbContext en Entity Framework.

Configuración de la carga de datos

Agregue el código siguiente debajo de MLContext para configurar la manera de cargar datos:

IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');

El método de extensión genéricoMLContext.Data.LoadFromTextFile infiere el esquema del conjunto de datos del tipo proporcionado IrisData y devuelve IDataView, el cual se puede usar como la entrada para los transformadores.

Creación de una canalización de aprendizaje

En este tutorial, la canalización de aprendizaje de la tarea de agrupación en clústeres consta de dos pasos siguientes:

  • concatenar las columnas cargadas en una columna Características, que utiliza un entrenador de agrupamiento;
  • use un KMeansTrainer instructor para entrenar el modelo mediante el algoritmo de agrupación en clústeres k-means++.

Agregue lo siguiente después de cargar los datos:

string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
    .Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
    .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));

El código especifica que el conjunto de datos debe dividirse en tres clústeres.

Entrenamiento del modelo

Los pasos agregados en las secciones anteriores prepararon la canalización para el entrenamiento; sin embargo, no se ha ejecutado ninguno. Agregue la siguiente línea en la parte inferior del archivo para realizar la carga de datos y el entrenamiento del modelo:

var model = pipeline.Fit(dataView);

Guardar el modelo

En este momento, tiene un modelo que se puede integrar en cualquiera de las aplicaciones de .NET existentes o nuevas. Para guardar su modelo en un archivo .zip, agregue el siguiente código después de llamar al método Fit:

using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
    mlContext.Model.Save(model, dataView.Schema, fileStream);
}

Uso del modelo para predicciones

Para realizar predicciones, use la PredictionEngine<TSrc,TDst> clase que toma instancias del tipo de entrada a través de la canalización del transformador y genera instancias del tipo de salida. Agregue la línea siguiente para crear una instancia de esa clase:

var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);

PredictionEngine es una API útil, que permite realizar una predicción en una sola instancia de datos. PredictionEngine no es seguro para subprocesos. Es aceptable usarlo en entornos de un solo hilo o en prototipos. Para mejorar el rendimiento y la seguridad de los subprocesos en entornos de producción, use el PredictionEnginePool servicio , que crea un ObjectPool de PredictionEngine objetos para su uso en toda la aplicación. Consulte esta guía sobre cómo usar PredictionEnginePool en una API web de ASP.NET Core.

Nota:

PredictionEnginePool la extensión de servicio está actualmente en versión preliminar.

Cree la TestIrisData clase para hospedar instancias de datos de prueba:

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>nuevo elemento.

  2. En el cuadro de diálogo Agregar nuevo elemento , seleccione Clase y cambie el campo Nombre a TestIrisData.cs. A continuación, seleccione Agregar.

  3. Modifique la clase para que sea estática como en el ejemplo siguiente:

    static class TestIrisData
    

En este tutorial se presenta una instancia de datos del iris dentro de esta clase. Puede agregar otros escenarios para experimentar con el modelo. Agregue el código siguiente a la TestIrisData clase :

internal static readonly IrisData Setosa = new IrisData
{
    SepalLength = 5.1f,
    SepalWidth = 3.5f,
    PetalLength = 1.4f,
    PetalWidth = 0.2f
};

Para averiguar el clúster al que pertenece el elemento especificado, vuelva al archivo Program.cs y agregue el código siguiente en la parte inferior del archivo:

var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");

Ejecute el programa para ver qué clúster contiene la instancia de datos especificada y las distancias cuadradas de esa instancia a los centroids del clúster. Los resultados deben ser similares a los siguientes:

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

¡Felicidades! Ahora ha creado con éxito un modelo de aprendizaje automático para el agrupamiento de iris y lo ha utilizado para hacer predicciones. Puede encontrar el código fuente de este tutorial en el repositorio de GitHub dotnet/samples .

Pasos siguientes

En este tutorial, ha aprendido a:

  • Comprender el problema
  • Selección de la tarea de aprendizaje automático adecuada
  • Preparación de los datos
  • Carga y transformación de los datos
  • Elección de un algoritmo de aprendizaje
  • Entrenamiento del modelo
  • Uso del modelo para predicciones

Consulte el repositorio dotnet/machinelearning de GitHub para continuar aprendiendo y encontrar más ejemplos.