Condividi tramite


Esercitazione: Classificare i fiori iris usando il clustering k-means con ML.NET

Questa esercitazione illustra come usare ML.NET per compilare un modello di clustering per il set di dati dei fiori iris.

In questa esercitazione verranno illustrate le procedure per:

  • Informazioni sul problema
  • Selezionare l'attività di apprendimento automatico appropriata
  • Preparare i dati
  • Caricare e trasformare i dati
  • Scegliere un algoritmo di apprendimento
  • Eseguire il training del modello
  • Usare il modello per le stime

Prerequisiti

Informazioni sul problema

Questo problema riguarda il set dei fiori iris in gruppi diversi in base alle caratteristiche dei fiori. Tali caratteristiche sono la lunghezza e la larghezza di un sepalo e la lunghezza e la larghezza di un petalo. Per questa esercitazione, si supponga che il tipo di ogni fiore sia sconosciuto. Si desidera apprendere la struttura di un set di dati dalle caratteristiche e prevedere come un'istanza di dati si adatta a questa struttura.

Selezionare l'attività di apprendimento automatico appropriata

Poiché non si sa a quale gruppo appartenga ciascun fiore, scegliere l'attività di apprendimento automatico senza supervisione. Per dividere un set di dati in gruppi in modo che gli elementi nello stesso gruppo siano più simili tra loro rispetto a quelli di altri gruppi, usare un'attività di apprendimento automatico di clustering.

Creare un'applicazione console

  1. Creare un'applicazione console C# denominata "IrisFlowerClustering". Fare clic sul pulsante Next (Avanti).

  2. Scegliere .NET 6 come framework da usare. Fare clic sul pulsante Crea.

  3. Creare una directory denominata Data nel progetto per archiviare i file del set di dati e del modello:

    In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Aggiungi>Nuova cartella. Digitare "Data" e premere INVIO.

  4. Installare il pacchetto NuGet Microsoft.ML :

    Nota

    In questo esempio viene usata la versione stabile più recente dei pacchetti NuGet menzionati, se non diversamente specificato.

    In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Gestisci pacchetti NuGet. Scegliere "nuget.org" come origine pacchetto, selezionare la scheda Sfoglia , cercare Microsoft.ML e selezionare il pulsante Installa . Selezionare il pulsante OK nella finestra di dialogo Anteprima modifiche e quindi selezionare il pulsante Accetto nella finestra di dialogo Accettazione della licenza se si accettano le condizioni di licenza per i pacchetti elencati.

Preparare i dati

  1. Scaricare il set di dati iris.data e salvarlo nella cartella Dati creata nel passaggio precedente. Per altre informazioni sui set di dati iris, vedere la pagina Dataset Iris di Wikipedia e la pagina Iris Data Set, che rappresenta l'origine del set di dati.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul file iris.data e selezionare Proprietà. In Avanzate modificare il valore di Copia nella directory di output in Copia se più recente.

Il file iris.data contiene cinque colonne che rappresentano:

  • lunghezza del sepale in centimetri
  • larghezza del sepale in centimetri
  • lunghezza dei petali in centimetri
  • Larghezza petali in centimetri
  • tipo di fiore iris

Per l'esempio del clustering, questa esercitazione ignora l'ultima colonna.

Creare classi di dati

Creare le classi per i dati di input e le stime:

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e quindi selezionare Aggiungi>Nuovo elemento.

  2. Nella finestra di dialogo Aggiungi nuovo elemento selezionare Classe e impostare il campo Nome su IrisData.cs. Selezionare quindi il pulsante Aggiungi.

  3. Aggiungere la direttiva using seguente al nuovo file:

    using Microsoft.ML.Data;
    

Rimuovere la definizione di classe esistente e aggiungere il codice seguente, che contiene le classi IrisData e ClusterPrediction, al file 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 è la classe dei dati di input e contiene le definizioni per ogni caratteristica del set di dati. Usare l'attributo LoadColumn per specificare gli indici delle colonne di origine nel file del set di dati.

La classe ClusterPrediction rappresenta l'output del modello di clustering applicato a un'istanza IrisData. Usare l'attributo ColumnName per associare i campi PredictedClusterId e Distances rispettivamente alle colonne PredictedLabel e Score. In caso di attività di clustering, queste colonne hanno il significato seguente:

  • La colonna PredictedLabel include l'ID del cluster stimato.
  • La colonna Score contiene una matrice con le distanze Euclidee quadrate rispetto ai centroidi del cluster. La lunghezza della matrice è uguale al numero di cluster.

Nota

Usare il tipo float per rappresentare i valori a virgola mobile nelle classi di dati di input e di previsione.

Definire i percorsi dei dati e del modello

Tornare al file Program.cs e aggiungere due campi per i percorsi del file dei set di dati e del file per il salvataggio del modello:

  • _dataPath contiene il percorso del file con il set di dati usato per il training del modello.
  • _modelPath contiene il percorso del file in cui è archiviato il modello sottoposto a training.

Aggiungere il codice seguente nelle istruzioni using per specificare tali percorsi:

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

Creare il contesto di Machine Learning

Aggiungere le direttive using seguenti all'inizio del file Program.cs:

using Microsoft.ML;
using IrisFlowerClustering;

Sostituire la Console.WriteLine("Hello World!"); riga con il codice seguente:

var mlContext = new MLContext(seed: 0);

La classe Microsoft.ML.MLContext rappresenta l'ambiente di machine learning (apprendimento automatico) e offre meccanismi per la registrazione e punti di ingresso per il caricamento dei dati, il training del modello, le stime e altre attività. A livello concettuale questa operazione è paragonabile all'uso di DbContext in Entity Framework.

Configurare il caricamento dei dati

Aggiungere il codice seguente sotto MLContext per configurare la modalità di caricamento dei dati:

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

Il metodo di estensione generico MLContext.Data.LoadFromTextFile deduce lo schema del set di dati dal tipo fornito IrisData e restituisce IDataView che può essere usato come input per i trasformatori.

Creare una pipeline di apprendimento

Per questa esercitazione, la pipeline di apprendimento dell'attività di clustering è costituita dai due passaggi seguenti:

  • Concatenare le colonne caricate in un'unica colonna Features, che viene usata da un trainer di clustering;
  • Usare un trainer KMeansTrainer per eseguire il training del modello usando l'algoritmo di clustering k-means++.

Aggiungere quanto segue dopo il caricamento dei dati:

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

Il codice specifica che il set di dati deve essere suddiviso in tre cluster.

Eseguire il training del modello

I passaggi aggiunti nelle sezioni precedenti hanno preparato la pipeline per il training, che tuttavia non è stato eseguito. Aggiungere la riga seguente nella parte inferiore del file per eseguire il caricamento dei dati e il training del modello:

var model = pipeline.Fit(dataView);

Salvare il modello

A questo punto, è disponibile un modello che può essere integrato in tutte le applicazioni .NET nuove o esistenti. Per salvare il modello in un file di .zip, aggiungere il codice seguente sotto chiamando il Fit metodo :

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

Usare il modello per le stime

Per eseguire stime, usare la classe PredictionEngine<TSrc,TDst>, che accetta le istanze del tipo di input tramite la pipeline convertitore e genera istanze del tipo di output. Aggiungere la riga seguente per creare un'istanza di tale classe:

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

PredictionEngine è un'API utile che consente di eseguire una stima su una singola istanza di dati. PredictionEngine non è thread-safe. È accettabile usare in ambienti a thread singolo o prototipo. Per migliorare le prestazioni e la thread safety negli ambienti di produzione, usare il PredictionEnginePool servizio , che crea un ObjectPool oggetto di PredictionEngine oggetti da usare in tutta l'applicazione. Vedere questa guida su come usare PredictionEnginePool in un'API Web di ASP.NET Core.

Nota

L'estensione del servizio PredictionEnginePool è attualmente in anteprima.

Creare la classe TestIrisData per ospitare le istanze dei dati di test:

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e quindi selezionare Aggiungi>Nuovo elemento.

  2. Nella finestra di dialogo Aggiungi nuovo elemento selezionare Classe e impostare il campo Nome su TestIrisData.cs. Selezionare quindi il pulsante Aggiungi.

  3. Modificare la classe in modo da renderla statica, come nell'esempio seguente:

    static class TestIrisData
    

Questa esercitazione presenta un'istanza di dati iris all'interno di questa classe. È possibile aggiungere altri scenari da sperimentare con il modello. Aggiungere il codice seguente nella classe TestIrisData:

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

Per individuare il cluster a cui appartiene l'elemento specificato, tornare al file Program.cs e aggiungere il codice seguente nella parte inferiore del file:

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

Eseguire il programma per vedere quale cluster contiene l'istanza dati specificata e le distanze al quadrato da tale istanza ai centroidi del cluster. I risultati saranno simili ai seguenti:

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

Congratulazioni! È stato creato un modello di apprendimento automatico per il clustering iris, quindi il modello è stato usato per produrre stime. È possibile trovare il codice sorgente per questa esercitazione nel repository GitHub dotnet/samples.

Passaggi successivi

In questa esercitazione sono state illustrate le procedure per:

  • Informazioni sul problema
  • Selezionare l'attività di apprendimento automatico appropriata
  • Preparare i dati
  • Caricare e trasformare i dati
  • Scegliere un algoritmo di apprendimento
  • Eseguire il training del modello
  • Usare il modello per le stime

Visitare il repository GitHub per ottenere altre informazioni ed esempi.