C# Data Science Machine Learning

AutoML (Automated Machine Learning) com ML.Net

Olá pessoal do mundo dos dados, estou de volta após uma breve pausa para cuidar de assuntos diversos. E neste artigo vamos retornar o nosso estudo sobre MLNet, desta vez vamos ver um pouco sobre AutoML, e como utilizar AutoML com ML.Net.

O que é AutoML

O Machine Learning Automatizado (AutoML) é o processo de automatização do fluxo de aplicação de MLMachine Learning a problemas do mundo real. Ele pode cobrir todo o pipeline de construção de Modelos de ML, desde o conjunto de dados bruto até o modelo pronto para ser implantado.

Automatizar o processo de aplicação de Machine Learning de ponta a ponta oferece a vantagem de produzir soluções mais simples através da criação mais rápida de modelos que muitas vezes superam os modelos projetados à mão.

Construir modelos de Machine Learning envolve várias habilidades técnicas, como pré-processamento dos dados, seleção do algoritmo e tunning de hiperparâmetros, todas elas precisam ser dominadas para a elaboração de um modelo que atenda às necessidades do projeto.

AutoML em MLNet

O AutoML do MLNet permite que dado um conjunto de dados, se possa executar um experimento para iterar em diferentes personalizações nos dados, nos algoritmos de Machine Learning e nos hiperparâmetros, de modo a selecionar o melhor modelo.

Dessa maneira os Cientistas de Dados, os Analistas e os desenvolvedores têm a liberdade para criar modelos de ML em alta escala com eficiência e produtividade, ao mesmo tempo em que dão suporte à qualidade do modelo.

Tipos de Tarefas de Machine Learning suportados

O MLNet dá suporte as seguintes tarefas de AutoML:

  • Classificação Binária
  • Classificação Multiclasse
  • Regressão
  • Recomendação
  • Ranking

Problema a ser resolvido

Neste artigo novamente vamos trabalhar com o dataset California Housing Prices do Kaggle. Os seus dados contém informações do censo de 1990 na Califórnia – USA. Ele irá nos ajudar a prever os preços de habitações. Contudo neste estudo nós iremos deixar que o melhor modelo para a solução deste problema seja obtido através do recurso de AutoML  do ML.Net. Então, let’s code!!!

Resolvendo nosso problema com AutoML e ML.Net

Agora iremos para a prática de nosso artigo percorrendo as etapas para a geração do nosso modelo com AutoML e ML.Net.

Instalar os pacotes do NuGet em seu notebook

Agora vamos declarar os pacotes do NuGet que iremos utilizar:

//Instalar os Pacotes do Nuget ML.NET
#r "nuget:Microsoft.ML"
//ML.NET FastTree
#r "nuget:Microsoft.ML.AutomML"

Agora estamos prontos para adicionar o nosso código, então vamos adicionar as instruções de uso:

using System;
using System.IO;
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.AutoML;

using static Microsoft.ML.TrainCatalogBase;
using static Microsoft.ML.DataOperationsCatalog;

Declarar as classes de dados

Agora vamos declarar as classes de entrada da previsão e a classe para o resultado da previsão, serão as classes ModelInput e ModelOutput.

public class ModelInput
{
    [LoadColumn(0)]
    public float Longitude {get; set;}
    [LoadColumn(1)]
    public float Latitude {get; set;}
    [LoadColumn(2)]
    public float Housing_median_age {get; set;}
    [LoadColumn(3)]
    public float Total_rooms {get; set;}
    [LoadColumn(4)]
    public float Total_bedrooms {get; set;}
    [LoadColumn(5)]
    public float Population {get; set;}
    [LoadColumn(6)]
    public float Households {get; set;}
    [public (7)]
    public float Median_income {get; set;}
    [ColumnName("Label"), LoadColumn(8)]
    public float Median_house_value {get; set;}
    [LoadColumn(9)]
    public string Ocean_proximity {get; set;}
}
public class ModelOutput
{
    [ColumnName("Score")]
    public float Score {get; set;}
}

Criar o objeto MLContext e Separação dos Dados

Aqui será criado o objeto MLContext para ser compartilhado entre os objetos de fluxo de trabalho de criação do modelo.

A novidade aqui é que iremos definir uma semente aleatória para tornar os resultados repetíveis/determinísticos diversos treinamentos.

MLContext mlContext = new MLContext(seed: 1);

Como nós já vimos possuímos apenas um único dataset. E por isso vamos chamar o método TrainTestSplit() para configurar um set com 80% dos dados para treinamento e  os 20% restantes para os testes.

private static IDataView trainingDataView;
private static IDataView testingDataView;
IDataView fullData = mlContext.Data.LoadFromTextFile<ModelInput>(path:     
                         housingPath, hasHeader: true,                                                                          
                         separatorChar: ',', allowQuoting: true, allowSparse: false);
DataOperationsCatalog.TrainTestData trainTestData = mlContext.Data.TrainTestSplit(fullData, testFraction: 0.2);
trainingDataView = trainTestData.TrainSet;
testingDataView = trainTestData.TestSet;

Criar o Experimento e definir as suas configurações

Neste momento vamos criar as configurações definindo o seu tempo máximo da experiência em segundos, em seguida criamos a sua métrica de otimização:

var settings = new RegressionExperimentSettings
{
    MaxExperimentTimeInSeconds = ExperimentTime,
    OptimizingMetric = RegressionMetric.MeanAbsoluteError
};

Aqui definiremos a coluna label do experimento.

var labelColumnInfo = new ColumnInformation()
{
    LabelColumnName = "Label"
};

Agora criamos um gerenciador de progresso que permite acompanhar o que está acontecendo no experimento.

var progress = new Progress<RunDetail<RegressionMetrics>>(p =>
{
    if (p.ValidationMetrics != null)
    {    
        Console.WriteLine($"Current Result – TrainerName: {p.TrainerName},  Runtime In Seconds: {p.RuntimeInSeconds:0.##}, RSquared: {p.ValidationMetrics.RSquared:0.##}, MeanAbsoluteError: {p.ValidationMetrics.MeanAbsoluteError:0.##}");
    }
});

Vamos criar e executar o experimento:

var experiment = mlContext.Auto().CreateRegressionExperiment(settings);

Então, temos o resultado da execução do experimentResult:

var experimentResult = experiment.Execute(trainDataView, labelColumnInfo, progressHandler: progress);

Salvar o Modelo em Disco

Portanto, o código abaixo salva o Modelo em disco para permitir sua utilização em outros aplicativos para a previsão:

using (FileStream fs = File.Create(ModelPath))
            mlContext.Model.Save(bestRun.Model, trainDataView.Schema, fs);

Carregar o Modelo do Disco

O código abaixo carrega o Modelo do disco para utilizá-lo em nossas previsões:

ITransformer model = mlContext.Model.Load(modelPath, out var modelInputSchema);
var predEngine = mlContext.Model.CreatePredictionEngine <ModelInput,
                                                         ModelOutput>(model);

Agora vamos preencher um objeto do tipo ModelInput() para realizar uma previsão:

ModelInput sampleData = new ModelInput()
{
    Longitude = -122.23F,
    Latitude = 37.88F,
    Housing_median_age = 41F,
    Total_rooms = 880F,
    Total_bedrooms = 129F,
    Population = 322F,
    Households = 126F,
    Median_income = 8.3252F,
    Ocean_proximity = @"NEAR BAY",
};

E aqui vemos o resultado da previsão:

var resultprediction = predEngine.Predict(sampleData);
Console.WriteLine("Usando o modelo para fazer predição única - Comparando o valor atual de Median_house_value com o valor previsto de para os dados de amostra de Median_house_value ... \n \n");
Console.WriteLine($"Longitude: {sampleData.Longitude}");
Console.WriteLine($"Latitude: {sampleData.Latitude}");
Console.WriteLine($"Housing_median_age: {sampleData.Housing_median_age}");
Console.WriteLine($"Total_rooms: {sampleData.Total_rooms}");
Console.WriteLine($"Total_bedrooms: {sampleData.Total_bedrooms}");
Console.WriteLine($"Population: {sampleData.Population}");
Console.WriteLine($"Households: {sampleData.Households}");
Console.WriteLine($"Median_income: {sampleData.Median_income}");
Console.WriteLine($"Ocean_proximity: {sampleData.Ocean_proximity}");
Console.WriteLine ($"\n \nO Preço previsto para este tamanho é: {resultprediction.Score} \n \n");
Console.WriteLine ("=============== Fim do processo ===============");

Código Fonte do projeto

O código do projeto de AutoML com ML.Net, você pode encontrar no meu github, assim como outros códigos sobre ML.Net. 

AutoML com ML.Net ao Cubo

Então neste artigo nós vimos um pouco sobre os conceitos de AutoML e a sua aplicação prática num exemplo de uso com ML.Net. No nosso exemplo, vimos que podemos escolher a melhor métrica para otimizar o modelo

Neste caso escolhemos o Mean Absolute Error que é o erro médio absoluto, também conhecido como MAE que é uma das muitas métricas para resumir e avaliar a qualidade de um modelo de aprendizado de máquina.

Também foi demonstrado como explorar as métricas dos modelos e vimos que o  modelo escolhido pelo AutoML foi o Fast Tree Regression que é uma implementação de uma árvore de decisão com valores escalares em suas folhas.

O melhor de tudo foi perceber que em nossos artigos anteriores nós utilizamos o algoritmo do SDCA e que para esta métrica de avaliação o AutoML escolheu  Fast Tree Regression.

Espero que vocês tenham gostado do artigo e que possam visualizar o potencial do AutoML 😉

Então, nos veremos em breve num próximo artigo. Mas, caso tenham alguma dúvida ou queiram conversar um pouco mais sobre o assunto não deixem de entrar em contato.

 Referências sobre AutoML com ML.Net

Conteúdos ao Cubo

Por fim, deixo algumas sugestões de conteúdos que você pode encontrar no Dados ao Cubo, sempre falando sobre o mundo dos dados.

Então, finalizo com um convite para você ser Parceiro de Publicação Dados ao Cubo e escrever o próximo artigo, compartilhando conhecimento para toda a comunidade de dados. Mas, não esqueça de assinar a nossa Newsletter para ficar por dentro de todas as novidades. 

Gostou? Compartilhe!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *