Partilhar via


Tutorial: Categorize as flores de íris usando agrupamento k-means com ML.NET

Este tutorial ilustra como usar ML.NET para construir um modelo de agrupamento para o conjunto de dados da flor de íris.

Neste tutorial, aprenderás como:

  • Entenda o problema
  • Selecione a tarefa de aprendizagem automática apropriada
  • Preparar os dados
  • Carregar e transformar os dados
  • Escolha um algoritmo de aprendizagem
  • Treinar o modelo
  • Usar o modelo para previsões

Pré-requisitos

Entenda o problema

Este problema está relacionado com dividir o conjunto de flores da íris em diferentes grupos com base nas características da flor. Essas características são o comprimento e a largura de um sépala e o comprimento e largura de uma pétala. Para este tutorial, assuma que o tipo de cada flor é desconhecido. Queres aprender a estrutura de um conjunto de dados a partir das características e prever como uma instância de dados se encaixa nessa estrutura.

Selecione a tarefa de aprendizagem automática apropriada

Como não sabes a que grupo pertence cada flor, escolhes a tarefa de aprendizagem automática não supervisionada . Para dividir um conjunto de dados em grupos de forma a que elementos do mesmo grupo sejam mais semelhantes entre si do que aos de outros grupos, use uma tarefa de aprendizagem automática por clustering .

Criar uma aplicação de consola

  1. Crie uma aplicação de consola C# chamada "IrisFlowerClustering". Clique no botão Seguinte.

  2. Escolhe o .NET 8 como framework a usar. Clique no botão Criar .

  3. Crie um diretório chamado 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 no projeto e selecione Adicionar>Nova Pasta. Escreve "Data" e seleciona Enter.

  4. Instale o pacote NuGet Microsoft.ML:

    Observação

    Este exemplo utiliza a versão estável mais recente dos pacotes NuGet mencionados, salvo indicação em contrário.

    No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Gerenciar Pacotes NuGet. Escolhe "nuget.org" como fonte do Pacote, seleciona o separador Explorar , pesquisa por Microsoft.ML e seleciona Instalar. Selecione o botão OK na janela de Pré-visualização de Alterações e depois selecione o botão Aceitar na janela de Aceitação de Licença se concordar com os termos da licença dos pacotes listados.

Preparar os dados

  1. Descarregue o conjunto de dados iris.data e guarde-o na pasta Data que criou na etapa anterior. Para mais informações sobre o conjunto de dados da íris, consulte a página do conjunto de dados da flor da íris na Wikipédia e a página do conjunto de dados da íris , que é a fonte do conjunto de dados.

  2. No Explorador de Soluções, clique com o botão direito no ficheiro iris.data e selecione Propriedades. Em Avançado, altere o valor de Copiar para Diretório de Saída para Cópia, se for mais recente.

O ficheiro iris.data contém cinco colunas que representam:

  • Comprimento da sépala em centímetros
  • Largura dos sépalos em centímetros
  • Comprimento das pétalas em centímetros
  • Largura das pétalas em centímetros
  • tipo de flor de íris

Para efeitos do exemplo do agrupamento, este tutorial ignora a última coluna.

Criar classes de dados

Crie classes para os dados de entrada e as previsões:

  1. No Explorador de Soluções, clique com o botão direito no projeto e depois selecione Adicionar>Novo Item.

  2. Na caixa de diálogo Adicionar Novo Item , selecione Classe e altere o campo Nome para IrisData.cs. Em seguida, selecione Adicionar.

  3. 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 característica do conjunto de dados. Use o atributo LoadColumn para especificar os índices das colunas de origem no ficheiro do conjunto de dados.

A ClusterPrediction classe representa a saída do modelo de clustering aplicado a uma IrisData instância. Use o atributo ColumnName para associar os PredictedClusterId campos e Distances às colunas PredictedLabel e Score , respetivamente. No caso da tarefa de agrupamento, essas colunas têm o seguinte significado:

  • A coluna PredictedLabel contém o ID do cluster previsto.
  • A coluna de pontuação contém um array com distâncias euclidianas ao quadrado aos centróides do cluster. O comprimento do array é igual ao número de clusters.

Observação

Use o float tipo para representar valores de ponto flutuante nas classes de dados de entrada e previsão.

Definir os caminhos dos dados e do modelo

Volte 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 usado para treinar o modelo.
  • _modelPath contém o caminho para o ficheiro onde o modelo treinado está armazenado.

Adicione o seguinte código sob as using diretivas 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 no topo 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 aprendizagem automática e fornece mecanismos para registo e pontos de entrada para carregamento de dados, treino de modelos, previsão e outras tarefas. Isto é comparável conceptualmente à utilização DbContext no Entity Framework.

Configurar carregamento de dados

Adicione o seguinte código abaixo MLContext para configurar a forma de carregar dados:

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

O método genéricoMLContext.Data.LoadFromTextFile de extensão infere o esquema do conjunto de dados a partir do tipo fornecido IrisData e devolveIDataView, que pode ser usado como entrada para transformadores.

Crie um pipeline de aprendizagem

Para este tutorial, o pipeline de aprendizagem da tarefa de clustering é composto por dois passos seguintes:

  • concatenar colunas carregadas numa única coluna Features , que é usada por um treinador de clustering;
  • Use um KMeansTrainer treinador para treinar o modelo usando o algoritmo de clustering K-means++.

Adicione o seguinte após 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.

Treinar o modelo

As etapas adicionadas nas secções anteriores prepararam o pipeline para o treino, no entanto, nenhuma delas foi executada. Adicione a seguinte linha no final do ficheiro para realizar o carregamento de dados e o treino do modelo:

var model = pipeline.Fit(dataView);

Guardar o modelo

Neste momento, tens um modelo que pode ser integrado em qualquer uma das tuas aplicações .NET existentes ou novas. Para guardar o seu modelo num ficheiro .zip, adicione o seguinte código abaixo que chama o Fit método:

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

Usar o modelo para previsões

Para fazer previsões, use a PredictionEngine<TSrc,TDst> classe que recebe 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);

O PredictionEngine é uma API de conveniência, que permite realizar uma previsão sobre uma única instância de dados. PredictionEngine não é seguro para rosca. É aceitável usar em ambientes monofio ou ambientes de protótipo. Para melhorar o desempenho e a segurança das threads em ambientes de produção, use o PredictionEnginePool serviço, que cria um ObjectPool conjunto de PredictionEngine objetos para usar em toda a sua aplicação. Consulte este guia sobre como usar PredictionEnginePool numa API Web Core ASP.NET.

Observação

PredictionEnginePool A extensão do serviço está atualmente em pré-visualização.

Crie a TestIrisData classe para alojar instâncias de dados de teste:

  1. No Explorador de Soluções, clique com o botão direito no projeto e depois selecione Adicionar>Novo Item.

  2. Na caixa de diálogo Adicionar Novo Item , selecione Classe e altere o campo Nome para TestIrisData.cs. Em seguida, selecione Adicionar.

  3. Modifique a classe para ficar estática, como no seguinte exemplo:

    static class TestIrisData
    

Este tutorial apresenta uma instância de dados de íris dentro desta classe. Podes 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 a que cluster pertence o item especificado, 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 qual cluster contém a instância de dados especificada e as distâncias ao quadrado dessa instância até aos centróides do cluster. Os seus resultados devem ser semelhantes aos seguintes:

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

Parabéns! Construíste com sucesso um modelo de aprendizagem de máquina para agrupamento de íris e usaste-o para fazer previsões. Podes encontrar o código-fonte deste tutorial no repositório dotnet/samples do GitHub.

Próximos passos

Neste tutorial, você aprendeu como:

  • Entenda o problema
  • Selecione a tarefa de aprendizagem automática apropriada
  • Preparar os dados
  • Carregar e transformar os dados
  • Escolha um algoritmo de aprendizagem
  • Treinar o modelo
  • Usar o modelo para previsões

Consulta o repositório dotnet/machinelearning do GitHub para continuares a aprender e encontrar mais exemplos.