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
Creare un'applicazione console C# denominata "IrisFlowerClustering". Fare clic sul pulsante Next (Avanti).
Scegliere .NET 6 come framework da usare. Fare clic sul pulsante Crea.
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.
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
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.
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:
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e quindi selezionare Aggiungi>Nuovo elemento.
Nella finestra di dialogo Aggiungi nuovo elemento selezionare Classe e impostare il campo Nome su IrisData.cs. Selezionare quindi il pulsante Aggiungi.
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:
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e quindi selezionare Aggiungi>Nuovo elemento.
Nella finestra di dialogo Aggiungi nuovo elemento selezionare Classe e impostare il campo Nome su TestIrisData.cs. Selezionare quindi il pulsante Aggiungi.
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.