Partilhar via


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

  1. Crie uma Aplicação de Consola C# denominada "IrisFlowerClustering". Clique no botão Seguinte .

  2. Selecione .NET 6 como a arquitetura a utilizar. Clique no botão Criar.

  3. 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.

  4. 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

  1. 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.

  2. 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:

  1. Em Explorador de Soluções, clique com o botão direito do rato no projeto e, em seguida, 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 o botão 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 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:

  1. Em Explorador de Soluções, clique com o botão direito do rato no projeto e, em seguida, 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 o botão Adicionar .

  3. 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.