Tutorial: Categorizar as flores da íris com clustering k-means com ML.NET
Este tutorial ilustra como utilizar ML.NET para criar um modelo de clustering para o conjunto de dados flor da íris.
Neste tutorial, ficará a saber como:
- Compreender o problema
- Selecione a tarefa de machine learning adequada
- Preparar os dados
- Carregar e transformar os dados
- Escolher um algoritmo de aprendizagem
- Preparar o modelo
- Utilizar o modelo para predições
Pré-requisitos
Compreender o problema
Este problema é dividir o conjunto de flores de íris em diferentes grupos com base nas características das flores. Estas características são o comprimento e largura de um sepal e o comprimento e largura de uma pétala. Neste tutorial, suponha que o tipo de cada flor é desconhecido. Quer aprender a estrutura de um conjunto de dados a partir das funcionalidades e prever como uma instância de dados se adequa a esta estrutura.
Selecione a tarefa de machine learning adequada
Como não sabe a que grupo cada flor pertence, selecione a tarefa de machine learning não supervisionada . Para dividir um conjunto de dados em grupos de forma a que os elementos no mesmo grupo sejam mais semelhantes uns aos outros do que noutros grupos, utilize uma tarefa de machine learning de clustering .
Criar uma aplicação de consola
Crie uma Aplicação de Consola C# denominada "IrisFlowerClustering". Clique no botão Seguinte .
Selecione .NET 6 como a arquitetura a utilizar. Clique no botão Criar.
Crie um diretório com o nome Dados no seu projeto para armazenar o conjunto de dados e os ficheiros de modelo:
No Explorador de Soluções, clique com o botão direito do rato no projeto e selecione Adicionar>Nova Pasta. Escreva "Dados" e prima Enter.
Instale o pacote NuGet Microsoft.ML :
Nota
Este exemplo utiliza a versão estável mais recente dos pacotes NuGet mencionados, salvo indicação em contrário.
No Explorador de Soluções, clique com o botão direito do rato no projeto e selecione Gerir Pacotes NuGet. Selecione "nuget.org" como origem do pacote, selecione o separador Procurar, procure Microsoft.ML e selecione o botão Instalar . Selecione o botão OK na caixa de diálogo Pré-visualizar Alterações e, em seguida, selecione o botão Aceito na caixa de diálogo Aceitação da Licença se concordar com os termos de licenciamento dos pacotes listados.
Preparar os dados
Transfira o conjunto de dados iris.data e guarde-o na pasta Dados que criou no passo anterior. Para obter mais informações sobre o conjunto de dados da íris, consulte a página Wikipédia do conjunto de dados flor íris e o Conjunto de Dados de Íris , que é a origem do conjunto de dados.
No Explorador de Soluções, clique com o botão direito do rato no ficheiro iris.data e selecione Propriedades. Em Avançadas, altere o valor de Copiar para Diretório de Saída para Copiar se for mais recente.
O ficheiro iris.data contém cinco colunas que representam:
- comprimento do sepal em centímetros
- largura da sepal em centímetros
- comprimento de pétala em centímetros
- largura da pétala em centímetros
- tipo de flor de íris
Por uma questão de exemplo de clustering, este tutorial ignora a última coluna.
Criar classes de dados
Crie classes para os dados de entrada e as predições:
Em Explorador de Soluções, clique com o botão direito do rato no projeto e, em seguida, selecione Adicionar>Novo Item.
Na caixa de diálogo Adicionar Novo Item , selecione Classe e altere o campo Nome para IrisData.cs. Em seguida, selecione o botão Adicionar .
Adicione a seguinte
using
diretiva ao novo ficheiro:using Microsoft.ML.Data;
Remova a definição de classe existente e adicione o seguinte código, que define as classes IrisData
e ClusterPrediction
, ao ficheiro 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
é a classe de dados de entrada e tem definições para cada funcionalidade do conjunto de dados. Utilize o atributo LoadColumn para especificar os índices das colunas de origem no ficheiro do conjunto de dados.
A ClusterPrediction
classe representa o resultado do modelo de clustering aplicado a uma IrisData
instância. Utilize o atributo ColumnName para vincular os PredictedClusterId
campos e Distances
às colunas PredictedLabel e Score , respetivamente. No caso da tarefa de clustering, essas colunas têm o seguinte significado:
- A coluna PredictedLabel contém o ID do cluster previsto.
- A coluna Score contém uma matriz com distâncias euclidianas quadradas para os centroids do cluster. O comprimento da matriz é igual ao número de clusters.
Nota
Utilize o float
tipo para representar valores de vírgula flutuante nas classes de dados de entrada e predição.
Definir caminhos de dados e modelos
Voltar ao ficheiro Program.cs e adicione dois campos para manter os caminhos para o ficheiro do conjunto de dados e para o ficheiro para guardar o modelo:
_dataPath
contém o caminho para o ficheiro com o conjunto de dados utilizado para preparar o modelo._modelPath
contém o caminho para o ficheiro onde o modelo preparado está armazenado.
Adicione o seguinte código nas instruções using para especificar esses caminhos:
string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");
Criar contexto de ML
Adicione as seguintes diretivas adicionais using
à parte superior do ficheiro Program.cs :
using Microsoft.ML;
using IrisFlowerClustering;
Substitua a Console.WriteLine("Hello World!");
linha pelo seguinte código:
var mlContext = new MLContext(seed: 0);
A Microsoft.ML.MLContext classe representa o ambiente de machine learning e fornece mecanismos de registo e pontos de entrada para carregamento de dados, preparação de modelos, predição e outras tarefas. Isto é comparável conceptualmente à utilização DbContext
no Entity Framework.
Configurar o carregamento de dados
Adicione o seguinte código abaixo do MLContext
para configurar a forma de carregar dados:
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
O método de extensão genéricoMLContext.Data.LoadFromTextFile
infere o esquema do conjunto de dados do tipo fornecido IrisData
e devolve IDataView o que pode ser utilizado como entrada para transformadores.
Criar um pipeline de aprendizagem
Para este tutorial, o pipeline de aprendizagem da tarefa de clustering inclui dois passos seguintes:
- concatenar colunas carregadas numa coluna Funcionalidades , que é utilizada por um formador de clustering;
- utilize um KMeansTrainer formador para preparar o modelo com o algoritmo de clustering k-means++.
Adicione o seguinte depois de carregar os dados:
string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));
O código especifica que o conjunto de dados deve ser dividido em três clusters.
Preparar o modelo
Os passos adicionados nas secções anteriores prepararam o pipeline para preparação. No entanto, nenhum foi executado. Adicione a seguinte linha na parte inferior do ficheiro para executar o carregamento de dados e a preparação de modelos:
var model = pipeline.Fit(dataView);
Guardar o modelo
Neste momento, tem um modelo que pode ser integrado em qualquer uma das suas aplicações .NET existentes ou novas. Para guardar o modelo num ficheiro de .zip, adicione o seguinte código abaixo ao chamar o Fit
método :
using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
mlContext.Model.Save(model, dataView.Schema, fileStream);
}
Utilizar o modelo para predições
Para fazer predições, utilize a PredictionEngine<TSrc,TDst> classe que utiliza instâncias do tipo de entrada através do pipeline do transformador e produz instâncias do tipo de saída. Adicione a seguinte linha para criar uma instância dessa classe:
var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);
PredictionEngine é uma API de conveniência, que lhe permite efetuar uma predição numa única instância de dados. PredictionEngine
não é seguro para threads. É aceitável utilizar em ambientes de thread único ou protótipo. Para melhorar o desempenho e a segurança dos threads em ambientes de produção, utilize o PredictionEnginePool
serviço, que cria um ObjectPool
dos PredictionEngine
objetos para utilização em toda a sua aplicação. Veja este guia sobre como utilizar PredictionEnginePool
numa API Web ASP.NET Core.
Nota
PredictionEnginePool
A extensão de serviço está atualmente em pré-visualização.
Crie a TestIrisData
classe para alojar instâncias de dados de teste:
Em Explorador de Soluções, clique com o botão direito do rato no projeto e, em seguida, selecione Adicionar>Novo Item.
Na caixa de diálogo Adicionar Novo Item , selecione Classe e altere o campo Nome para TestIrisData.cs. Em seguida, selecione o botão Adicionar .
Modifique a classe para ser estática, como no exemplo seguinte:
static class TestIrisData
Este tutorial apresenta uma instância de dados de íris nesta classe. Pode adicionar outros cenários para experimentar o modelo. Adicione o seguinte código à TestIrisData
classe :
internal static readonly IrisData Setosa = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
Para descobrir o cluster ao qual o item especificado pertence, volte ao ficheiro Program.cs e adicione o seguinte código na parte inferior do ficheiro:
var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");
Execute o programa para ver que cluster contém a instância de dados especificada e as distâncias quadradas dessa instância para os centroides do cluster. Os seus resultados devem ser semelhantes aos seguintes:
Cluster: 2
Distances: 11.69127 0.02159119 25.59896
Parabéns! Criou com êxito um modelo de machine learning para clustering de íris e utilizou-o para fazer predições. Pode encontrar o código fonte para este tutorial no repositório do GitHub dotnet/samples .
Passos seguintes
Neste tutorial, ficou a saber como:
- Compreender o problema
- Selecione a tarefa de machine learning adequada
- Preparar os dados
- Carregar e transformar os dados
- Escolher um algoritmo de aprendizagem
- Preparar o modelo
- Utilizar o modelo para predições
Consulte o nosso repositório do GitHub para continuar a aprender e encontrar mais exemplos.