Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tutorial ilustra como usar ML.NET para criar um modelo de clustering para o conjunto de dados de flores de íris.
Neste tutorial, você aprenderá como:
- Compreender o problema
- Selecione a tarefa de machine learning apropriada
- Preparar os dados
- Carregar e transformar os dados
- Escolher um algoritmo de aprendizado
- Treinar o modelo
- Usar o modelo para previsões
Pré-requisitos
Compreender o problema
Esse problema é dividir o conjunto de flores de íris em diferentes grupos com base nas características das flores. Esses recursos são o comprimento e a largura de uma sépala e o comprimento e a largura de uma pétala. Para este tutorial, suponha que o tipo de cada flor seja desconhecido. Você deseja aprender a estrutura de um conjunto de dados com base nos recursos e prever como uma instância de dados se encaixa nessa estrutura.
Selecione a tarefa de machine learning apropriada
Como você não sabe a qual grupo cada flor pertence, escolha a tarefa de machine learning não supervisionada . Para dividir um conjunto de dados em grupos de forma que os elementos no mesmo grupo sejam mais semelhantes uns aos outros do que os de outros grupos, use uma tarefa de machine learning de clustering .
Criar um aplicativo de console
Crie um aplicativo de console C# chamado "IrisFlowerClustering". Clique no botão Avançar.
Escolha .NET 8 como a estrutura a ser usada. Clique no botão Criar .
Crie um diretório chamado Dados em seu projeto para armazenar o conjunto de dados e os arquivos de modelo:
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Adicionar>Nova Pasta. Digite "Dados" e selecione Enter.
Instale o pacote NuGet Microsoft.ML :
Observação
Este exemplo usa a versão estável mais recente dos pacotes NuGet mencionados, a menos que indicado de outra forma.
No Gerenciador de Soluções, clique com o botão direito no projeto e escolha Gerenciar Pacotes NuGet. Escolha "nuget.org" como a origem do pacote, selecione a guia Procurar , pesquise Microsoft.ML e selecione Instalar. Selecione o botão OK na caixa de diálogo Alterações de Visualização e, em seguida, selecione o botão I Accept na caixa de diálogo Aceitação da Licença se você concordar com os termos de licença dos pacotes listados.
Preparar os dados
Baixe o conjunto de dados iris.data e salve-o na pasta Dados que você criou na etapa anterior. Para obter mais informações sobre o conjunto de dados de íris, consulte a página Wikipédia do Conjunto de Dados das Flores Íris e a página Conjunto de Dados Íris, que é a fonte do conjunto de dados.
No Gerenciador de Soluções, clique com o botão direito do mouse no arquivo iris.data e selecione Propriedades. Em Avançado, altere o valor de Copiar para Diretório de Saída para Copiar se for mais recente.
O arquivo iris.data contém cinco colunas que representam:
- comprimento das sépalas em centímetros
- largura da sépala em centímetros
- comprimento da pétala em centímetros
- largura da pétala em centímetros
- tipo de flor de íris
Para o exemplo de clustering, este tutorial ignora a última coluna.
Criar classes de dados
Crie classes para os dados de entrada e as previsões:
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e 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 Adicionar.
Adicione a seguinte
usingdiretiva ao novo arquivo: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 arquivo 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 recurso do conjunto de dados. Use o atributo LoadColumn para especificar os índices das colunas de origem no arquivo 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 campos PredictedClusterId e Distances às colunas PredictedLabel e Score, respectivamente. No caso da tarefa de clustering, essas colunas têm o seguinte significado:
- A coluna PredictedLabel contém a ID do cluster previsto.
- A coluna Score contém uma matriz com distâncias euclidianas quadradas para os centroides de cluster. O comprimento da matriz é 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 dados e caminhos de modelo
Volte para o arquivo Program.cs e adicione dois campos para manter os caminhos para o arquivo de conjunto de dados e para o arquivo para salvar o modelo:
-
_dataPathcontém o caminho para o arquivo com o conjunto de dados usado para treinar o modelo. -
_modelPathcontém o caminho para o arquivo em que o modelo treinado é 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 à parte superior do arquivo 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 para logging e pontos de entrada para carregamento de dados, treinamento de modelo, análise preditiva e outras tarefas. Isso é comparável conceitualmente ao uso DbContext no Entity Framework.
Configurar o carregamento de dados
Adicione o seguinte código abaixo para MLContext configurar a maneira de carregar dados:
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
O método de extensão genérico MLContext.Data.LoadFromTextFile infere o esquema do conjunto de dados do tipo fornecido IrisData e retorna IDataView que pode ser usado como entrada para transformadores.
Criar um pipeline de aprendizado
Para este tutorial, o pipeline de aprendizagem da tarefa de clustering inclui as duas etapas seguintes:
- concatenar colunas carregadas em uma coluna Características, que é utilizada por um treinador de clustering;
- use um KMeansTrainer treinador para treinar o modelo usando 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.
Treinar o modelo
As etapas adicionadas nas seções anteriores prepararam o pipeline para treinamento, no entanto, nenhuma foi executada. Adicione a seguinte linha na parte inferior do arquivo para executar o carregamento de dados e o treinamento de modelo:
var model = pipeline.Fit(dataView);
Salvar o modelo
Neste ponto, você tem um modelo que pode ser integrado a qualquer um de seus aplicativos .NET existentes ou novos. Para salvar seu modelo em um arquivo .zip, adicione o seguinte código abaixo chamando 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 usa instâncias do tipo de entrada por meio 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 que você execute uma previsão em uma única instância de dados.
PredictionEngine não é thread-safe. É aceitável usar em ambientes monothread ou de protótipo. Para melhorar o desempenho e a segurança de threads em ambientes de produção, use o PredictionEnginePool serviço, que cria um ObjectPool dos PredictionEngine objetos para uso em todo o aplicativo. Consulte este guia sobre como usar PredictionEnginePool em uma API Web do ASP.NET Core.
Observação
PredictionEnginePool A extensão de serviço está atualmente em versão prévia.
Crie a TestIrisData classe para abrigar instâncias de dados de teste:
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e 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 Adicionar.
Modifique a classe para ser estática como no exemplo a seguir:
static class TestIrisData
Este tutorial apresenta uma instância de dados iris dentro dessa classe. Você 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 para o arquivo Program.cs e adicione o seguinte código na parte inferior do arquivo:
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 distâncias quadradas dessa instância até os centroides de cluster. Seus resultados devem ser semelhantes aos seguintes:
Cluster: 2
Distances: 11.69127 0.02159119 25.59896
Parabéns! Agora você criou com êxito um modelo de aprendizado de máquina para agrupamento de íris e o usou para fazer previsões. Você pode encontrar o código-fonte deste tutorial no repositório GitHub dotnet/samples .
Próximas etapas
Neste tutorial, você aprendeu a:
- Compreender o problema
- Selecione a tarefa de machine learning apropriada
- Preparar os dados
- Carregar e transformar os dados
- Escolher um algoritmo de aprendizado
- Treinar o modelo
- Usar o modelo para previsões
Confira o repositório GitHub do dotnet/machinelearning para continuar aprendendo e encontrando mais exemplos.